標(biāo)題: STM32F4開(kāi)發(fā)的HLW8032串口發(fā)送數(shù)據(jù),單片機(jī)接收數(shù)據(jù)并且串... [打印本頁(yè)]
作者: 我的南方有佳人 時(shí)間: 2019-10-11 08:54
標(biāo)題: STM32F4開(kāi)發(fā)的HLW8032串口發(fā)送數(shù)據(jù),單片機(jī)接收數(shù)據(jù)并且串...
HLW8032測(cè)量代碼
實(shí)測(cè)了兩組數(shù)據(jù)
第一組
第二組
測(cè)小的電壓時(shí),數(shù)據(jù)會(huì)比較準(zhǔn),測(cè)大的電壓時(shí),誤差會(huì)比較大,這不是代碼的問(wèn)題,應(yīng)該是板子或者芯片的原因。
單片機(jī)源程序如下:
- #include "sys.h"
- #include "delay.h"
- #include "usart.h"
- #include "led.h"
- #include "key.h"
- #include "dma.h"
- #include "oled.h"
- #include "stdio.h"
- ////////////////////////////////////////////////////////
- //因?yàn)殡妷弘娏鞴β誓莻(gè)系數(shù)是根據(jù)電路所用器件參數(shù)算出來(lái)的,所以不同板子參數(shù)
- //器件參數(shù)誤差也不同,可以根據(jù)實(shí)際情況更改參數(shù),校準(zhǔn)電壓電流值等等
- //注意:串口連接的時(shí)候一定要共地,要不然接收到的電壓電流值都會(huì)是0,一開(kāi)始沒(méi)注意到這個(gè)問(wèn)題,以為是程序錯(cuò)了
- //這里用到了F4串口1和串口6,串口1(波特率為9600)用來(lái)接收HLW8032傳輸過(guò)來(lái)的數(shù)據(jù)
- //串口二(波特率為115200)用來(lái)發(fā)送接收到的數(shù)據(jù)到串口
- int main(void)
- {
- uint32_t VpR = 0; // 電壓參數(shù)寄存器
- uint32_t VR = 0; // 電壓寄存器
- uint32_t CpR = 0; // 電流參數(shù)寄存器
- uint32_t CR = 0; // 電流寄存器
- uint32_t PpR = 0; // 電流參數(shù)寄存器
- uint32_t PR = 0; // 電流寄存器
-
- float VoltValue = 0.0; //電壓值
- double IcurrentValue = 0.0; //電流值
- float PowerValue = 0.0; //功率值
-
- /**********相關(guān)外設(shè)函數(shù)的初始化*****************************/
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設(shè)置系統(tǒng)中斷優(yōu)先級(jí)分組2
- usart_x_Init(); //初始化串口
- delay_init(168); //初始化延時(shí)函數(shù)
- LED_Init(); //初始化LED
- KEY_Init(); //按鍵初始化
- OLED_Init(); //OLED初始化
-
- /******************OLED初始顯示**************************/
- OLED_ShowCHinese(12,0,4,1); //電
- OLED_ShowCHinese(24,0,5,1); //壓
- OLED_ShowCHinese(36,0,10,1); //:
- OLED_ShowString(108,0,"V",12); // V
-
- OLED_ShowCHinese(12,12,6,1); //電
- OLED_ShowCHinese(24,12,7,1); //流
- OLED_ShowCHinese(36,12,10,1); //:
- OLED_ShowString(108,12,"A",12); // A
-
- OLED_ShowCHinese(12,24,8,1); //功
- OLED_ShowCHinese(24,24,9,1); //率
- OLED_ShowCHinese(36,24,10,1); //:
- OLED_ShowString(108,24,"W",12); // W
- OLED_Refresh_Gram();//更新顯示到OLED
-
-
- printf("Hello!\r\n");
-
- while(1)
- {
- LED0=!LED0; //程序運(yùn)行標(biāo)志
-
- /************串口1接收數(shù)據(jù),串口6打印數(shù)據(jù)****************************************/
- if((Rx_InfoLen!=0 ) && ((ReceiveInfo[0] == 0xF2) || (ReceiveInfo[0] == 0x55))&&(ReceiveInfo[1] == 0x5A)) //判斷數(shù)據(jù)是否有效,是否存在和被檢測(cè)到
- {
- printf("\r\n");
- printf("State REG is %X\r\n",ReceiveInfo[0]); //打印狀態(tài)寄存器的值
- printf("Check REG is %X\r\n",ReceiveInfo[1]); //打印檢測(cè)寄存器的值
-
- printf("Voltage parameter REG is %X %X %X \r\n",ReceiveInfo[2],ReceiveInfo[3],ReceiveInfo[4]); //電壓參數(shù)寄存器
- printf("Voltage REG is %X %X %X \r\n",ReceiveInfo[5],ReceiveInfo[6],ReceiveInfo[7]); //電壓寄存器
-
- VpR = (ReceiveInfo[2]<<16) + (ReceiveInfo[3]<<8) + ReceiveInfo[4]; //把寄存器的值移位相加起來(lái)
- VR = (ReceiveInfo[5]<<16) + (ReceiveInfo[6]<<8) + ReceiveInfo[7];
- VoltValue = (VpR/VR)*1.88 ; //根據(jù)公式計(jì)算電壓
- printf("VoltValue is %f \r\n",VoltValue); //打印電壓值到串口助手
-
- printf("Current parameter REG is %X %X %X \r\n",ReceiveInfo[8],ReceiveInfo[9],ReceiveInfo[10]); //電流參數(shù)寄存器
- printf("Current REG is %X %X %X \r\n",ReceiveInfo[11],ReceiveInfo[12],ReceiveInfo[13]); //電流寄存器
-
- CpR =(ReceiveInfo[8]<<16) + (ReceiveInfo[9]<<8) + ReceiveInfo[10];
- CR = (ReceiveInfo[11]<<16) + (ReceiveInfo[12]<<8) + ReceiveInfo[13];
- IcurrentValue = ((float)CpR/(float)CR)*0.1; //根據(jù)公式計(jì)算電流
- printf("IcurrentValue is %lf \r\n",IcurrentValue); //打印電流的值到串口助手
-
- printf("Power parameter REG is %X %X %X \r\n",ReceiveInfo[14],ReceiveInfo[15],ReceiveInfo[16]); //功率參數(shù)寄存器
- printf("Power REG is %X %X %X \r\n",ReceiveInfo[17],ReceiveInfo[18],ReceiveInfo[19]); //功率寄存器
- PpR = (ReceiveInfo[14]<<16) + (ReceiveInfo[15]<<8) + ReceiveInfo[16];
- PR = (ReceiveInfo[17]<<16) + (ReceiveInfo[18]<<8) + ReceiveInfo[19];
- PowerValue = (PpR/PR)*1.6*0.1; //根據(jù)公式計(jì)算功率
- printf("PowerValueis %f \r\n",PowerValue); //打印功率的值到串口助手
- printf("Data Updata REG is %X\r\n",ReceiveInfo[20]); //數(shù)據(jù)更新寄存器
- printf("PF REG is %X %X\r\n",ReceiveInfo[21],ReceiveInfo[22]); //電能脈沖個(gè)數(shù)
- printf("CheckSumREG is %X\r\n",ReceiveInfo[23]); //檢驗(yàn)和
-
-
- }
- memset(ReceiveInfo,0x00,Rx_InfoLen); //數(shù)據(jù)處理結(jié)束后,將數(shù)據(jù)存儲(chǔ)數(shù)組清零
- Rx_InfoLen = 0; //數(shù)據(jù)長(zhǎng)度清零
-
- /************OLED顯示電流電壓功率****************************************/
- OLED_ShowFloatNum_12(48,0,VoltValue,5,12); //顯示電壓
- OLED_ShowFloatNum_12(48,12,IcurrentValue,5,12); //顯示電流
- OLED_ShowFloatNum_12(48,24,PowerValue,5,12); //顯示功率
- OLED_Refresh_Gram(); // 更新到OELD
-
-
- }
-
- }
復(fù)制代碼
所有資料51hei提供下載:
HLW8032測(cè)量代碼.7z
(1.65 MB, 下載次數(shù): 169)
2019-10-11 17:06 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者: 1018954083 時(shí)間: 2020-1-2 23:50
不錯(cuò) 學(xué)習(xí)學(xué)習(xí)了
作者: 在下,小生 時(shí)間: 2020-4-6 22:18
你好,我想問(wèn)一下,選用的oled顯示屏是什么型號(hào)的?
作者: ttmax3 時(shí)間: 2020-4-8 07:44
謝謝樓主,學(xué)習(xí)了。
作者: colin988 時(shí)間: 2022-10-26 13:01
請(qǐng)問(wèn)你的有沒(méi)有靜態(tài)電流,我的不接負(fù)載也有0.03A的電流
歡迎光臨 (http://www.torrancerestoration.com/bbs/) |
Powered by Discuz! X3.1 |