摘要:負責對電能檢測模塊下發收集指令,以及對電能檢測模塊響應的數據進行處理,一方面對接收的單相數據進行轉換后驅動屏幕對相關數據進行顯示,另一方面對單相數據進行重新打包并通過串口對以太網模塊進行數據傳輸。
基于32 位通用增強型 RISC-V MCU CH32V103開發板作為核心控制主板,通過接收和處理單相電能檢測模塊實時獲取的單相數據,包括對電壓、電流、有功功率、無功功率、電能、功率因數、二氧化碳含量、頻率、芯片溫度等相關數據進行計算和整理,同時驅動OLED 屏幕實時刷新顯示單相電能數據,并將數據進行打包后通過串口向以太網模塊發送數據包,以太網模塊將數據包上傳至云端,實現遠距離在有人云平臺對數據進行監控及上下發指令功能。
該智能電表硬件部分主要由RISC-V MCU CH32V103開發板、電能計模塊、以太網模塊、驅動模塊、OLED 屏幕以及排插等器件組成。
RISC-V MCU CH32V103開發板:作為核心主板。負責對電能檢測模塊下發收集指令,以及對電能檢測模塊響應的數據進行處理,一方 面對接收的單相數據進行轉換后驅動OLED 屏幕對相關數據進行顯示,另一方面對單相數據進行重新打包并通過串口對以太網模塊進行數據傳輸。
電能計模塊:通過排插連接電器,并實時檢測外接電器的單相數據。若接收主板發來的接收指令,則將檢測到的數據上發到主板。
以太網模塊:作為開發板與云端進行數據傳輸的媒介。當模塊接收主板下發的數據包時,會將數據包通過路由器上傳到云端,有人云平臺通過對數據進行接收并顯示到監控界面上,用戶也可通過在有人云的監控界面對主板下發數據和指令。
驅動模塊:按照主板指令驅動散熱器開關以及轉動的速度等。
OLED屏幕:顯示相關數據。
排插:可外接電器,支持220V交流供電,接入排插的電器運行時的單相數據不斷被電能檢測模塊進行收集。
int main(void){ uint8_t OLED_Show_Change = 0; uint8_t OLED_Show_First_In = 0; DisableGlobalIRQ(); board_init(); //務必保留,本函數用于初始化MPU 時鐘 調試串口 gpio_init(B2, GPO, 0, GPIO_PIN_CONFIG); //GPIO初始化 PB2//外接LED2 gpio_init(C0, GPO, 1, GPIO_PIN_CONFIG); //GPIO初始化 PC0//外接KEY gpio_init(C1, GPO, 1, GPIO_PIN_CONFIG); //GPIO初始化 PC1//外接LED1 gpio_init(C3, GPO, 0, GPIO_PIN_CONFIG); gpio_init(C4, GPO, 0, GPIO_PIN_CONFIG); uart_init(UART_1, 4800, UART1_TX_A9, UART1_RX_A10); uart_init(UART_2, 115200, UART2_TX_A2, UART2_RX_A3); uart_rx_irq(UART_1, ENABLE);// uart_tx_irq(UART_1, ENABLE); uart_rx_irq(UART_2, ENABLE);// uart_tx_irq(UART_2, ENABLE); U_OLED_Init(); //用戶初始化OLED函數 U_OLED_Clear(); //清屏函數 timer_pit_interrupt_ms(TIMER_1, 10); //初始化定時TIM1 10毫秒中斷一次 EnableGlobalIRQ(0); while (1) { if (U_Tim_Count > 250)//計時 { U_Tim_Count = 0; OLED_Show_Change++; if (OLED_Show_Change > 2) { OLED_Show_Change = 0; OLED_Show_First_In = 0; } } switch (OLED_Show_Change)//OLED切屏 { case 0: U_Show_IM1253B_Data1(OLED_Show_First_In, U_IM1253B_Data); OLED_Show_First_In = 1; break; case 1: U_Show_IM1253B_Data2(OLED_Show_First_In, U_IM1253B_Data); OLED_Show_First_In = 0; break; case 2: U_Show_IM1253B_Data3(OLED_Show_First_In, U_IM1253B_Data); OLED_Show_First_In = 1; break; default: break; } if (MCU_Interrupt0_Timer_1S_End) //定時1S向IM1253B模塊發送讀取相關寄存器數據的命令 { U_Send_RendCommand_IM1253B(); //向IM1253B模塊發送讀取相關寄存器數據函數 MCU_Interrupt0_Timer_1S_End = 0; U_Send_Ethernet_Data();//向以太網模塊發送電能數據 systick_delay_ms(100);//延時100ms,分段發送數組 U_Send_Ethernet_Data2();//向以太網模塊發送開關數據 } U_Calculation_IM1253B_Data(); //計算IM1253B相關電能數據函數 receive_key();//接收以太網下發數據 }}
串口1中斷函數
void USART1_IRQHandler(void){ static uint8_t U_GetData; uart_query(UART_1, &U_GetData); USART_ClearITPendingBit(USART1, USART_IT_RXNE); U_MCU_UART1_GetData_End = U_Get_IM1253B_Data(U_GetData); //接收IM1253B電能計量模塊驅動函數}
讀取電能計上發的數據,進行判斷后存入特定數組中
uint8_t U_Get_IM1253B_Data(uint8_t Get_Data){ static uint8_t i = 0; static uint8_t Get_Data_Buf[37] = { 0 }; //存儲獲取數據數組 Get_Data_Buf[i++] = Get_Data; //將獲取到的數據存入數組 if (Get_Data_Buf[0] != 0x01) //判斷幀頭 { i = 0; } if ((i == 2) && (Get_Data_Buf[1] != 0x03)) //判斷幀頭 { i = 0; } if ((i == 3) && (Get_Data_Buf[2] != 0x20)) //判斷幀頭 { i = 0; } if (i > 2) { if (i != (Get_Data_Buf[2] + 5)) { return 0; } if (Get_Data_Buf[2] == 0X20) { memcpy(IM1253B_Data_Buf, Get_Data_Buf, 37); //將數據拷貝到IM1253B_Data_Buf數組中 return 1; } } return 0;}
向電能計發送讀取相關寄存器命令函數
void U_Send_RendCommand_IM1253B(void){ static uint8_t ReadCommad[8] = { 0x01, 0x03, 0x00, 0x48, 0x00, 0x08, 0xc4, 0x1a }; //讀取IM1253B相關寄存器命令 uint8_t i = 0; for (i = 0; i < 8; i++) { uart_putchar(UART_1, ReadCommad[i]); systick_delay_ms(1); }}
對電能相關數據進行打包并發送給以太網模塊函數
void U_Send_Ethernet_Data(void)//用戶向以太網模塊發送電能相關數據{ uint8_t U_Send_Ethernet_Data[45] = { 0x01, 0x46, 0x00, 0x00, 0x00, 0x10, 0x20 }; //電能和溫度數據存儲數組 Float_Data_Arry_Change_uchar(U_Send_Ethernet_Data, U_IM1253B_Data_Float,10);//浮點型16進制數據轉化成字符型數據并存入電能和溫度數據存儲數組 U_GetCrcData(U_Send_Ethernet_Data, 39); //計算Modbus RTU協議的CRC校驗碼 //systick_delay_ms(500); uart_putbuff(UART_2, U_Send_Ethernet_Data, 41);}
向以太網發送設備開關指令函數
void U_Send_Ethernet_Data2(void)//發送開關指令{ uint8_t U_Send_Ethernet_Data2[12] = { 0x01, 0x45, 0x00, 0x00, 0x00, 0x10, 0x02 }; //開關 U_Send_Ethernet_Data2[7] = U_Ethernet_Data_Float[0];//將開關信號存入相關數組內 U_Send_Ethernet_Data2[8] = U_Ethernet_Data_Float[1]; U_GetCrcData(U_Send_Ethernet_Data2, 9);//計算校驗位 uart_putbuff(UART_2, U_Send_Ethernet_Data2, 11);//輸出開關指令}
對以太網模塊返回到主板的數據進行判斷后把特定數據存入數組中
uint8_t U_MCU_UART2_GetData_End = 0; //串行口2接收數據結束標志位uint8_t Ethernet_Data_Buf[8] = { 0 };uint8_t U_Get_Ethernet_Data(uint8_t Get_Data)//接收以太網下發的數據并進行判斷,存入數組中{ static uint8_t i = 0; static uint8_t E_Data_Buf[8] = { 0 }; //存儲獲取數據數組 E_Data_Buf[i++] = Get_Data; //將獲取到的數據存入數組 if (E_Data_Buf[0] != 0x01) //判斷幀頭 { i = 0; } if ((i == 2) && (E_Data_Buf[1] != 0x05)) //判斷幀頭 { i = 0; } if ((i == 3) && (E_Data_Buf[2] != 0x00)) //判斷幀頭 { i = 0; } if ((i == 4) && (E_Data_Buf[3] != 0x00)) //判斷幀頭 { i = 0; } if(i == 8)//接收完一套完整的數據 { memcpy(Ethernet_Data_Buf, E_Data_Buf, 9);將數據拷貝到Ethernet_Data_Buf數組中(比數組個數多一位,否則未知bug) }}
計算校驗位函數
static void U_GetCrcData(uint8_t *U_Data_Buffer, uint8_t len)//計算Modbus RTU協議的CRC校驗碼{ uint16_t wcrc = 0XFFFF; //16位crc寄存器預置 uint8_t temp; uint8_t CRC_L, CRC_H; uint8_t i = 0, j = 0; //計數 for (i = 0; i < len; i++) //循環計算每個數據 { temp = *U_Data_Buffer & 0X00FF; //將八位數據與crc寄存器亦或 U_Data_Buffer++; //指針地址增加,指向下個數據 wcrc ^= temp; //將數據存入crc寄存器 for (j = 0; j < 8; j++) //循環計算數據的 { if (wcrc & 0X0001) //判斷右移出的是不是1,如果是1則與多項式進行異或。 { wcrc >>= 1; //先將數據右移一位 wcrc ^= 0XA001; //與上面的多項式進行異或 } else //如果不是1,則直接移出 { wcrc >>= 1; //直接移出 } } } CRC_L = wcrc & 0xff; //crc的低八位 *U_Data_Buffer = CRC_L; CRC_H = wcrc >> 8; //crc的高八位 *(U_Data_Buffer + 1) = CRC_H;}
在有人云平臺對控制界面進行編輯排版,定義相關變量及協議。
將設備接入負載,打開電源。
如上所示,OLED 屏幕顯示正常,且數據無錯誤。
接通電源和電器后在電腦端打開有人云平臺
如上所示,數據能夠正常顯示且實時更新。
打開手機有人云平臺小程序
如上所示,數據能正常顯示且實時更新。
正常狀態下散熱器未打開
打開下發指令開關
如上所示,可見散熱器開始轉動,云平臺下發指令成功,開發板執行指令成功。
綜合上面幾項測試,以RISC-V MCU CH32V103芯片為核心的開發板實現了對電能數據的收發和處理以及通過OLED正常顯示,對云平臺實現數據交換以及遠程無線指令上發下發和執行功能,達到預想功能,測試成功。
演示視頻
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/121238.html
摘要:我首先百度簡單了解了架構和架構的區別,以我個人的理解是架構代表之前的復雜指令集,而架構代表著精簡指令集。而我這次的學習的重點并不是圍繞著指令集,而是基于架構的開發板的應用上。以上就是我本次學習架構的筆記和心路歷程。 作為新手第一次接觸RISC-V架構時。我首先百度簡單了解了ARM架構和RIS...
摘要:在區塊鏈上,虛擬機就是智能合約的運行環境,是一個可以完全對外隔離的完整計算機體系。區塊鏈通過虛擬機來調用和執行智能合約,并要求所有節點都達成一致。 秘猿科技使命是用技術創造信任,為價值網絡提供基礎設施和服務。為了實現這個使命,我們三年來堅持初心,步步為營打造加密經濟網絡。我們想要讓互聯網回歸到本源,用區塊鏈技術,去構造更美好的社會,因此我們設計了 CKB 底層公鏈。我們自己造輪子,開創...
摘要:在區塊鏈上,虛擬機就是智能合約的運行環境,是一個可以完全對外隔離的完整計算機體系。區塊鏈通過虛擬機來調用和執行智能合約,并要求所有節點都達成一致。當區塊鏈遇見在很多科技領域都得到了運用,目前,也開始在區塊鏈領域逐漸的得以發展。 showImg(https://segmentfault.com/img/bVbsfi2?w=2779&h=1179); 區塊鏈的出現使得智能合約得到了更好的實...
摘要:相比之下,物聯網操作系統領域的碎片化問題則非常嚴重,并沒有哪幾個操作系統占據絕對優勢,正處于百花齊放百家爭鳴的階段。在年被公司正式收購,將自己的服務內嵌到系統中,并于年推出了集成無線連接安全等功能的物聯網操作系統。 物聯網操作系統是運行在物聯網設備上的提供物物相連能力的操作系統,其核心在于...
摘要:秘猿科技法務總監錢靖受邀參加北京大學數字金融研究中心舉辦的數字金融第十講,作為主講嘉賓就區塊鏈正在重塑法律做了主題演講。而區塊鏈在很大程度上可以幫助解決這些問題。第三個方面涉及到區塊鏈對每個部門法的影響。 showImg(https://segmentfault.com/img/bVboMSK?w=1280&h=543); 秘猿科技法務總監錢靖受邀參加北京大學數字金融研究中心舉辦的數字...
閱讀 960·2023-04-25 23:54
閱讀 3041·2021-11-08 13:21
閱讀 3769·2021-09-27 13:35
閱讀 3390·2021-07-26 23:41
閱讀 1052·2019-08-30 15:52
閱讀 3437·2019-08-30 11:27
閱讀 2097·2019-08-29 18:37
閱讀 536·2019-08-29 17:24