找回密码
 立即注册
查看: 461|回复: 6

加入ADC自动取平均(ADCEXCFG),ADC读数不对?加个延时就好了。

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2024-10-31 08:51:49

5

主题

16

回帖

133

积分

注册会员

积分
133
发表于 2024-10-30 18:49:37 | 显示全部楼层 |阅读模式

STC8H4K64TL

今天遇到1个ADC读取的问题。
设置,ADCEXCFG,自动多次取平均:测内部1.19V正常,但是测外部ADC,数值一直不对。结果加个延时好了。
实测:ADCEXCFG配置<-到->启动AD转换的时间间隔加到60ms,读取数值才正常。
  1. ADCEXCFG |= 0x0F;//即16次采样后取平均值,
  2.   Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms();
  3.   Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms();
  4.   Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms();
  5.   Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms();
  6.   Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms();
  7.   Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms();
  8.   Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms(); Delay1ms();
  9. // 启动AD转换
  10.     ADC_CONTR |= 0x40; // ADC_START=1
  11.     _nop_();
  12.     _nop_();
  13.     _nop_();
  14. while (!(ADC_CONTR & 0x20)); // 查询ADC完成标志
  15.     ADC_CONTR &= ~0x20;  // 清完成标志
复制代码

初始化
  1. //ADC初始化
  2.     P_SW2 |= 0x80;   //使能访问XFR
  3.     ADCTIM = 0x3f;                              //设置ADC内部时序  转换时间选择
  4.     P_SW2 &= 0x7f;
  5.     ADCCFG = 0x2f;                              //右对齐,设置ADC时钟为系统时钟/2/16
  6.         ADC_CONTR = ADC_CONTR |0X80|8;        
复制代码

解决办法:在没用到ADC_ETR控制脚时,可以提前配置ADCEXCFG
adcexcfg.png

  1. 更新后的硬件选项为:
  2.   . 系统ISP工作频率: 24.096MHz
  3.   . 内部IRC振荡器的频率: 11.064MHz
  4.   . 掉电唤醒定时器的频率: 35.625KHz
  5.   . 振荡器放大增益使能
  6.   . 用户EEPROM大小被设置为 0.5 K
  7.   . P3.2和P3.3与下次下载无关
  8.   . 上电复位时增加额外的复位延时
  9.   . 复位引脚用作普通I/O口
  10.   . 检测到低压时复位
  11.   . 低压检测门槛电压 : 2.00 V
  12.   . 上电复位时,硬件不启动内部看门狗
  13.   . 上电自动启动内部看门狗时的预分频数为 : 256
  14.   . 空闲状态时看门狗定时器停止计数
  15.   . 下次下载用户程序时,将用户EEPROM区一并擦除
  16.   . 下次下载用户程序时,没有相关的端口控制485
  17.   . 下次下载时不需要校验下载口令
  18.   . 内部参考电压: 1191 mV (参考范围: 1100~1300mV)
  19. 芯片出厂序列号 : F834C973009963
  20.   单片机型号: STC8H4K64TL
  21.   . 用户设定频率: 11.059MHz
  22.   . 调节后的频率: 11.064MHz ( 主时钟分频系数 = 1; )
  23.   . 频率调节误差: 0.043%
复制代码




回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:417
  • 最近打卡:2025-04-30 21:39:09
已绑定手机

34

主题

2096

回帖

2206

积分

荣誉版主

积分
2206
发表于 2024-10-30 19:29:18 | 显示全部楼层
我用STC8H8K64U 用以下初始化代码,毫无障碍,
  1. void ADC_init(void)//配置ADC  ADC转换速率300KSPS
  2. {
  3.         ADCEXCFG = 0x07;                //开启自动16点平均
  4.         ADCCFG &= ~0x0f;
  5. //        ADCCFG |= 0x01;                        //SPEED(1)
  6.         ADCCFG |= 0x20;                        //12位数据右对齐
  7.         ADCTIM = 0x38;                        //CSSETUP(1), CSHOLD(1), SMPDUTY(31)       
  8.         ADC_CONTR = 0xcf;       //使能并启动ADC模块  测试内部1.19V
  9.         EADC = 1;                                //开启ADC中断
  10. }
复制代码
未开启滤波时,数据会出现0x05B3~0x05B6,大约3个字的跳动


开启16点滤波后,数据只出现0x05B3、0x05B4,1个字的跳动

开滤波的状态下,用来测量四个通道的心电图效果还不错的
截图202410301928384631.jpg




睁开眼睛做场梦~~~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2024-10-31 08:51:49

5

主题

16

回帖

133

积分

注册会员

积分
133
发表于 2024-10-31 08:48:01 | 显示全部楼层
晓*** 发表于 2024-10-30 19:29
我用STC8H8K64U 用以下初始化代码,毫无障碍,
未开启滤波时,数据会出现0x05B3~0x05B6,大约3个字的跳动

你这项目高端啊{:5_332:}
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2024-10-31 08:51:49

5

主题

16

回帖

133

积分

注册会员

积分
133
发表于 2024-10-31 08:50:58 | 显示全部楼层
晓*** 发表于 2024-10-30 19:29
我用STC8H8K64U 用以下初始化代码,毫无障碍,
未开启滤波时,数据会出现0x05B3~0x05B6,大约3个字的跳动

我也是测的测的内部1.19V没问题的。但是测外部电压就有问题了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6841

积分

论坛元老

积分
6841
发表于 2024-10-31 09:00:03 | 显示全部楼层
初始化代码里面的 “P_SW2 &= 0x7f;” 指令删掉。
ADCEXCFG 也是扩展寄存器,你把扩展寄存器访问使能关闭的话对它的设置就无效了。
ADC电源开启后要等待1ms后再进行采集。
此外检测外部电压,在对应的ADC脚并个102~103的小电容试试。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2024-10-31 08:51:49

5

主题

16

回帖

133

积分

注册会员

积分
133
发表于 2024-10-31 09:25:37 | 显示全部楼层
乘风*** 发表于 2024-10-31 09:00
初始化代码里面的 “P_SW2 &= 0x7f;” 指令删掉。
ADCEXCFG 也是扩展寄存器,你把扩展寄存器访问使能关闭的 ...

多谢。  我有加RC滤波(100k   104电容)
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2024-10-31 09:45:51 | 显示全部楼层
ADC DMA自动累加平均超采样程序
https://www.stcaimcu.com/forum.p ... =2537&pid=19963
DebugLab
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 08:52 , Processed in 0.216792 second(s), 95 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表