基于CH32V307的溫度顯示功能
第一部分 設(shè)計概述
1.1 設(shè)計目的
????在智能工業(yè)生產(chǎn)現(xiàn)場中,生產(chǎn)設(shè)備的控制依賴于傳感器讀數(shù)以及相關(guān)算法等。而傳感器起著至關(guān)重要的作用,傳感器的驅(qū)動和數(shù)據(jù)傳輸依賴于微控制器,
系統(tǒng)基于沁恒 CH32V307 微控制器進(jìn)行數(shù)據(jù)收集、服務(wù)器進(jìn)行數(shù)據(jù)處理和,中
間基于服務(wù)器通過串口與微控制器進(jìn)行數(shù)據(jù)傳輸處理并通過以太網(wǎng)與服務(wù)器交
互。服務(wù)器端,可實(shí)現(xiàn)數(shù)據(jù)庫、數(shù)據(jù)可視化顯示和設(shè)備交互;微控制器端通過
操作系統(tǒng)執(zhí)行傳感器驅(qū)動進(jìn)程、以太網(wǎng)傳輸進(jìn)程、工業(yè)現(xiàn)場數(shù)據(jù)顯示等進(jìn)程;
工業(yè)控制器端。
1.2硬件介紹
首先介紹一下我們使用的開發(fā)板:我們使用的是CH32V307開發(fā)板。該板使用的是南京沁恒微電子推出的一款基于RISC-V MCU CH32V307內(nèi)核的開發(fā)板。CH32V307系列是基于32位RISC-V設(shè)計的互聯(lián)型微控制器,配備了硬件堆棧區(qū)、快速中斷入口,在標(biāo)準(zhǔn)RISC-V基礎(chǔ)上大大提高了中斷響應(yīng)速度。加入單精度浮點(diǎn)指令集,擴(kuò)充堆棧區(qū),具有更高的運(yùn)算性能。擴(kuò)展串口UART數(shù)量到8組,電機(jī)定時器到4組。提供USB2.0高速接口(480Mbps)并內(nèi)置了PHY收發(fā)器,以太網(wǎng)MAC升級到千兆并集成了10M-PHY模塊。
1.3 主要技術(shù)特點(diǎn)
????微控制器使用了顯示屏、溫濕度傳感器以及以太網(wǎng)模塊??刂破黩?qū)動溫濕度模塊測量溫濕度;顯示屏顯示傳感器名稱溫濕度名稱以及數(shù)值;以太網(wǎng)采用
芯片自帶 10M 處理模塊,外接以太網(wǎng)接口,采用官方驅(qū)動庫進(jìn)行數(shù)據(jù)傳輸。數(shù)
據(jù)傳輸至服務(wù)器 python socket 進(jìn)行以太網(wǎng)數(shù)據(jù)接收處理。
1.4 關(guān)鍵性能指標(biāo)
(1) MCU:
????CH32V307VCT6,主頻 144MHz,F(xiàn)LASH 和 RAM 四種配置
????288KB FLASH ,32KB RAM
????256KB FLASH ,64KB RAM
????224KB FLASH ,96KB RAM
????192KB FLASH ,128KB RAM
????CH32V307V-R0 是 南京沁恒微電子(WCH) 推出的一款基于 RISC-V 內(nèi)核的開發(fā)板,最高主頻為 120Mhz,該開發(fā)板芯片為 CH32V307-R0。
? ? ? ? ? ? ? ? ?

? ? ? ? ? ? ? ? ? ? ? ? ? ?
(2) AHT10:
????溫度范圍為: 測量范圍為 -40 ℃ ~+ 85 ℃ 精度±0.5℃;
????濕度范圍為:測量范圍為 0% - 100% 精度為±3%RH;
(3) 以太網(wǎng):ETH 支持 10M
1.5 主要創(chuàng)新點(diǎn)
(1) MCU 自帶以太網(wǎng)處理模塊
????(2) 采用 TCP 連接,數(shù)據(jù)傳輸準(zhǔn)確
第二部分 系統(tǒng)組成及功能說明
2.1 整體介紹

2.2 各模塊介紹
(一)開發(fā)板
a) MCU
??MCU 作為核心處理器,驅(qū)動周圍模塊并與外界進(jìn)行通信。
b) 溫濕度模塊
??溫濕度傳感器測量物理環(huán)境的溫濕度,由 MCU 驅(qū)動,通過 IIC 協(xié)議與
MCU 進(jìn)行數(shù)據(jù)傳輸。

