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