找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1224|回复: 7
打印 上一主题 下一主题
收起左侧

单片机怎么判断某个数据范围?才不会在临界值不稳定,大佬请指教

[复制链接]
跳转到指定楼层
楼主
ID:959051 发表于 2022-7-20 15:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如何判断某个数据范围,且不会被在临界值跳动,造成判断不稳定。比如判断一个温度36.3-36.9,亮起第一个灯,36.9-37.3亮起第二个灯。如果在36.9中间跳动一会,就会出现一下两个灯亮,一下一个灯亮,如何解决这个问题,大佬们帮帮忙提个方案,有示例代码更好。万分感谢!!
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:883242 发表于 2022-7-20 18:10 | 只看该作者
加一段滞回hysteresis呗。超过36.95才亮起第二个灯,低于36.85才亮起第一个灯,并熄灭第二个灯。
回复

使用道具 举报

板凳
ID:161164 发表于 2022-7-20 21:42 | 只看该作者
1. 输入数值滤波后才比较
2. 比较范围加死区。如判断一个温度36.3-36.9,亮起第一个灯,36.9-37.3亮起第二个灯

代码就写为
  1. if(ADC>= 36.4 && ADC <= 36.8)
  2. {
  3.         led1 = On;
  4. }
  5. else
  6. {
  7.         led1 = Off;
  8. }
  9. if(ADC>= 37。0 && ADC <= 37.2)
  10. {
  11.         led2 = On;
  12. }
  13. else
  14. {
  15.         led2 = Off;
  16. }
复制代码




回复

使用道具 举报

地板
ID:401564 发表于 2022-7-20 22:53 | 只看该作者
如果单片机有足够的空间,你又不在乎效率的话,可以参考一下这个,这个是我一个锂电池电量指示函数
你参考一下,大概原理就是电压变化量超过0.05V时才进行比较,不会在临界点来回跳的
//────────────────────────────────────────────
void Battry_Voltage_Disp(float Bat_Voltage)                                                //电池电压处理,用于显示指示灯和自动关机
{                                                                                                                                //Bat_Voltage为当前电池电压
        float a;                                                                                                        //Last_Voltage为全局变量
        a=Bat_Voltage-Last_Voltage;                                                                         //本次电压值和上次电压进行比较
        a=fabs(a);                                                                                                         //绝对值
if(a>0.05)                                                                                         
                        {                               
                                 Last_Voltage=Bat_Voltage;                                                //电池电压变化超过0.05V,保存为上次电压
                                a=Bat_Voltage;
                                if(a<2.9)ON=0;                                                                        //关机电压:2.9V               
                                else if(a<3.35)Flash_light();                                        //指示灯:闪灯                               
                                else if((a>3.35)&&(a<3.55))Red_light();                        //指示灯:红灯                                               
                                else if((a>3.55)&&(a<3.65))Orange_light();                //指示灯:橙灯
                                else         Green_light();                                                        //指示灯:绿灯
                        }
                       
}
//─────────────────────────────────────────────────

回复

使用道具 举报

5#
ID:959051 发表于 2022-7-21 20:29 | 只看该作者
Y_G_G 发表于 2022-7-20 22:53
如果单片机有足够的空间,你又不在乎效率的话,可以参考一下这个,这个是我一个锂电池电量指示函数
你参考一 ...

你好,感谢你江湖救急,谢谢!!想问下 Last_Voltage全局变量数据类型和初始值是多少?另外fabs绝对值是多少?
回复

使用道具 举报

6#
ID:401564 发表于 2022-7-22 07:10 | 只看该作者
guoqiang881245 发表于 2022-7-21 20:29
你好,感谢你江湖救急,谢谢!!想问下 Last_Voltage全局变量数据类型和初始值是多少?另外fabs绝对值是 ...

Last_Voltage为浮点型呀,初始值为0.00
Bat_Voltage为电池电压,是ADC计算好了的浮点型数据
a=Bat_Voltage-Last_Voltage;         //本次电压值和上次电压进行比较
a的值就是本次电压和上次电压的相差值,有正值也有负值,所以进行绝对值运算
变化超过0.05V就进行处理,不然的话,还是上次比较的结果
这个0.05V是可以改的,你调试的时候自己改一下,感觉良好就行
回复

使用道具 举报

7#
ID:359272 发表于 2022-7-22 08:10 | 只看该作者
设置上下阈值,软件模拟一个施密特触发器
回复

使用道具 举报

8#
ID:959051 发表于 2022-7-22 18:38 | 只看该作者
Y_G_G 发表于 2022-7-22 07:10
Last_Voltage为浮点型呀,初始值为0.00
Bat_Voltage为电池电压,是ADC计算好了的浮点型数据
a=Bat_Voltag ...

好的  明白了,很感谢你的讲解
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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