- 打卡等级:常住居民II
- 打卡总天数:95
- 最近打卡:2025-06-17 10:15:05
超级版主
- 积分
- 12731
|
发表于 2025-2-16 16:37:22
|
显示全部楼层
我的计算没有错,你再仔细看,我上面的参数是+1了的,你的设置是:
你设置SETUP=0,则SETUP时钟=1,
你设置CSHOLD=1,则CSHOLD时钟=2,
你设置SMPDUTY = 21,则SMPDUTY时钟为22。
ADC转换时间为12。
所以你的ADC总时间 = (1+2+22+12)=37个ADC时钟。
你的SPEED设置为2,则ADC时钟频率=FOSC/2/3。
建议一下,初始化寄存器时,尽量不要直接给十六进制值,不好读,可以使用我下面的宏定义,容易读懂,最重要的是不容易出错,也不用再取翻看手册寄存器:
/********************** ADC初始化函数 ************************/
#define D_ADC_POWER (1<<7) /* ADC电源,1开启,0关闭 */
#define D_ADC_START (1<<6) /* 启动转换,自动清0 */
#define D_ADC_FLAG (1<<5) /* 完成标志,软件清0 */
#define D_ADC_EPWMT (1<<4) /* 允许PWMA触发ADC */
#define D_ADC_SPEED 5 /* 0~15, ADC时钟 = SYSclk/2/(n+1) */
#define D_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 (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时钟. */
void ADC_config(void)
{
// EAXFR = 1; //SFR enable
P1n_pure_input(1<<CHANNEL); //设置要做ADC的IO做高阻输入
ADC_CONTR = D_ADC_POWER + CHANNEL; //ADC on + channel
ADCCFG = D_RES_FMT + D_ADC_SPEED;
ADCTIM = CSSETUP + CSHOLD + SMPDUTY;
// ADC_START = 1; //启动ADC转换, 完成后自动清零
// ADC_FLAG = 0; //清除ADC完成(中断)标志
// ADC_EPWMT = 1; //允许PWM触发ADC
// EADC = 1; //允许ADC中断
// PADCH = 1; //ADC 中断优先级高位
// PADC = 1; //ADC 中断优先级
}
|
|