第一部分 设计概述
1.1 设计目的
在智能工业生产现场中,生产设备的控制依赖于传感器读数以及相关算法等。而传感器起着至关重要的作用,传感器的驱动和数据传输依赖于微控制器,
系统基于沁恒 CH32V307 微控制器进行数据收集、服务器进行数据处理和,中
间基于服务器通过串口与微控制器进行数据传输处理并通过以太网与服务器交
互。服务器端,可实现数据库、数据可视化显示和设备交互;微控制器端通过
操作系统执行传感器驱动进程、以太网传输进程、工业现场数据显示等进程;
工业控制器端。
1.2硬件介绍
首先介绍一下我们使用的开发板:我们使用的是CH32V307开发板。该板使用的是南京沁恒微电子推出的一款基于RISC-V MCU CH32V307内核的开发板。CH32V307系列是基于32位RISC-V设计的互联型微控制器,配备了硬件堆栈区、快速中断入口,在标准RISC-V基础上大大提高了中断响应速度。加入单精度浮点指令集,扩充堆栈区,具有更高的运算性能。扩展串口UART数量到8组,电机定时器到4组。提供USB2.0高速接口(480Mbps)并内置了PHY收发器,以太网MAC升级到千兆并集成了10M-PHY模块。
1.3 主要技术特点
微控制器使用了显示屏、温湿度传感器以及以太网模块。控制器驱动温湿度模块测量温湿度;显示屏显示传感器名称温湿度名称以及数值;以太网采用
芯片自带 10M 处理模块,外接以太网接口,采用官方驱动库进行数据传输。数
据传输至服务器 python socket 进行以太网数据接收处理。
1.4 关键性能指标
(1) MCU:
CH32V307VCT6,主频 144MHz,FLASH 和 RAM 四种配置
288KB FLASH ,32KB RAM
256KB FLASH ,64KB RAM
224KB FLASH ,96KB RAM
192KB FLASH ,128KB RAM
CH32V307V-R0 是 南京沁恒微电子(WCH) 推出的一款基于 RISC-V 内核的开发板,最高主频为 120Mhz,该开发板芯片为 CH32V307-R0。
主控片上资源
(2) AHT10:
温度范围为: 测量范围为 -40 ℃ ~+ 85 ℃ 精度±0.5℃;
湿度范围为:测量范围为 0% - 100% 精度为±3%RH;
(3) 以太网:ETH 支持 10M
1.5 主要创新点
(1) MCU 自带以太网处理模块
(2) 采用 TCP 连接,数据传输准确
第二部分 系统组成及功能说明
2.1 整体介绍
系统结构
2.2 各模块介绍
(一)开发板
a) MCU
MCU 作为核心处理器,驱动周围模块并与外界进行通信。
b) 温湿度模块
温湿度传感器测量物理环境的温湿度,由 MCU 驱动,通过 IIC 协议与
MCU 进行数据传输。
温湿度模块
c) 显示屏
显示屏作为人机交互界面有 MCU 驱动显示。显示内容包括温湿度传感器信
号;温湿度以及数值等内容
d) 以太网模块
以太网模块为 MCU 外界以太网接口,无相关转接芯片。
(二)服务器
以 PC 作为服务器接口,使用 Python Socket 建立服务器。通过绑定 IP 以及
端口进行输出传输以及相关数据的处理等内容。
import socket,os
server = socket.socket()
server.bind(("192.168.1.100",1000))
server.listen(5)
#
数据暂存器
TEMP = [b'H',b'2']
while True:
conn,addr = server.accept()
print("Connected to:",addr)
while True:
#
接收两个字节数据
data = conn.recv(2)
#
判断接收的字节是否为空,为空则退出
if not data:
print("Connected break")
break
#
将两个字节切片
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]
#
字节判断转换输出
if (TEMP[0] == b'H') :
print('H',ord(TEMP[1]))
if (TEMP[0] == b'T') :
print('T',ord(TEMP[1]))
server.close()
第三部分 完成情况及性能参数
(一)显示屏模块
显示屏温湿度显示
显示屏温湿度显示
(二)服务器模块
Python Socket TCP连接
第四部分 主控关键代码
点击查看代码
#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字节对齐*/
__attribute__((__aligned__(4))) ETH_DMADESCTypeDef DMATxDscrTab[ETH_TXBUFNB]; /* MAC
发送描述符,4字节对齐 */
__attribute__((__aligned__(4))) u8 MACRxBuf[ETH_RXBUFNB*ETH_MAX_PACKET_SIZE]; /* MAC
接收缓冲区,4字节对齐 */
__attribute__((__aligned__(4))) u8 MACTxBuf[ETH_TXBUFNB*ETH_MAX_PACKET_SIZE]; /* MAC
发送缓冲区,4字节对齐 */
__attribute__((__aligned__(4))) SOCK_INF SocketInf[WCHNET_MAX_SOCKET_NUM]; /* Socket
信息表,4字节对齐 */
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
接收缓冲区的长度,最小为TCP MSS*/
u8 MACAddr[6]; /*Mac
地址*/
u8 IPAddr[4] = {192,168,1,10}; /*IP
地址*/
u8 GWIPAddr[4] = {192,168,1,1}; /*
网关*/
u8 IPMask[4] = {255,255,255,0}; /*
子网掩码*/
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
缓冲区*/
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);
}
}
- 心得和体会
在本次水感控制系统的制作中,遇到了许多问题,有理论上的,也有操作失误。通过这个项目,使我加深了对单片机知识的理解,明白了理论知识的学习要配合动手实践才能取得更好的效果!