国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

【RISC-V MCU 創(chuàng)新應(yīng)用】一種網(wǎng)絡(luò)型單相智能電表

rockswang / 3758人閱讀

摘要:負(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ù)傳輸。

一、預(yù)想功能

基于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ā)指令功能。

二、系統(tǒng)框架

三、硬件介紹


該智能電表硬件部分主要由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)行收集。

四、軟件介紹

1.主函數(shù)

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ù)	}}

2.電能計(jì)量模塊相關(guān)驅(qū)動函數(shù)

串口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);	}}

3.以太網(wǎng)模塊相關(guān)驅(qū)動函數(shù)

對電能相關(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é)議。

六、功能驗(yàn)證

1.完整成品展示

2.OLED 屏幕顯示測試

將設(shè)備接入負(fù)載,打開電源。

如上所示,OLED 屏幕顯示正常,且數(shù)據(jù)無錯誤。

3.有人云平臺測試

接通電源和電器后在電腦端打開有人云平臺
如上所示,數(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

相關(guān)文章

  • 【沁恒CH32學(xué)習(xí)】——RISC-V架構(gòu)學(xué)習(xí)筆記

    摘要:我首先百度簡單了解了架構(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...

    nihao 評論0 收藏0
  • 不用 WASM,我們從頭造輪子!采用 RISC-V 設(shè)計(jì)的區(qū)塊鏈虛擬機(jī) CKB-VM 誕生記

    摘要:在區(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)...

    joywek 評論0 收藏0
  • 當(dāng)區(qū)塊鏈遇見 RISC-V

    摘要:在區(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í)...

    Tychio 評論0 收藏0
  • 常見物聯(lián)網(wǎng)操作系統(tǒng)介紹

    摘要:相比之下,物聯(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),其核心在于...

    AdolphLWQ 評論0 收藏0
  • 區(qū)塊鏈正在重塑法律(上)

    摘要:秘猿科技法務(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ù)字...

    wendux 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<