找回密码
 立即注册

QQ登录

只需一步,快速开始

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

交流电充电桩电能计量模块HLW8032程序 STM32单片机

[复制链接]
ID:1053560 发表于 2023-7-9 19:43 | 显示全部楼层 |阅读模式

调试软件

调试软件


  1. #include "stm32f10x.h"
  2. #include <stdbool.h>
  3. #include <stdio.h>
  4. #include "usart3.h"
  5. #include "delay.h"
  6. #include "usart.h"
  7. #include "LED.h"
  8. #include "timer.h"
  9. #include "string.h"
  10. #include "oled.h"
  11. #include "myiic.h"

  12. void Data_Processing(void);

  13. u8 link=0;

  14. u8 k=0;
  15. u16 old_reg=0,len=0;
  16. double V=0,C=0,P=0,E_con=0;
  17. int main(void)
  18. {        
  19.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);         //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
  20.         delay_init();        //延时初始
  21.         LED_Init();        //LED初始化
  22.         uart_init(9600);//串口1初始化
  23.         usart3_init(4800);//HLW8032模块接线方式3.3V--3.3;G--G;T--PB11;P不接
  24.         IIC_Init();
  25.     OLED_Init();//0.96寸接线方式VCC--3.3;GND--G;SCL--PB12;SDA--PB13
  26.         OLED_P8x16Str(35,0,(unsigned char *)"Knight20");
  27.         delay_ms(20);//延时        
  28.         
  29.         printf("Init OK\r\n");
  30.         while(1)
  31.         {               

  32.                 if(USART3_RX_STA&0X8000)//接收到HLW8032一次数据了
  33.                 {        
  34.                         len=USART3_RX_STA&0x3fff;//得到此次接收到的数据长度
  35.                         Data_Processing();
  36.                         USART3_RX_STA=0;                           //启动下一次接收        
  37.                 }
  38.                  delay_ms(50);
  39.                 LED0=!LED0;//STM32系统板自带的指示灯
  40.         }
  41. }

  42. void Data_Processing(void)//电能数据解析
  43. {
  44.         u32 VP_REG=0,V_REG=0,CP_REG=0,C_REG=0,PP_REG=0,P_REG=0,PF_COUNT=0,PF=0,dat_sum=0;
  45.         u8 dat[200];
  46.         u8 i=0;
  47.         if(USART3_RX_BUF[0]!=0xaa&&len==24)//芯片误差修正功能正常,参数正常
  48.         {
  49.                 for(i=2;i<23;i++)
  50.                 {
  51.                         dat_sum=dat_sum+USART3_RX_BUF[i];//计算校验和
  52.                 }
  53.                 if(dat_sum%256==USART3_RX_BUF[23])//检查校验位是否正确
  54.                 {
  55.                         VP_REG=USART3_RX_BUF[2]*65536+USART3_RX_BUF[3]*256+USART3_RX_BUF[4];//计算电压参数寄存器
  56.                         V_REG=USART3_RX_BUF[5]*65536+USART3_RX_BUF[6]*256+USART3_RX_BUF[7];//计算电压寄存器
  57.                         V=(VP_REG/V_REG)*1.88;//计算电压值,1.88为电压系数,根据所采用的分压电阻大小来确定
  58.                         //printf("U:%0.2fV; ",V);
  59.                         
  60.                         CP_REG=USART3_RX_BUF[8]*65536+USART3_RX_BUF[9]*256+USART3_RX_BUF[10];//计算电流参数寄存器
  61.                         C_REG=USART3_RX_BUF[11]*65536+USART3_RX_BUF[12]*256+USART3_RX_BUF[13];//计算电流寄存器
  62.                         C=((CP_REG*100)/C_REG)/100.0;//计算电流值
  63.                         //printf("I:%2.3fA; ",C);
  64.                     sprintf((char *)dat,"U:%0.2fV  I:%2.2fA ",V,C);
  65.                         OLED_P6x8Str(0,3,dat);
  66.                         printf((char *)dat);
  67.                         if(USART3_RX_BUF[0]>0xf0)//判断实时功率是否未溢出
  68.                         {
  69.                                 printf("NO Device!");
  70.                                 OLED_P6x8Str(30,4,"NO Device");
  71.                                 P=0;
  72.                         }
  73.                         else
  74.                         {
  75.                                 PP_REG=USART3_RX_BUF[14]*65536+USART3_RX_BUF[15]*256+USART3_RX_BUF[16];//计算功率参数寄存
  76.                                 P_REG=USART3_RX_BUF[17]*65536+USART3_RX_BUF[18]*256+USART3_RX_BUF[19];//计算功率寄存器
  77.                                 P=(PP_REG/P_REG)*1.88*1;//计算有效功率
  78.                                 sprintf((char *)dat,"P:%0.2fW   ",P);
  79.                                 OLED_P6x8Str(30,4,dat);
  80.                                 printf((char *)dat);
  81.                         }        
  82.                         if((USART3_RX_BUF[20]&0x80)!=old_reg)//判断数据更新寄存器最高位有没有翻转
  83.                         {
  84.                                 k++;
  85.                                 old_reg=USART3_RX_BUF[20]&0x80;
  86.                         }
  87.                         PF=(k*65536)+(USART3_RX_BUF[21]*256)+USART3_RX_BUF[22];//计算已用电量脉冲数
  88.                         PF_COUNT=((100000*3600)/(PP_REG*1.88))*10000;//计算1度电对应的脉冲数量
  89.                         E_con=((PF*10000)/PF_COUNT)/10000.0;//计算已用电量
  90.                         sprintf((char *)dat,"E:%0.4lf kW.h  ",E_con);
  91.                         OLED_P6x8Str(10,5,dat);
  92.                         printf((char *)dat);
  93.                         printf("\r\n");
  94.                         delay_ms(100);
  95.                         memset((void *)USART3_RX_BUF,0,sizeof(USART3_RX_BUF));
  96.                 }
  97.                
  98.         }
  99. }

复制代码
原理图:无
仿真:无
Keil代码下载: STM32F103C8T6驱动HLW8032源代码.7z (202.14 KB, 下载次数: 62)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:149799 发表于 2023-7-10 11:21 | 显示全部楼层
谢谢分享,注释详细。
回复

使用道具 举报

ID:58907 发表于 2023-7-24 08:57 | 显示全部楼层
谢谢分享,注释详细。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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