找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2847|回复: 8
收起左侧

单片机检测主电源和电池电压程序问题求助

[复制链接]
ID:709761 发表于 2021-9-13 17:00 | 显示全部楼层 |阅读模式
程序每秒检测主电源和电池电压,并发送电量显示指令。
现在的问题是我不想每秒都发送,而是在电量掉一格电有变化时再发送,如何实现。
  1. if(ms500 == 1) //每秒检测电压
  2.          {
  3.             ms500 = 0;
  4.             dy = adc119(10); //电源电压
  5.             dc = adc119(11); //电池电压
  6.              if(dy >= 270||dc >= 270)//主电源或者电池电压超过15V
  7.                                                  {
  8.                                                 
  9.                                                  //超压直接关机
  10.                                                  pwm5 = 0; //关闭充电
  11.                     for(i = 0; i < 9; i++)
  12.                     {
  13.                         UartSend(dc6[i]) ;

  14.                     }//显示电源或电池异常
  15.                                                 
  16.                                                  }
  17.             else if(dy < 25 || dy == 0) //主电源停电,电池供电
  18.             {



  19.                 if(dc >= 228) //电压12.6V 4格电
  20.                 {
  21.                     for(i = 0; i < 9; i++)
  22.                     {
  23.                         UartSend(dc4[i]) ;

  24.                     }
  25.                 }
  26.                 else if(dc >= 220 && dc < 228) //电压12.2V 3格电
  27.                 {
  28.                     for(i = 0; i < 9; i++)
  29.                     {
  30.                         UartSend(dc3[i]) ;

  31.                     }
  32.                 }
  33.                 else if(dc >= 213 && dc < 220) //电压12V 2格电
  34.                 {
  35.                     for(i = 0; i < 9; i++)
  36.                     {
  37.                         UartSend(dc2[i]) ;

  38.                     }
  39.                 }
  40.                 else if(dc >= 207 && dc < 213) //电压11.6V 1格电
  41.                 {
  42.                     for(i = 0; i < 9; i++)
  43.                     {
  44.                         UartSend(dc1[i]) ;

  45.                     }
  46.                 }
  47.                                                                
  48.                                                                 else if(dc < 200) //电池电压低于11V  欠压关机
  49.                 {
  50.                     //                                                T4T3M &= ~0x08;                //关闭定时器3 防止再次检测发送
  51.                     gpwm34();//关闭DDS
  52.                     for(i = 0; i < 9; i++)
  53.                     {
  54.                         UartSend(gj9[i]) ; //发给主单片机发送关机指令 9字节
  55.                     }

  56.                     //等待串口接收主单片机发来关机指令
  57.                 }
  58.             }

  59.             else if(dy>216&&dy <270) //主电源有电时  12V到15V之间
  60.             {


  61.                 if(dc == 0 || dc < 100) //电池电压为0或者小于6V
  62.                 {
  63.                     pwm5 = 0; //关闭充电
  64.                     for(i = 0; i < 9; i++)
  65.                     {
  66.                         UartSend(dc6[i]) ;

  67.                     }//显示电池异常
  68.                 }

  69.                 else if (dc >= 162&&dc<dy) //电池电压大于等于9V 小于主电源电压

  70.                 {

  71.                     pwm5 = 1; //打开充电
  72.                     for(i = 0; i < 9; i++)
  73.                     {
  74.                         UartSend(dc5[i]) ;

  75.                     } //显示充电中
  76.                                                                         }
  77.                                                                 else if(dc>dy)////电池电压大于主电源电压
  78.                                                                         {
  79.                                                                         
  80.                     pwm5 = 0; //关闭充电
  81.                     for(i = 0; i < 9; i++)
  82.                     {
  83.                         UartSend(dc6[i]) ;

  84.                     }//显示电池异常
  85.                                                                          }



  86.             }
复制代码

回复

使用道具 举报

ID:624769 发表于 2021-9-13 17:47 | 显示全部楼层
做一个变量, 保存上一次测量时的 档位, 周期执行 判断当前档位是否比变量保存的档位 低,
是的话:发送, 并且记录新的档位到变量,  反之,啥也不干。
回复

使用道具 举报

ID:709761 发表于 2021-9-14 09:27 | 显示全部楼层
人工置顶下
回复

使用道具 举报

ID:123289 发表于 2021-9-14 15:17 | 显示全部楼层
脑子怎么想的?
发送前识别一下电压,而后再发,不就OK了吗?
回复

使用道具 举报

ID:624769 发表于 2021-9-14 15:53 | 显示全部楼层
yzwzfyz 发表于 2021-9-14 15:17
脑子怎么想的?
发送前识别一下电压,而后再发,不就OK了吗?

他在等人给他代码。
回复

使用道具 举报

ID:709761 发表于 2021-9-14 17:23 | 显示全部楼层
188610329 发表于 2021-9-14 15:53
他在等人给他代码。

不懂什么意思,最好有代码示范
回复

使用道具 举报

ID:161164 发表于 2021-9-14 23:54 | 显示全部楼层
李冬 发表于 2021-9-14 17:23
不懂什么意思,最好有代码示范

示范来了~

  1. if(dc >= 228) //电压12.6V 4格电
  2. {
  3.         Voltage_Mode = 4;
  4. }
  5. else if(dc >= 220 && dc < 228) //电压12.2V 3格电
  6. {
  7.         Voltage_Mode = 3;
  8. }






  9. if(Voltage_Mode != Voltage_Mode_Old)
  10. {
  11.         switch(Voltage_Mode)
  12.         {
  13.                 。
  14.                 。
  15.                 。
  16.                 case 3:               
  17.                         for(i = 0; i < 9; i++)
  18.                         {
  19.                                 UartSend(dc3[i]) ;
  20.                         }
  21.                 break;
  22.                 case 4:               
  23.                         for(i = 0; i < 9; i++)
  24.                         {
  25.                                 UartSend(dc4[i]) ;
  26.                         }
  27.                 break;
  28.                 。
  29.                 。
  30.                 。
  31.         }
  32.         Voltage_Mode_Old = Voltage_Mode;
  33. }
复制代码
回复

使用道具 举报

ID:420836 发表于 2021-9-15 07:52 | 显示全部楼层
程序会不断检查来自每个源的电压,并循环检查电压是否低于阈值设置。 然后决定是否应该发送电压值。
回复

使用道具 举报

ID:709761 发表于 2021-9-15 08:05 | 显示全部楼层

感谢您的指点。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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