找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2269|回复: 2
收起左侧

STM32过欠压检测设备代码

[复制链接]
ID:73370 发表于 2021-9-2 21:45 | 显示全部楼层 |阅读模式
自己写的过欠压检测设备,可累计单次运行时间及总运行时间,也可以进行阈值判断并警报、记录,通过12864显示出来
  1. #include "delay.h"
  2. #include "sys.h"
  3. #include "oled.h"
  4. #include "rtc.h"
  5. #include "key.h"
  6. #include "spi.h"
  7. #include "flash.h"
  8. #include "adc.h"


  9. unsigned char r_sec; //单次老炼 秒
  10. unsigned char r_min; //单次老炼 分
  11. unsigned int r_hor;  //单次老炼 时

  12. unsigned char a_sec; //累积老炼 秒
  13. unsigned char a_min; //累积老炼 分
  14. unsigned int a_hor;  //累积老炼 时

  15. #define N 10 //每通道采10次
  16. #define M 2 //为2个通道

  17. vu16 AD_Value[10][2]; //用来存放ADC转换结果,也是DMA的目标地址
  18. vu16 After_filter[2]; //用来存放求平均值之后的结果
  19. u16 i;

  20. u16 ad1;
  21. u16 ad2;

  22. u32 rcounter;        //RTC运行秒数
  23. u8 Buffer[4] = {0};  //累积老炼总秒数的8位数据缓存数组
  24. u32 acount;          //flash存储的累积老炼秒数
  25. u32 nacount;         //运行时累积老炼秒数

  26. #define SIZE sizeof(Buffer) //缓存数组的大小

  27. u32 count4;

  28. #define temp2 count4%86400  //单天运行的秒数

  29. #define FLASH_SIZE 8*1024*1024  //FLASH字节个数
  30.   
  31. int main(void)
  32. {        
  33.    u8 t;
  34.          u32 count3 = 0;
  35.          u32 count2 = 0;   //运行时与RTC的差值
  36.          u32 count1 = 0;   //运行时RTC的初值
  37.          u8  fcount1 = 0;  //初值锁存标志
  38.          u16 hcur1;
  39.          u8  lcur1;
  40.          u16 hcur2;
  41.          u8  lcur2;
  42.           NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
  43.           delay_init();                     //延时函数初始化          
  44.           KEY_Init();          //开关初始化
  45.           SPI_Flash_Init();    //flash初始化
  46.           Adc_Init();
  47.           DMA_Configuration();
  48.     OLED_Init();         //OLED初始化
  49.     /*****************开机显示字符******************/         
  50.           OLED_ShowString(20,0, "****TEST",16);
  51.          
  52.     OLED_ShowString(0,16, "h:",12);
  53.           OLED_ShowString(12,16,"0000",16);
  54.     OLED_ShowString(56,16, "m:",12);
  55.           OLED_ShowString(68,16,"00",16);
  56.     OLED_ShowString(92,16, "s:",12);
  57.           OLED_ShowString(104,16,"00",16);
  58.              
  59.     OLED_ShowString(0,32, "h:",12);
  60.                 OLED_ShowString(12,32,"0000",16);
  61.     OLED_ShowString(56,32, "m:",12);
  62.                 OLED_ShowString(68,32,"00",16);
  63.     OLED_ShowString(92,32, "s:",12);
  64.                 OLED_ShowString(104,32,"00",16);
  65.          
  66.                 OLED_ShowString(0,48, "u:",12);
  67.                 OLED_ShowString(12,48,"000.0A",16);
  68.                
  69.                 OLED_ShowString(68,48, "d:",12);
  70.                 OLED_ShowString(80,48,"000.0A",16);
  71.                
  72.     OLED_Refresh_Gram();
  73.                
  74.         while(RTC_Init())                //RTC初始化        ,一定要初始化成功                                                                                                 
  75.   {
  76.                 delay_ms(800);
  77.   }
  78.        
  79.         while(SPI_Flash_ReadID()!=W25Q64)//Flash ID检测
  80.         {
  81.                 delay_ms(1800);
  82.   }
  83.        
  84.   SPI_Flash_Read(Buffer,FLASH_SIZE-100,SIZE); //读上次累积的时间
  85.        
  86.   acount = Buffer[0] + Buffer[1]*255 + Buffer[2]*65536 + Buffer[3]*16777216;
  87.   a_sec = ((acount%86400)%3600)%60; //上次老炼秒
  88.         a_min = ((acount%86400)%3600)/60; //上次老炼分
  89.         a_hor = acount/3600;              //上次老炼时
  90.        
  91.         while(1)
  92.         {                                                                    
  93.                
  94.                 filter();
  95.                 ad1 = GetVolt(After_filter[0]);
  96.                 ad2 = GetVolt(After_filter[1]);
  97.                
  98.                 hcur1 = ad1/10;
  99.                 lcur1 = ad1%10;
  100.                
  101.                 hcur2 = ad2/10;
  102.                 lcur2 = ad2%10;
  103.                
  104.                
  105.                 if(KEY0 == 0)                  //判断是否正常运行,0为正常,1为异常
  106.                 {
  107.                         LED0 = 1;
  108.                         if(fcount1 == 0)             //获取此时RTC的值
  109.       {                               
  110.                     count1 = RTC_GetCounter();
  111.                                 delay_ms(500);
  112.         fcount1 = 1;
  113.                         }
  114.       if(fcount1 == 1)
  115.       {                               
  116.                           count2 = rcounter - count1; //获取差值
  117.                        
  118.                           count4 = count3 + count2;
  119.                        
  120.                           nacount = acount + count4;
  121.                        
  122.                           a_sec = ((nacount%86400)%3600)%60; //获取此次累积运行秒
  123.                           a_min = ((nacount%86400)%3600)/60; //获取此次累积运行分
  124.                           a_hor = nacount/3600;                                                         //获取此次累积运行时
  125.                           
  126.                           Buffer[0] = nacount;               
  127.                           Buffer[1] = nacount>>8;
  128.                     Buffer[2] = nacount>>16;
  129.                           Buffer[3] = nacount>>24;
  130.                           
  131.                           SPI_Flash_Write((u8*)Buffer,FLASH_SIZE-100,SIZE); //保存此次累积运行的时间
  132.                        
  133.                                 r_sec = (temp2%3600)%60;  //获取单次运行秒
  134.                                 r_min = (temp2%3600)/60;  //获取单次运行分
  135.                                 r_hor =  count4/3600;     //获取单次运行时
  136.                                 if(r_hor>=999)
  137.                                 {
  138.                                         r_hor = 0;
  139.                                 }
  140.                         }
  141.     }
  142.                
  143.                 else
  144.                 {       
  145.                   fcount1 = 0;
  146.                         count3 = count4;
  147.                         LED0 = 0;//蜂鸣器响;
  148.     }
  149.                
  150.                 if(KEY1 == 0) //单次运行各状态复位
  151.                 {
  152.                         fcount1= 0;
  153.                         count2 = 0;
  154.                         count3 = 0;
  155.                         count4 = 0;
  156.       r_sec = 0;
  157.                   r_min = 0;
  158.                   r_hor = 0;
  159.       acount = Buffer[0] + Buffer[1]*255 + Buffer[2]*65536 + Buffer[3]*16777216;                       
  160.                 }
  161.                
  162.                 if(WK_UP == 1) //累积运行及单次运行各状态复位
  163.                 {
  164.                         acount = 0;
  165.                         nacount = 0;
  166.                         fcount1= 0;
  167.                         count2 = 0;
  168.                         count3 = 0;
  169.                         count4 = 0;
  170.       r_sec = 0;
  171.                   r_min = 0;
  172.                   r_hor = 0;
  173.                         a_sec = 0;
  174.                   a_min = 0;
  175.                   a_hor = 0;
  176.                   Buffer[0] = 0;
  177.                         Buffer[1] = 0;
  178.                         Buffer[2] = 0;
  179.                         Buffer[3] = 0;
  180.                         SPI_Flash_Write(Buffer,FLASH_SIZE-100,SIZE);
  181.     }
  182.                
  183.                 if(t!=calendar.sec) //更新屏幕显示
  184.                 {
  185.                        
  186.                         t = calendar.sec;
  187.                        
  188.                         OLED_ShowNum(12,16,r_hor,4,16);                                                                  
  189.                         OLED_ShowNum(68,16,r_min,2,16);                                                                          
  190.                         OLED_ShowNum(104,16,r_sec,2,16);
  191.                        
  192.                   OLED_ShowNum(12,32,a_hor,4,16);                                                                  
  193.                         OLED_ShowNum(68,32,a_min,2,16);                                                                          
  194.                         OLED_ShowNum(104,32,a_sec,2,16);
  195.                        
  196.                         OLED_ShowNum(12,48,hcur1,3,16);                                                                  
  197.                         OLED_ShowNum(44,48,lcur1,1,16);
  198.                        
  199.                         OLED_ShowNum(80,48,hcur2,3,16);                                                                  
  200.                         OLED_ShowNum(112,48,lcur2,1,16);
  201.                        
  202.                         OLED_Refresh_Gram();
  203.                        
  204.                 }                                                                  
  205.         }                                                                                              
  206. }
复制代码

以上代码下载: 过欠压过流检测设备.rar (348.49 KB, 下载次数: 21)
回复

使用道具 举报

ID:262 发表于 2021-9-8 18:03 | 显示全部楼层
这个是用的什么传感器?原理图能分享一下吗?
回复

使用道具 举报

ID:977059 发表于 2021-11-20 14:37 | 显示全部楼层
分享整套学习下  谢谢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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