加入ADC自动取平均(ADCEXCFG),ADC读数不对?加个延时就好了。
STC8H4K64TL
今天遇到1个ADC读取的问题。
设置,ADCEXCFG,自动多次取平均:测内部1.19V正常,但是测外部ADC,数值一直不对。结果加个延时好了。
实测:ADCEXCFG配置<-到->启动AD转换的时间间隔需加到60ms,读取数值才正常。
ADCEXCFG |= 0x0F;//即16次采样后取平均值,
Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms();
Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms();
Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms();
Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms();
Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms();
Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms();
Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms();
// 启动AD转换
ADC_CONTR |= 0x40; // ADC_START=1
_nop_();
_nop_();
_nop_();
while (!(ADC_CONTR & 0x20)); // 查询ADC完成标志
ADC_CONTR &= ~0x20;// 清完成标志
初始化
//ADC初始化
P_SW2 |= 0x80; //使能访问XFR
ADCTIM = 0x3f; //设置ADC内部时序转换时间选择
P_SW2 &= 0x7f;
ADCCFG = 0x2f; //右对齐,设置ADC时钟为系统时钟/2/16
ADC_CONTR = ADC_CONTR |0X80|8;
解决办法:在没用到ADC_ETR控制脚时,可以提前配置ADCEXCFG
更新后的硬件选项为:
. 系统ISP工作频率: 24.096MHz
. 内部IRC振荡器的频率: 11.064MHz
. 掉电唤醒定时器的频率: 35.625KHz
. 振荡器放大增益使能
. 用户EEPROM大小被设置为 0.5 K
. P3.2和P3.3与下次下载无关
. 上电复位时增加额外的复位延时
. 复位引脚用作普通I/O口
. 检测到低压时复位
. 低压检测门槛电压 : 2.00 V
. 上电复位时,硬件不启动内部看门狗
. 上电自动启动内部看门狗时的预分频数为 : 256
. 空闲状态时看门狗定时器停止计数
. 下次下载用户程序时,将用户EEPROM区一并擦除
. 下次下载用户程序时,没有相关的端口控制485
. 下次下载时不需要校验下载口令
. 内部参考电压: 1191 mV (参考范围: 1100~1300mV)
芯片出厂序列号 : F834C973009963
单片机型号: STC8H4K64TL
. 用户设定频率: 11.059MHz
. 调节后的频率: 11.064MHz ( 主时钟分频系数 = 1; )
. 频率调节误差: 0.043%
我用STC8H8K64U 用以下初始化代码,毫无障碍,
void ADC_init(void)//配置ADCADC转换速率300KSPS
{
ADCEXCFG = 0x07; //开启自动16点平均
ADCCFG &= ~0x0f;
// ADCCFG |= 0x01; //SPEED(1)
ADCCFG |= 0x20; //12位数据右对齐
ADCTIM = 0x38; //CSSETUP(1), CSHOLD(1), SMPDUTY(31)
ADC_CONTR = 0xcf; //使能并启动ADC模块测试内部1.19V
EADC = 1; //开启ADC中断
}未开启滤波时,数据会出现0x05B3~0x05B6,大约3个字的跳动
https://www.stcaimcu.com/data/attachment/forum/202405/06/095503udszm4zxo4ko46m6.png
开启16点滤波后,数据只出现0x05B3、0x05B4,1个字的跳动
https://www.stcaimcu.com/data/attachment/forum/202405/06/095503eir8nb7p8asfxp78.png
开滤波的状态下,用来测量四个通道的心电图效果还不错的
晓飛飛 发表于 2024-10-30 19:29
我用STC8H8K64U 用以下初始化代码,毫无障碍,
未开启滤波时,数据会出现0x05B3~0x05B6,大约3个字的跳动
你这项目高端啊{:5_332:} 晓飛飛 发表于 2024-10-30 19:29
我用STC8H8K64U 用以下初始化代码,毫无障碍,
未开启滤波时,数据会出现0x05B3~0x05B6,大约3个字的跳动
我也是测的测的内部1.19V没问题的。但是测外部电压就有问题了 初始化代码里面的 “P_SW2 &= 0x7f;” 指令删掉。
ADCEXCFG 也是扩展寄存器,你把扩展寄存器访问使能关闭的话对它的设置就无效了。
ADC电源开启后要等待1ms后再进行采集。
此外检测外部电压,在对应的ADC脚并个102~103的小电容试试。 乘风飞扬 发表于 2024-10-31 09:00
初始化代码里面的 “P_SW2 &= 0x7f;” 指令删掉。
ADCEXCFG 也是扩展寄存器,你把扩展寄存器访问使能关闭的 ...
多谢。我有加RC滤波(100k 104电容) ADC DMA自动累加平均超采样程序
https://www.stcaimcu.com/forum.php?mod=redirect&goto=findpost&ptid=2537&pid=19963
页:
[1]