标题: 单片机ADC每次采样后需要清除结果吗?平均值怎么计算 [打印本页]

作者: yinnan128    时间: 2021-9-24 16:16
标题: 单片机ADC每次采样后需要清除结果吗?平均值怎么计算
本帖最后由 yinnan128 于 2021-9-24 17:02 编辑

       用的是STC15W,现在ADC采样显示的电压浮动很大,锂电3.66V供电SX1308升压到12V,然后用78L05降压到5V给单片机和LCD1602供电,ADC测量锂电池的电压显示3.50-3.74之间跳动,可以使用软件滤波吗,还是这个浮动范围必须用硬件解决。
       ADC每次采样后,下次采样前,寄存器里的结果都需要清零吗?我现在是0.5秒采样一次,没有软件滤波,现在想采样12次,然后去掉一个最高和一个最低电压,程序应该怎么写求平均值呢
       一下是我写的部分程序/*******************************************************************************
* 功  能:初始化ADC
* 描  述:   
*******************************************************************************/
void ADC_init()               
{
P1ASF=0X04;//把P1.2设置为模拟功能
P1M1=0X04;//把P1.2引脚工作模式设为高阻抗
P1M0=0X00;//把P1.2引脚工作模式设为高阻抗
CLK_DIV |= 0x20; //00100000、ADRJ 为 1,ADC_RES 存放高两位结果,ADC_RESL 存放低 8 位结果
ADC_RES=0;//清除高位转换结果寄存器
ADC_RESL=0;//清除低位转换结果寄存器
       
}

/*******************************************************************************
* 功  能:读取ADC
* 描  述:   
*******************************************************************************/
void ADC_duqu()
{
ADC_CONTR = 0x8a;//启动ADC电源和设置P1.2口为ADC输入并且540个时钟转换一次
delay_ms(1);
while(!(ADC_CONTR&0X10));        //等待转换完成
ADC_V=ADC_RES*256+ADC_RESL;     //获取ADC结果
ADC_CONTR&=~0x10;//0x82
}

/*******************************************************************************
* 功  能:ADC平均值
* 描  述: 累加10次平均值  
*******************************************************************************/
void ADC_PingJun()
{
??????
}

/*******************************************************************************
* 功  能:ADC电压转换
* 描  述:   
*******************************************************************************/
void ADC_zhuanhuan()
{
ADC_V=(ADC_V*500/1024)*2;  //500代表参考电压5V
BT_V[0]=ADC_V/100%10+0x30;
BT_V[1]=ADC_V/10%10+0x30;
BT_V[2]=ADC_V%10+0x30;
}


作者: 郑汉松    时间: 2021-9-24 16:48
可以,连续采集20次,给20个数据排序,取中间10数据求平均值
作者: 188610329    时间: 2021-9-24 16:48
STC系列单片机,如果没有 Verf 引脚的话,不管用外部参考基准,还是内部参考基准,都会受到VCC的波动影响,因为,都是在假定VCC 为1023的前提下,给出的测量值,所以,VCC要保证,在获取外部被测值,和获取基准参考值时,电压的绝对稳定,你升压到12V,在用7805降压的话,这个电压,绝对波动的非常厉害。

我比较好奇的是: 你既然用的是 STC15W 系列,为啥不直接锂电给单片机供电?非要搞这么一个升压再降压后的不稳定电压给单片机供电呢?实在是不太理解。
作者: slf252    时间: 2021-9-24 16:53
首先要排除供电异常。然后考虑软件过滤,一介滞后滤波
作者: yinnan128    时间: 2021-9-24 17:00
本帖最后由 yinnan128 于 2021-9-24 17:08 编辑
188610329 发表于 2021-9-24 16:48
STC系列单片机,如果没有 Verf 引脚的话,不管用外部参考基准,还是内部参考基准,都会受到VCC的波动影响, ...

