標(biāo)題:
交流電充電樁電能計(jì)量模塊HLW8032程序 STM32單片機(jī)
[打印本頁]
作者:
winsssss
時(shí)間:
2023-7-9 19:43
標(biāo)題:
交流電充電樁電能計(jì)量模塊HLW8032程序 STM32單片機(jī)
無標(biāo)題.jpg
(96.79 KB, 下載次數(shù): 39)
下載附件
調(diào)試軟件
2023-7-9 19:41 上傳
#include "stm32f10x.h"
#include <stdbool.h>
#include <stdio.h>
#include "usart3.h"
#include "delay.h"
#include "usart.h"
#include "LED.h"
#include "timer.h"
#include "string.h"
#include "oled.h"
#include "myiic.h"
void Data_Processing(void);
u8 link=0;
u8 k=0;
u16 old_reg=0,len=0;
double V=0,C=0,P=0,E_con=0;
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級(jí),2位響應(yīng)優(yōu)先級(jí)
delay_init(); //延時(shí)初始
LED_Init(); //LED初始化
uart_init(9600);//串口1初始化
usart3_init(4800);//HLW8032模塊接線方式3.3V--3.3;G--G;T--PB11;P不接
IIC_Init();
OLED_Init();//0.96寸接線方式VCC--3.3;GND--G;SCL--PB12;SDA--PB13
OLED_P8x16Str(35,0,(unsigned char *)"Knight20");
delay_ms(20);//延時(shí)
printf("Init OK\r\n");
while(1)
{
if(USART3_RX_STA&0X8000)//接收到HLW8032一次數(shù)據(jù)了
{
len=USART3_RX_STA&0x3fff;//得到此次接收到的數(shù)據(jù)長(zhǎng)度
Data_Processing();
USART3_RX_STA=0; //啟動(dòng)下一次接收
}
delay_ms(50);
LED0=!LED0;//STM32系統(tǒng)板自帶的指示燈
}
}
void Data_Processing(void)//電能數(shù)據(jù)解析
{
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;
u8 dat[200];
u8 i=0;
if(USART3_RX_BUF[0]!=0xaa&&len==24)//芯片誤差修正功能正常,參數(shù)正常
{
for(i=2;i<23;i++)
{
dat_sum=dat_sum+USART3_RX_BUF[i];//計(jì)算校驗(yàn)和
}
if(dat_sum%256==USART3_RX_BUF[23])//檢查校驗(yàn)位是否正確
{
VP_REG=USART3_RX_BUF[2]*65536+USART3_RX_BUF[3]*256+USART3_RX_BUF[4];//計(jì)算電壓參數(shù)寄存器
V_REG=USART3_RX_BUF[5]*65536+USART3_RX_BUF[6]*256+USART3_RX_BUF[7];//計(jì)算電壓寄存器
V=(VP_REG/V_REG)*1.88;//計(jì)算電壓值,1.88為電壓系數(shù),根據(jù)所采用的分壓電阻大小來確定
//printf("U:%0.2fV; ",V);
CP_REG=USART3_RX_BUF[8]*65536+USART3_RX_BUF[9]*256+USART3_RX_BUF[10];//計(jì)算電流參數(shù)寄存器
C_REG=USART3_RX_BUF[11]*65536+USART3_RX_BUF[12]*256+USART3_RX_BUF[13];//計(jì)算電流寄存器
C=((CP_REG*100)/C_REG)/100.0;//計(jì)算電流值
//printf("I:%2.3fA; ",C);
sprintf((char *)dat,"U:%0.2fV I:%2.2fA ",V,C);
OLED_P6x8Str(0,3,dat);
printf((char *)dat);
if(USART3_RX_BUF[0]>0xf0)//判斷實(shí)時(shí)功率是否未溢出
{
printf("NO Device!");
OLED_P6x8Str(30,4,"NO Device");
P=0;
}
else
{
PP_REG=USART3_RX_BUF[14]*65536+USART3_RX_BUF[15]*256+USART3_RX_BUF[16];//計(jì)算功率參數(shù)寄存
P_REG=USART3_RX_BUF[17]*65536+USART3_RX_BUF[18]*256+USART3_RX_BUF[19];//計(jì)算功率寄存器
P=(PP_REG/P_REG)*1.88*1;//計(jì)算有效功率
sprintf((char *)dat,"P:%0.2fW ",P);
OLED_P6x8Str(30,4,dat);
printf((char *)dat);
}
if((USART3_RX_BUF[20]&0x80)!=old_reg)//判斷數(shù)據(jù)更新寄存器最高位有沒有翻轉(zhuǎn)
{
k++;
old_reg=USART3_RX_BUF[20]&0x80;
}
PF=(k*65536)+(USART3_RX_BUF[21]*256)+USART3_RX_BUF[22];//計(jì)算已用電量脈沖數(shù)
PF_COUNT=((100000*3600)/(PP_REG*1.88))*10000;//計(jì)算1度電對(duì)應(yīng)的脈沖數(shù)量
E_con=((PF*10000)/PF_COUNT)/10000.0;//計(jì)算已用電量
sprintf((char *)dat,"E:%0.4lf kW.h ",E_con);
OLED_P6x8Str(10,5,dat);
printf((char *)dat);
printf("\r\n");
delay_ms(100);
memset((void *)USART3_RX_BUF,0,sizeof(USART3_RX_BUF));
}
}
}
復(fù)制代碼
原理圖:無
仿真:無
Keil代碼下載:
STM32F103C8T6驅(qū)動(dòng)HLW8032源代碼.7z
(202.14 KB, 下載次數(shù): 73)
2023-7-9 21:24 上傳
點(diǎn)擊文件名下載附件
STM32F103C8T6驅(qū)動(dòng)HLW8032源代碼
下載積分: 黑幣 -5
作者:
王秋冬
時(shí)間:
2023-7-10 11:21
謝謝分享,注釋詳細(xì)。
作者:
LZ19992005
時(shí)間:
2023-7-24 08:57
謝謝分享,注釋詳細(xì)。
作者:
fengche1915
時(shí)間:
2025-3-18 13:08
謝謝分享;學(xué)習(xí)了;
作者:
川流吳
時(shí)間:
2025-3-19 08:00
占樓
作者:
eb900001
時(shí)間:
2025-3-19 09:35
學(xué)習(xí)了,資料程序很不錯(cuò),感謝分享
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1