找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: lidong85
打印 上一主题 下一主题
收起左侧

stc8单片机自带ADC值跳动严重,采样数据波动很大

  [复制链接]
41#
ID:382454 发表于 2020-7-15 16:43 | 只看该作者
这样波动正常的很,楼主你用这TL431就注定了波动,怎么搞都没用的,
想要高精度的,必须要用其它的高精度,超低温漂的基准,基准这里用5PPM-15PPM的温漂器件,还有就是DAC供电引脚也要稳定。50PPm的器件,不跳来跳去才怪呢。
另外上楼上很多人都说了,DAC要检测多次,再求和取平均值才对。

回复

使用道具 举报

42#
ID:624769 发表于 2020-12-2 16:43 | 只看该作者
先选ADC通道,再启动ADC试试。
或者直接 ADC_CONTR = 0xc2;  选通道启动一步到位。
TL431 即便不加电容, 应该ADC转换高8位应该也能保持稳定的数值的。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

43#
ID:226055 发表于 2020-12-4 10:20 | 只看该作者
    你的问题不像是来源于硬件,但使用STC8A8K64S4A12单片机确实有几点需要注意:
    1、相对于之前的STC15及更早的单片机系列,STC8A有了ADC电源引脚及参考电压引脚,所以单片机的最大IO口说是单片机总引脚数减去5(之前单片机是减去2,这个2就是VCC和GND)。
    2、STC8A的ADC电源引脚及参考电压引脚必须要接,否则单片机不会正常工作。参考电压引脚接2.5V基准电压没有任何问题,而且这样接只会提高ADC采样的精度。
    3、一定注意ADC引脚带采集信号的电压不要大于STC8A参考电压引脚的电压,即待测信号不要大于2.5V(如果采用的是2.5V电压基准)。
    4、附上一段ADC采集的源码,对采集的结果没有做任何软件滤波的,效果也是刚刚的。
  • /**************************************************************************
  • 功能描述:ADC口初始化
  • 入口参数:无
  • 返回值:无
  • *************************************************************************/  
  • void    ADC_config(void)  
  • {     
  •     ADC_CONTR|=0x80;        //开AD转换电源  
  •     delay_ms(10);           //适当延时等待AD转换供电稳定  
  •     ADC_CONTR|=0x0E;              //选择P0.6作为模拟功能AD使用  
  •     ADC_CONTR&=0xFE;              //选择P0.6作为模拟功能AD使用  
  •       
  •     ADCCFG&=0xFC;             //AD转换速度为416个时钟数转换一次  
  •     ADCCFG|=0x0C;             //AD转换速度为416个时钟数转换一次  
  •     ADC_CONTR&=0xDF;          //清AD转换完成标志  
  •          
  •     EADC=0;                   //禁止ADC转换中断  
  •     ADCCFG|=0x20;             //ADC转换结果ADC_RES存高4位,ADC_RESL存低8位  
  •     ADC_CONTR|=0x40;          //启动AD转换,ADC_START=1  
  • }  
  •   
  • /**************************************
  • 功能描述:ADC口检测AD转换值函数
  • 入口参数:无
  • 返回值:ADC 12位数据
  • ***************************************/  
  • uint16  Get_ADC12bitResult(void)      
  • {  
  •     uint16  AD_Dat=0;  
  •   ADC_CONTR&=0xDF;          // 将ADC_FLAG清0  
  •     ADC_CONTR&=0xBF;        //关闭AD转换,ADC_START=0  
  •     //12位AD结果的高4位放ADC_RES的低4位,低8位在ADC_RESL  
  •     AD_Dat = ADC_RES;              //将ADC_RES低4位移到应在的第9位至第12位  
  •     AD_Dat <<= 8;  
  •     AD_Dat|= ADC_RESL;         //将ADC_RESL的8位移到应在的低8位  
  •       
  •   ADC_CONTR|=0x40;           //启动AD转换,ADC_START=1  
  •     return  AD_Dat;   
  • }  
  •   
  • /***************************************************************************
  • 功能描述:读取ADC采集的原始值
  • 入口参数:无
  • 返回值:实时原始值
  • **************************************************************************/  
  • uint16  HandleADC(void)   
  • {  
  •     uint16 Temp_signal;  
  •    
  •   //读取采集的原始值  
  •     Temp_signal=Get_ADC12bitResult();   
  •   
  •   //返回采集的原始值  
  •     return Temp_signal;   
  • }



   5、再附上ADC的电路图部分及实物图片段,以鉴真相。






回复

使用道具 举报

44#
ID:868198 发表于 2020-12-26 12:31 来自手机 | 只看该作者
公开一个基本经验:AD是高噪声系统,无论怎么设法减少噪声都是无用的,单次采样绝对精度只有高5~6bit,其余低位均被噪声淹没,5%的误差也可以可以,真要保证12bit精度,要求被采信号稳定,采样数次然后算术平均
回复

使用道具 举报

45#
ID:868295 发表于 2020-12-26 15:20 | 只看该作者
STC8A的ADC电源引脚及参考电压引脚必须要接,否则单片机不会正常工作。参考电压引脚接2.5V基准电压没有任何问题,而且这样接只会提高ADC采样的精度。
回复

使用道具 举报

46#
ID:65956 发表于 2020-12-26 16:08 | 只看该作者
我用读内部基准源去换算,就很准啊,就算不用中值虑波法也还可以啊,跳动也就小数点后面第2、3位在一点跳动,还是不错的啊
回复

使用道具 举报

47#
ID:373388 发表于 2020-12-26 16:51 | 只看该作者
基准源是作为基准用的,不能做电源用,输出不了足够的电流驱动负载,引起电压波动
回复

使用道具 举报

48#
ID:996771 发表于 2021-12-25 12:23 | 只看该作者
TL431输出电容接0.1uF肯定是震荡的,自己去查手册的稳定性描述。
431想稳定电容要么小于等于1nF,要么大于10uF。
回复

使用道具 举报

49#
ID:1075277 发表于 2023-5-4 16:17 | 只看该作者
如果我一份代码,ADC采集以后分别10进制输出和16进制输出,发现16进制输出的数据的折线图有突变,就是在一定范围内随机随时跳变一下。但是10进制很正常,10进制折线图很平缓,没有突变,这是为什么啊?
回复

使用道具 举报

50#
ID:1034262 发表于 2023-5-5 11:30 | 只看该作者
任何一个ADC都不会这么差的,何况我用STC8系列的MCU真的是稳如狗,精度高。
楼主最大问题,是碰到问题不用示波器测量一下电源、参考电压、输入电压的纹波。
楼主用的TL431并联104电容,基本上必然自激,示波器一看便知,那么多人分析,说的奥431自激的不多。
431输出2.5V时内阻0.3欧姆,我从里不加电容。只有用于开关电源反馈那样的,TL431处于放大状态,在输出和反馈端要串联合适的RC消振。
回复

使用道具 举报

51#
ID:40861 发表于 2023-5-5 12:20 | 只看该作者
调整好采样间隔时间,并用中值滤波就可以了
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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