升12V控制10V的MOS管导通,STC15W可以用3.3V,但LCD1602用3.3V点不亮,也需要一个稳定的5V做ADC基准电压
作者: 188610329    时间: 2021-9-24 22:42
yinnan128 发表于 2021-9-24 17:00
升12V控制10V的MOS管导通,STC15W可以用3.3V,但LCD1602用3.3V点不亮,也需要一个稳定的5V做ADC基准电压

你升压再降压之后的5V电压,绝对不如直接锂电池的电压来的,稳定。
你ADC只是为了测量供电的锂电池的话,你单片机用锂电池供电,只需要用ADC去测内部基准电压,得到的值反算1023,就能知道锂电池电压,反而更准确更方便。 最后,你单片机3.3V,LCD1602 5V,完全也是可以的呀,无非多几个上拉电阻,但是,稳定性和可靠性,会比都接那个升压再降压的5V要高很多。
作者: Y_G_G    时间: 2021-9-24 22:42
反正都是STC的,干嘛不换成STC8G的,这个系列内部参考电压是相对稳定的,可以在电压不稳定时通过内部参考电压来计算,引脚也有和15W系列一样的,STC8G系列的还内置了上拉电阻,也可以开机低电平,反正是比15W系列好用,DIY最佳单片机
作者: yinnan128    时间: 2021-9-25 21:14
188610329 发表于 2021-9-24 22:42
你升压再降压之后的5V电压,绝对不如直接锂电池的电压来的,稳定。
你ADC只是为了测量供电的锂电池的话 ...

15W没有内部基准电压,只能外接。经你提示现在也是考虑锂电池降压3.3V给单片机,LCD不变还是12V降5V,这样减小对ADC的影响
作者: yinnan128    时间: 2021-9-25 21:17
Y_G_G 发表于 2021-9-24 22:42
反正都是STC的,干嘛不换成STC8G的,这个系列内部参考电压是相对稳定的,可以在电压不稳定时通过内部参考电压 ...

前段时间STC8G价格太贵,货也不好难,就拿了稳定供货的15W,不知道现在价格和排货什么情况
作者: wulin    时间: 2021-9-25 21:38
本帖最后由 wulin 于 2021-9-25 21:42 编辑

1.STC15W系列典型工作电压范围2.4~5.5V
2.STC15W系列ADC有内部基准电压,ADC的第9通道就是用来测试内部BandGap参考电压的
3.ADC_RES、ADC_RESL不必清除,新数据会覆盖掉原来数据
4.最简单滤波方法是多次取样,取平均值
作者: 188610329    时间: 2021-9-25 22:48
yinnan128 发表于 2021-9-25 21:14
15W没有内部基准电压,只能外接。经你提示现在也是考虑锂电池降压3.3V给单片机,LCD不变还是12V降5V,这 ...

STC15W 有内部基准电压的。
P1ASF  = 0x00;  就是测内部基准电压的,
具体内部基准电压的值可以在ISP上读取,或者,程序内,读取Code 区最末尾的15个关键参考字节,建议直接ISP上通过检测MCU观察后,写入程序。
通过已知的内部基准电压(大约1300mv 左右) *  1023  / 通过P1ASF = 0x00; 测出测量值后,得到的就是你的输入电压(锂电池电压)了。相对要简单很多。
作者: Y_G_G    时间: 2021-9-26 14:01
yinnan128 发表于 2021-9-25 21:17
前段时间STC8G价格太贵,货也不好难,就拿了稳定供货的15W,不知道现在价格和排货什么情况

15W也是有内部参考电压的,也是很稳定的
但是每片的内部参考电压都有所不同,所以,15W是要先用精确的VCC测量好内部参考电压是多少,才能准确的使用,很是麻烦
如果想要稳定的ADC,可以通过2.8V或者3.0V的LDO给单片机供电,增加两个电阻取样,这样的成本增加5毛左右,比增加几块钱的单片机好点
作者: 阿博波    时间: 2021-9-27 20:34
可以用定时器设置采样频率,在规定时间内采样n次再去掉几个最大值最小值后取平均值这就是简单的软件滤波
作者: 语.    时间: 2021-10-4 16:01
直接用冒泡算法




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1