c) 顯示屏
????顯示屏作為人機(jī)交互界面有 MCU 驅(qū)動顯示。顯示內(nèi)容包括溫濕度傳感器信
號;溫濕度以及數(shù)值等內(nèi)容
d) 以太網(wǎng)模塊
????以太網(wǎng)模塊為 MCU 外界以太網(wǎng)接口,無相關(guān)轉(zhuǎn)接芯片。
(二)服務(wù)器
????以 PC 作為服務(wù)器接口,使用 Python Socket 建立服務(wù)器。通過綁定 IP 以及
端口進(jìn)行輸出傳輸以及相關(guān)數(shù)據(jù)的處理等內(nèi)容。
import socket,os
server = socket.socket()
server.bind(("192.168.1.100",1000))
server.listen(5)
?
#
數(shù)據(jù)暫存器
TEMP = [b'H',b'2']
?
while True:
??? conn,addr = server.accept()
??? print("Connected to:",addr)
??? while True:
??????? #
接收兩個字節(jié)數(shù)據(jù)
??????? data = conn.recv(2)
??????? #
判斷接收的字節(jié)是否為空,為空則退出
??????? if not data:
??????????? print("Connected break")
??????????? break
??????? #
將兩個字節(jié)切片
??????? info = [data[i:i+1] for i in range(0, len(data), 1)]
??????? #print(len(info))
??????? if len(info) == 2 :
??????????? TEMP[0] = info[0]
??????????? TEMP[1] = info[1]
??????? #
字節(jié)判斷轉(zhuǎn)換輸出
??????? if (TEMP[0] == b'H') :
??????????? print('H',ord(TEMP[1]))
??????? if (TEMP[0] == b'T') :
??????????? print('T',ord(TEMP[1]))
?
server.close()
第三部分 完成情況及性能參數(shù)
(一)顯示屏模塊
????

(二)服務(wù)器模塊

