标题: 单片机怎么判断某个数据范围?才不会在临界值不稳定,大佬请指教 [打印本页]

作者: guoqiang881245    时间: 2022-7-20 15:00
标题: 单片机怎么判断某个数据范围?才不会在临界值不稳定,大佬请指教
如何判断某个数据范围,且不会被在临界值跳动,造成判断不稳定。比如判断一个温度36.3-36.9,亮起第一个灯,36.9-37.3亮起第二个灯。如果在36.9中间跳动一会,就会出现一下两个灯亮,一下一个灯亮,如何解决这个问题,大佬们帮帮忙提个方案,有示例代码更好。万分感谢!!
作者: Hephaestus    时间: 2022-7-20 18:10
加一段滞回hysteresis呗。超过36.95才亮起第二个灯,低于36.85才亮起第一个灯,并熄灭第二个灯。
作者: lkc8210    时间: 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. }
复制代码





作者: Y_G_G    时间: 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();                                                        //指示灯:绿灯
                        }
                       
}
//─────────────────────────────────────────────────


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

你好,感谢你江湖救急,谢谢!!想问下 Last_Voltage全局变量数据类型和初始值是多少?另外fabs绝对值是多少?
作者: Y_G_G    时间: 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是可以改的,你调试的时候自己改一下,感觉良好就行
作者: slf252    时间: 2022-7-22 08:10
设置上下阈值,软件模拟一个施密特触发器
作者: guoqiang881245    时间: 2022-7-22 18:38
Y_G_G 发表于 2022-7-22 07:10
Last_Voltage为浮点型呀,初始值为0.00
Bat_Voltage为电池电压,是ADC计算好了的浮点型数据
a=Bat_Voltag ...

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




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