找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 9740|回復(fù): 7
打印 上一主題 下一主題
收起左側(cè)

基于STM32的HLW8032電量采集系統(tǒng)源程序

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
一、準(zhǔn)備材料
1.STM32F103C8T6最小系統(tǒng)板;
​2.HLW8032電參數(shù)采集模塊;
3.OLCD 0.96寸顯示屏,用的是IIC的驅(qū)動(dòng)方式;
4.ST-Link下載器,用其他下載器也可以,有啥用啥;
5.11根杜邦線,1根220V的電源線;
二、接線
1.ST-Link下載器與STM32連接;
下載器
STM32
3.3V
3.3
SWDIO
DIO
SWCLK
DCLK
GND
GND

2.HLW8032與STM32連接;
HLW8032
STM32
3.3V
3.3
P
不接
T
B11
GND
GND
3.OLED屏與STM32連接;
OLED
STM32
GND
GND
VCC
3.3
SCL
B12
SDA
B13
三、下載程序
把上面接好的ST-Link下載器,插入電腦;打開提供的代碼程序,然后點(diǎn)擊下載即可:
​​​

四、接入220V交流電
燒錄完程序后,如果接線正確,這個(gè)時(shí)候0.96寸的顯示屏就會(huì)顯示Knight20字樣了,但是還不會(huì)有電參數(shù)顯示,因?yàn)檫沒接入220V交流電。

注:HLW8032模塊需要接了220V的交流后,才會(huì)進(jìn)行工作并輸出數(shù)據(jù)!
把準(zhǔn)備好的電源線,接到HLW8032的IN接線端子上:
通電后就這樣子了:


單片機(jī)源程序如下:
  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);         //設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級(jí),2位響應(yīng)優(yōu)先級(jí)
  20.         delay_init();        //延時(shí)初始
  21.         LED_Init();        //LED初始化
  22.         uart_init(9600);//串口1初始化
  23.         usart3_init(4800);//HLW8032模塊接線方式3.3V--3.3;G--G;T--PB11;P不接
  24.        
  25.         IIC_Init();//如果不接0.96寸顯示屏,這句需要?jiǎng)h掉
  26.     OLED_Init();//0.96寸接線方式VCC--3.3;GND--G;SCL--PB12;SDA--PB13//如果不接0.96寸顯示屏,這句需要?jiǎng)h掉
  27.         OLED_P8x16Str(35,0,(unsigned char *)"Knight20");//如果不接0.96寸顯示屏,這句需要?jiǎng)h掉
  28.        
  29.         delay_ms(20);//延時(shí)       
  30.        
  31.         printf("Init OK\r\n");
  32.         while(1)
  33.         {               

  34.                 if(USART3_RX_STA&0X8000)//接收到HLW8032一次數(shù)據(jù)了
  35.                 {       
  36.                         len=USART3_RX_STA&0x3fff;//得到此次接收到的數(shù)據(jù)長(zhǎng)度
  37.                         Data_Processing();
  38.                         USART3_RX_STA=0;                           //啟動(dòng)下一次接收       
  39.                 }
  40.                  delay_ms(50);
  41.                 LED0=!LED0;//STM32系統(tǒng)板自帶的指示燈
  42.         }
  43. }

  44. void Data_Processing(void)//電能數(shù)據(jù)解析
  45. {
  46.         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;
  47.         u8 dat[200];
  48.         u8 i=0;
  49.         if(USART3_RX_BUF[0]!=0xaa&&len==24)//芯片誤差修正功能正常,參數(shù)正常
  50.         {
  51.                 for(i=2;i<23;i++)
  52.                 {
  53.                         dat_sum=dat_sum+USART3_RX_BUF[i];//計(jì)算校驗(yàn)和
  54.                 }
  55.                 if(dat_sum%256==USART3_RX_BUF[23])//檢查校驗(yàn)位是否正確
  56.                 {
  57.                         VP_REG=USART3_RX_BUF[2]*65536+USART3_RX_BUF[3]*256+USART3_RX_BUF[4];//計(jì)算電壓參數(shù)寄存器
  58.                         V_REG=USART3_RX_BUF[5]*65536+USART3_RX_BUF[6]*256+USART3_RX_BUF[7];//計(jì)算電壓寄存器
  59.                         V=(VP_REG/V_REG)*1.88;//計(jì)算電壓值,1.88為電壓系數(shù),根據(jù)所采用的分壓電阻大小來確定
  60.                         //printf("U:%0.2fV; ",V);
  61.                        
  62.                         CP_REG=USART3_RX_BUF[8]*65536+USART3_RX_BUF[9]*256+USART3_RX_BUF[10];//計(jì)算電流參數(shù)寄存器
  63.                         C_REG=USART3_RX_BUF[11]*65536+USART3_RX_BUF[12]*256+USART3_RX_BUF[13];//計(jì)算電流寄存器
  64.                         C=((CP_REG*100)/C_REG)/100.0;//計(jì)算電流值
  65.                         //printf("I:%2.3fA; ",C);
  66.                     sprintf((char *)dat,"U:%0.2fV  I:%2.2fA ",V,C);
  67.                         OLED_P6x8Str(0,3,dat);//如果不接0.96寸顯示屏,這句需要?jiǎng)h掉
  68.                         printf((char *)dat);
  69.                         if(USART3_RX_BUF[0]>0xf0)//判斷實(shí)時(shí)功率是否未溢出
  70.                         {
  71.                                 printf("NO Device!");
  72.                                 OLED_P6x8Str(30,4,"NO Device");//如果不接0.96寸顯示屏,這句需要?jiǎng)h掉
  73.                                 P=0;
  74.                         }
  75.                         else
  76.                         {
  77.                                 PP_REG=USART3_RX_BUF[14]*65536+USART3_RX_BUF[15]*256+USART3_RX_BUF[16];//計(jì)算功率參數(shù)寄存
  78.                                 P_REG=USART3_RX_BUF[17]*65536+USART3_RX_BUF[18]*256+USART3_RX_BUF[19];//計(jì)算功率寄存器
  79.                                 P=(PP_REG/P_REG)*1.88*1;//計(jì)算有效功率
  80.                                 sprintf((char *)dat,"P:%0.2fW   ",P);
  81.                                 OLED_P6x8Str(30,4,dat);//如果不接0.96寸顯示屏,這句需要?jiǎng)h掉
  82.                                 printf((char *)dat);
  83.                         }       
  84.                         if((USART3_RX_BUF[20]&0x80)!=old_reg)//判斷數(shù)據(jù)更新寄存器最高位有沒有翻轉(zhuǎn)
  85.                         {
  86.                                 k++;
  87.                                 old_reg=USART3_RX_BUF[20]&0x80;
  88.                         }
  89.                         PF=(k*65536)+(USART3_RX_BUF[21]*256)+USART3_RX_BUF[22];//計(jì)算已用電量脈沖數(shù)
  90.                         PF_COUNT=((100000*3600)/(PP_REG*1.88))*10000;//計(jì)算1度電對(duì)應(yīng)的脈沖數(shù)量
  91.                         E_con=((PF*10000)/PF_COUNT)/10000.0;//計(jì)算已用電量
  92.                         sprintf((char *)dat,"E:%0.4lf kW.h  ",E_con);
  93.                         OLED_P6x8Str(10,5,dat);//如果不接0.96寸顯示屏,這句需要?jiǎng)h掉
  94.                         printf((char *)dat);
  95.                         printf("\r\n");
  96.                         delay_ms(100);
  97.                         memset((void *)USART3_RX_BUF,0,sizeof(USART3_RX_BUF));//清空緩存
  98.                 }
  99.                
  100.         }
  101. }