第四部分 主控關(guān)鍵代碼
點(diǎn)擊查看代碼
#include "debug.h"
#include "WCHNET.h"
#include "string.h"
#include "lcd.h"
#include "AHT_10.h"
?
int32_t temperature, humidity;
char temp[2];
__attribute__((__aligned__(4))) ETH_DMADESCTypeDef DMARxDscrTab[ETH_RXBUFNB];??????????????????????? /* MAC
接收描述符 ,4字節(jié)對齊*/
__attribute__((__aligned__(4))) ETH_DMADESCTypeDef DMATxDscrTab[ETH_TXBUFNB];??????????????????????? /* MAC
發(fā)送描述符,4字節(jié)對齊 */
?
__attribute__((__aligned__(4))) u8? MACRxBuf[ETH_RXBUFNB*ETH_MAX_PACKET_SIZE];?????????????????????? /* MAC
接收緩沖區(qū),4字節(jié)對齊 */
__attribute__((__aligned__(4))) u8? MACTxBuf[ETH_TXBUFNB*ETH_MAX_PACKET_SIZE];?????????????????????? /* MAC
發(fā)送緩沖區(qū),4字節(jié)對齊 */
__attribute__((__aligned__(4))) SOCK_INF SocketInf[WCHNET_MAX_SOCKET_NUM];?????????????????????????? /* Socket
信息表,4字節(jié)對齊 */
const u16 MemNum[8] = {WCHNET_NUM_IPRAW,
???????????????????????? WCHNET_NUM_UDP,
???????????????????????? WCHNET_NUM_TCP,
???????????????????????? WCHNET_NUM_TCP_LISTEN,
???????????????????????? WCHNET_NUM_TCP_SEG,
???????????????????????? WCHNET_NUM_IP_REASSDATA,
???????? ????????????????WCHNET_NUM_PBUF,
???????????????????????? WCHNET_NUM_POOL_BUF
???????????????????????? };
const u16 MemSize[8] = {WCHNET_MEM_ALIGN_SIZE(WCHNET_SIZE_IPRAW_PCB),
????????????????????????? WCHNET_MEM_ALIGN_SIZE(WCHNET_SIZE_UDP_PCB),
????????? ????????????????WCHNET_MEM_ALIGN_SIZE(WCHNET_SIZE_TCP_PCB),
????????????????????????? WCHNET_MEM_ALIGN_SIZE(WCHNET_SIZE_TCP_PCB_LISTEN),
????????????????????????? WCHNET_MEM_ALIGN_SIZE(WCHNET_SIZE_TCP_SEG),
????????????????????????? WCHNET_MEM_ALIGN_SIZE(WCHNET_SIZE_IP_REASSDATA),
????????????????????????? WCHNET_MEM_ALIGN_SIZE(WCHNET_SIZE_PBUF) + WCHNET_MEM_ALIGN_SIZE(0),
????????????????????????? WCHNET_MEM_ALIGN_SIZE(WCHNET_SIZE_PBUF) + WCHNET_MEM_ALIGN_SIZE(WCHNET_SIZE_POOL_BUF)
???????????????????????? };
__attribute__((__aligned__(4)))u8 Memp_Memory[WCHNET_MEMP_SIZE];
__attribute__((__aligned__(4)))u8 Mem_Heap_Memory[WCHNET_RAM_HEAP_SIZE];
__attribute__((__aligned__(4)))u8 Mem_ArpTable[WCHNET_RAM_ARP_TABLE_SIZE];
?
?
#define RECE_BUF_LEN????????????????????????? WCHNET_TCP_MSS*2?????????????????????????????????? /*socket
接收緩沖區(qū)的長度,最小為TCP MSS*/
?
u8 MACAddr[6];?????????????????????????????????????????????????????????????????????????????????? /*Mac
地址*/
u8 IPAddr[4] = {192,168,1,10};?????????????????????????????????????????????????????????????????? /*IP
地址*/
u8 GWIPAddr[4] = {192,168,1,1};????????????????????????????????????????????????????????????????? /*
網(wǎng)關(guān)*/
u8 IPMask[4] = {255,255,255,0};??????????????????????????????????????????? ??????????????????????/*
子網(wǎng)掩碼*/
u8 DESIP[4] = {192,168,1,100};?????????????????????????????????????????????????????????????????? /*
目的IP地址*/
u8 connectStatus=0;
u8 SocketId;???????????????????????????????????????????????????????????????????????????????????? /*socket id
號*/
u8 SocketRecvBuf[WCHNET_MAX_SOCKET_NUM][RECE_BUF_LEN];?????????????????????????????????????????? /*socket
緩沖區(qū)*/
u8 MyBuf[RECE_BUF_LEN];
u16 desport=1000;??????????????????????????????????????????????????????????????????????????????? /*
目的端口號*/
u16 srcport=1000;??????????????????????????????????????????????????????????????????????????????? /*
源端口號*/
/********************************************************************
* @fn????? Ethernet_LED_Configuration
* @brief?? set eth data and link led pin
* @return? none
*/
void Ethernet_LED_Configuration(void)
{
??? GPIO_InitTypeDef? GPIO;
?
??? RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
??? GPIO.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9;
??? GPIO.GPIO_Mode = GPIO_Mode_Out_PP;
??? GPIO.GPIO_Speed = GPIO_Speed_50MHz;
??? GPIO_Init(GPIOB,&GPIO);
??? Ethernet_LED_LINKSET(1);
??? Ethernet_LED_DATASET(1);
}
?
?
/*********************************************************************
* @fn????? Ethernet_LED_LINKSET
*
* @brief?? set eth link led,setbit 0 or 1,the link led turn on or turn off
*
* @return? none
*/
void Ethernet_LED_LINKSET(u8 setbit)
{
???? if(setbit){
???????? GPIO_SetBits(GPIOB, GPIO_Pin_8);
???? }
???? else {
???????? GPIO_ResetBits(GPIOB, GPIO_Pin_8);
??? }
}
/*********************************************************************
* @fn????? Ethernet_LED_DATASET
*
* @brief?? set eth data led,setbit 0 or 1,the data led turn on or turn off
*
* @return? none
*/
void Ethernet_LED_DATASET(u8 setbit)
{
???? if(setbit){
???????? GPIO_SetBits(GPIOB, GPIO_Pin_9);
???? }
???? else {
???????? GPIO_ResetBits(GPIOB, GPIO_Pin_9);
??? }
}
1.?? 心得和體會
在本次水感控制系統(tǒng)的制作中,遇到了許多問題,有理論上的,也有操作失誤。通過這個項目,使我加深了對單片機(jī)知識的理解,明白了理論知識的學(xué)習(xí)要配合動手實(shí)踐才能取得更好的效果!
?