- 打卡等级:常住居民II
- 打卡总天数:95
- 最近打卡:2025-06-17 10:15:05
超级版主
- 积分
- 12731
|
发表于 2024-1-11 19:29:33
|
显示全部楼层
ADC的几个参数是可以设置的:
#define ADC_START (1<<6) /* 自动清0 */
#define ADC_FLAG (1<<5) /* 软件清0 */
#define ADC_SPEED 1 /* 0~15, ADC时钟 = SYSclk/2/(n+1) */
#define RES_FMT (1<<5) /* ADC结果格式 0: 左对齐, ADC_RES: D9 D8 D7 D6 D5 D4 D3 D2, ADC_RESL: D1 D0 0 0 0 0 0 0 */
/* 1: 右对齐, ADC_RES: 0 0 0 0 0 0 D9 D8, ADC_RESL: D7 D6 D5 D4 D3 D2 D1 D0 */
#define CSSETUP (0<<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时钟. */
P_SW2 |= 0x80; //访问XSFR
P1n_pure_input(0xff); //设置要做ADC的IO做高阻输入
P3n_pure_input(0x7f); //设置要做ADC的IO做高阻输入
ADC_CONTR = 0x80 + 0; //ADC on + channel
ADCCFG = RES_FMT + ADC_SPEED;
ADCTIM = CSSETUP + CSHOLD + SMPDUTY;
经验上,采样时间不能太短,最好大于等于9个ADC时钟。10位ADC最短一般为22个时钟,12位ADC最短位24个时钟。
由于ADC有大量的模拟器件,所以用最高的速度可能得不到额定的精度(12位ADC精度为略小于1LSB),从我大量的经验来看,要达到12位精度,ADC转换时间(12个ADC时钟)最好在3us以上,我一般最常用的是:ADC时钟为3MHz,ADC转换时间为4us,加上采样等等大约8us。
要高速的,可以参考我的示波器例子,都是500KHz采样的。 |
|