- 打卡等级:常住居民III
- 打卡总天数:107
- 最近打卡:2025-06-29 17:17:29
超级版主
- 积分
- 12946
|
发表于 2025-6-5 10:48:04
|
显示全部楼层
“大佬们的视频里面都提到adc采样速度越慢越精准”,这说法不全面,不是绝对的。
ADC里面有模拟比较器,模拟器件都有带宽,其带宽限制了速度,ADC的速度过快,确实会影响精度。
但是当速度低于比较器的带宽,则再降低速度也不会影响精度。
对于STC的8系列、32系列、8051u系列,当MCU工作于5V,ADC时钟为5MHz以下就能保证精度。
除非确实需要很快(比如简易示波器的采样),否则我大部分的应用ADC时钟都是3MHz。
ADC转换的时间由下面的项组成:
//==================== 常规设置 =============================================
#define FOSC 24000000UL /* 定义主时钟 */
#define ADC_SPEED 3 /* 0~15, ADC时钟 = SYSclk/2/(n+1) */
#define CSSETUP (1<<7) /* 0~1, ADC通道选择时间 0: 1个ADC时钟, 1: 2个ADC时钟, 默认0(默认1个ADC时钟) */
#define CSHOLD (1<<5) /* 0~3, ADC通道选择保持时间 (n+1)个ADC时钟, 默认1(默认2个ADC时钟) */
#define SMPDUTY 20 /* 10~31, ADC模拟信号采样时间 (n+1)个ADC时钟, 默认10(默认11个ADC时钟) */
/* ADC转换时间: 10位ADC固定为10个ADC时钟, 12位ADC固定为12个ADC时钟. */
上面是我常用的速度参数,ADC时钟为 24/2/(3+1) = 3MHz.
10位ADC时钟 = 2+2+21+10 = 35,35/3=11.7us。
12位ADC时钟 = 2+2+21+12 = 37,37/3=12.3us。
//==================== 最慢设置 =============================================
如果要设置为最慢,则各个参数都设置为最大值:
#define FOSC 6000000UL /* 定义主时钟 */
#define ADC_SPEED 15 /* 0~15, ADC时钟 = SYSclk/2/(n+1) */
#define CSSETUP (1<<7) /* 0~1, ADC通道选择时间 0: 1个ADC时钟, 1: 2个ADC时钟, 默认0(默认1个ADC时钟) */
#define CSHOLD (1<<5) /* 0~3, ADC通道选择保持时间 (n+1)个ADC时钟, 默认1(默认2个ADC时钟) */
#define SMPDUTY 31 /* 10~31, ADC模拟信号采样时间 (n+1)个ADC时钟, 默认10(默认11个ADC时钟) */
/* ADC转换时间: 10位ADC固定为10个ADC时钟, 12位ADC固定为12个ADC时钟. */
ADC时钟为 6/2/(15+1) = 0.1875MHz.
10位ADC时钟 = 2+2+32+10 = 46,46/0.1875=245us。
12位ADC时钟 = 2+2+32+12 = 48,48/0.1875=256us。
//==================== 最快设置 =============================================
如果要设置为最快,则各个参数都设置为最小值(但SMPDUTY最小值为9):
#define FOSC 40000000UL /* 定义主时钟 */
#define ADC_SPEED 0 /* 0~15, ADC时钟 = SYSclk/2/(n+1) */
#define CSSETUP (0<<7) /* 0~1, ADC通道选择时间 0: 1个ADC时钟, 1: 2个ADC时钟, 默认0(默认1个ADC时钟) */
#define CSHOLD (0<<5) /* 0~3, ADC通道选择保持时间 (n+1)个ADC时钟, 默认1(默认2个ADC时钟) */
#define SMPDUTY 9 /* 10~31, ADC模拟信号采样时间 (n+1)个ADC时钟, 默认10(默认11个ADC时钟) */
/* ADC转换时间: 10位ADC固定为10个ADC时钟, 12位ADC固定为12个ADC时钟. */
ADC时钟为 40/2/(0+1) = 20MHz.
10位ADC时钟 = 1+1+10+10 = 22,22/20=1.1us。
12位ADC时钟 = 1+1+10+12 = 24,24/20=1.2us。
特别提醒:上述ADC转换时间,是在触发ADC转换再过一个ADC时钟后开始的,直到ADC结束的时间,并不包括进中断(如果允许的话)、读取数据、清除标志的时间,所以执行这些操作,还要加上一点时间。如果使用DMA,则能缩短取数时间。
|
|