復(fù)制代碼

所有代碼51hei附件下載:
本站鏈接: STM32F103C8T6驅(qū)動(dòng)HLW8032.7z (204.11 KB, 下載次數(shù): 128)
云鏈接:https://pan.baidu.com/s/1rx4tQ_7dYXMAbpy_HychDw 提取碼:1234



評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:999486 發(fā)表于 2022-1-3 17:23 | 只看該作者
51單片機(jī)可以使用源代碼嗎?
回復(fù)

使用道具 舉報(bào)

板凳
ID:444776 發(fā)表于 2022-4-13 19:26 | 只看該作者
大男孩1 發(fā)表于 2022-1-3 17:23
51單片機(jī)可以使用源代碼嗎?

這是stm32的,不能直接用
回復(fù)

使用道具 舉報(bào)

地板
ID:1070952 發(fā)表于 2023-4-10 22:06 | 只看該作者
我按照上面連接方法連接后oled一直顯示Knight20,接上220v交流電后還是只顯示Knight20。是接上負(fù)載后才會(huì)顯示那些參數(shù)值嗎?
回復(fù)

使用道具 舉報(bào)

5#
ID:291668 發(fā)表于 2023-4-11 13:06 | 只看該作者
描述準(zhǔn)確,全面,邏輯清楚,51有你更精彩!
回復(fù)

使用道具 舉報(bào)

6#
ID:147025 發(fā)表于 2024-1-29 10:54 | 只看該作者
jzx123345 發(fā)表于 2023-4-10 22:06
我按照上面連接方法連接后oled一直顯示Knight20,接上220v交流電后還是只顯示Knight20。是接上負(fù)載后才會(huì)顯 ...

不用接負(fù)載,只要接入了HLW8032模塊就會(huì)顯示電參數(shù)了
回復(fù)

使用道具 舉報(bào)

7#
ID:1087718 發(fā)表于 2024-7-22 20:35 | 只看該作者
我用的這個(gè)程序,為什么電壓值不是隨時(shí)變化的,而是固定值變化,就好像有檔位一樣
回復(fù)

使用道具 舉報(bào)

8#
ID:1144895 發(fā)表于 2025-3-5 17:59 | 只看該作者
請(qǐng)問這個(gè)測(cè)量值實(shí)時(shí)變化的嗎
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表