找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2699|回复: 13
收起左侧

单片机ADC每次采样后需要清除结果吗?平均值怎么计算

  [复制链接]
ID:608872 发表于 2021-9-24 16:16 | 显示全部楼层 |阅读模式
本帖最后由 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;
}

回复

使用道具 举报

ID:514901 发表于 2021-9-24 16:48 | 显示全部楼层
可以,连续采集20次,给20个数据排序,取中间10数据求平均值
回复

使用道具 举报

ID:624769 发表于 2021-9-24 16:48 | 显示全部楼层
STC系列单片机,如果没有 Verf 引脚的话,不管用外部参考基准,还是内部参考基准,都会受到VCC的波动影响,因为,都是在假定VCC 为1023的前提下,给出的测量值,所以,VCC要保证,在获取外部被测值,和获取基准参考值时,电压的绝对稳定,你升压到12V,在用7805降压的话,这个电压,绝对波动的非常厉害。

我比较好奇的是: 你既然用的是 STC15W 系列,为啥不直接锂电给单片机供电?非要搞这么一个升压再降压后的不稳定电压给单片机供电呢?实在是不太理解。
回复

使用道具 举报

ID:359272 发表于 2021-9-24 16:53 | 显示全部楼层
首先要排除供电异常。然后考虑软件过滤,一介滞后滤波
回复

使用道具 举报

ID:608872 发表于 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基准电压
回复

使用道具 举报

ID:624769 发表于 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要高很多。
回复

使用道具 举报

ID:401564 发表于 2021-9-24 22:42 | 显示全部楼层
反正都是STC的,干嘛不换成STC8G的,这个系列内部参考电压是相对稳定的,可以在电压不稳定时通过内部参考电压来计算,引脚也有和15W系列一样的,STC8G系列的还内置了上拉电阻,也可以开机低电平,反正是比15W系列好用,DIY最佳单片机
回复

使用道具 举报

ID:608872 发表于 2021-9-25 21:14 | 显示全部楼层
188610329 发表于 2021-9-24 22:42
你升压再降压之后的5V电压,绝对不如直接锂电池的电压来的,稳定。
你ADC只是为了测量供电的锂电池的话 ...

15W没有内部基准电压,只能外接。经你提示现在也是考虑锂电池降压3.3V给单片机,LCD不变还是12V降5V,这样减小对ADC的影响
回复

使用道具 举报

ID:608872 发表于 2021-9-25 21:17 | 显示全部楼层
Y_G_G 发表于 2021-9-24 22:42
反正都是STC的,干嘛不换成STC8G的,这个系列内部参考电压是相对稳定的,可以在电压不稳定时通过内部参考电压 ...

前段时间STC8G价格太贵,货也不好难,就拿了稳定供货的15W,不知道现在价格和排货什么情况
回复

使用道具 举报

ID:213173 发表于 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.最简单滤波方法是多次取样,取平均值
回复

使用道具 举报

ID:624769 发表于 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; 测出测量值后,得到的就是你的输入电压(锂电池电压)了。相对要简单很多。
回复

使用道具 举报

ID:401564 发表于 2021-9-26 14:01 | 显示全部楼层
yinnan128 发表于 2021-9-25 21:17
前段时间STC8G价格太贵,货也不好难,就拿了稳定供货的15W,不知道现在价格和排货什么情况

15W也是有内部参考电压的,也是很稳定的
但是每片的内部参考电压都有所不同,所以,15W是要先用精确的VCC测量好内部参考电压是多少,才能准确的使用,很是麻烦
如果想要稳定的ADC,可以通过2.8V或者3.0V的LDO给单片机供电,增加两个电阻取样,这样的成本增加5毛左右,比增加几块钱的单片机好点
回复

使用道具 举报

ID:968695 发表于 2021-9-27 20:34 | 显示全部楼层
可以用定时器设置采样频率,在规定时间内采样n次再去掉几个最大值最小值后取平均值这就是简单的软件滤波
回复

使用道具 举报

ID:637144 发表于 2021-10-4 16:01 来自手机 | 显示全部楼层
直接用冒泡算法
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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