项目方案介绍
功能介绍
本课程来自一个真实项目:多个气体传感器的管理。由于气体传感器比较昂贵,本课程里使用普通传感器来做实验。真实项目的使用场景如下图所示:
- 上位机操作界面:可以监测多个传感器
- 中控:图片暂时无法放出来,它的功能是向下通过 RS485 连接多个传感器,向上通过USB 口连接 PC。中控平时就要时刻采样传感器的数据,当上位机需要数据时通过 USB 口高效率地传输数据。
- 传感器:有多个机位,每个机位都有传感器
使用场景如下:
- 设置传感器 ID:拿到一个传感器后,要通过上位机设置它的 ID,然后把它放在某个机位
- 中控监测传感器的状态:在线/离线,上位机周期性地读取状态信息
- 中控读取传感器数据,上位机周期性地读取这些数据
- 上位机显示传感器状态、显示传感器数据
- 上位机可以读取中控、各个传感器的程序版本信息,升级固件
硬件方案
在工业控制场景中,上位机通过中控,去控制多个设备,硬件框图如下:
各部件的作用如下:
- 上位机:功能强大,方便操作,比如记录历史数据、图像化显示数据、升级硬件程序
- 中控:在上位机和传感器之间转发数据,当传感器很多时,不使用中控的话,上位机无法快速获得各个传感器的数据
- 传感器:采样数据、上报数据
软件方案
位机方案
上位机:
- 界面使用 LVGL 编写,界面和底层数据通过 JSON 进行隔离,方便更换 GUI
- 数据传输基于 libmodbus,可以使用 Modbus RTU 协议,也可以使用 Modbus TCP 协议
- 自定义协议,以实现:设备 ID 写入、设备状态检测、数据读写、程序升级等功能
中控方案
中控程序复杂,基于 FreeRTOS 编写。
中控上的程序分为 2 个:Bootloader(用于升级应用程序)、应用程序。中控的
Flash 如下划分:
中控上电后,首先运行 Bootloader,它根据配置信息决定是否启动 APP1 或 APP2,
还是保存运行 Bootloader 本身:
- Bootloader:接收上位机下发的固件,升级 APP
- APP1 或 APP2:平时运行的程序,收集传感器数据,等待上位机读取
上位机和中控 Bootloader 的程序框架如下:
上位机和中控 APP 的程序框架如下:
传感器方案
传感器上的程序也分为 2 个:Bootloader(用于升级应用程序)、应用程序。传感器的 Flash 如下划分:
传感器上电后,首先运行Bootloader,它根据配置信息决定是否启动APP1或APP2,还是保存运行Bootloader本身:
- Bootloader:上位机给中控下发传感器的固件,中控再把它传给传感器的Bootloader,Bootloader升级APP
- APP1或APP2:平时运行的程序,读取传感器数据,返回给中控
中控APP和传感器Bootloader的程序框架如下:
中控APP和传感器APP的程序框架如下:
技术难点
难点在于如何保证多个传感器数据上报以及上位机下发不丢包,因为它不仅仅是单块板了,还可以集联多个,所以它的拓展性很强。后期还可以非常方便地给传感器进行批量升级;另外在工厂场景下,会涉及到数据监控,产线情况监控等场景。项目涉及上位机开发、FreeRTOS程序开发、裸机程序开发、单片机的控制。也能掌握传感器数据通讯、传感器协议定义、程序升级等知识点。还可以学习良好的程序开发模式:一套代码如何适应不同的主控芯片、不同的操作系统(FreeRTOS和裸机)。最后,怎么写出稳定可靠、容
易扩展的程序,这个将会贯穿整个学习过程——这是产品,不是练手Demo。
配套硬件
开发板购买链接:工业控制专题课程购买链接
资料获取
百度网盘:https://pan.baidu.com/s/109e9Cr5nl-BWpct24Q6zOw?pwd=root 密码:root
资料汇总
章节目录
- 第0章 项目方案介绍
- 0.1 功能介绍
- 0.2 硬件方案
- 0.3 软件方案
- 0.3.1 上位机方案
- 0.3.2 中控方案
- 0.3.3 传感器方案
- 0.3.4 技术难点
- 第一章 搭建开发环境
- 1.1 开发套件硬件接口资源介绍
- 1.2 资料下载
- 1.3 安装keil MDK
- 1.3.1 软件下载
- 1.3.2 软件安装
- 1.3.3 PACK安装
- 1.4 安装STM32CubeMX
- 1.5 安装STM32CubeProgrammer
- 1.6 安装ST-Link驱动
- 1.7 安装CH340驱动
- 第二章 开发板的使用
- 2.1 硬件连接
- 2.2 运行测试程序
- 2.3 创建第1个程序
- 2.4 使用LCD打印信息
- 2.5 使用FreeRTOS
- 第3章 UART开发基础
- 3.1 同步传输于异步传输
- 3.1.1 概念与示例
- 3.1.2 差别
- 3.2 UART协议与操作方法
- 3.2.1 UART协议
- 3.2.2 STM32H5 UART硬件结构
- 3.2.3 RS485协议
- 3.3 UART编程
- 3.3.1 硬件连接
- 3.3.2 三种编程方式
- 3.3.3 查询方式
- 3.3.4 中断方式
- 3.3.5 DMA方式
- 3.4 效率最高的UART编程方法
- 3.4.1 IDLE中断
- 3.4.2 DMA发送/DMA+IDLE接收
- 3.5 在RTOS里使用UART
- 3.5.1 程序框架
- 3.5.2 编写程序
- 3.5.3 面向对象封装UART
- 3.1 同步传输于异步传输
- 第4章 USB设备编程
- 4.1 USB学习指南
- 4.2 USB系统硬件框架和软件框架
- 4.3 软件工程师眼中的USB电气信号
- 4.4 USB协议层数据格式
- 4.5 USB描述符
- 4.6 USBX组件
- 4.7 移植USBX实现虚拟串口
- 4.8 虚拟串口源码分析与改造
- 第5章 Modbus通讯协议
- 5.1 学习Modbus的快速方法
- 5.2 初始Modbus
- 5.3 Modbus软件与使用
- 5.4 Modbus协议细节
- 5.5 Modbus功能码详解
- 第6章 libmodbus使用
- 6.1 libmodbus开发库
- 6.2 libmodbus源代码解析
- 6.3 libmodbus移植于使用
- 第7章 低成本Modbus传感器的实现
- 7.1 硬件资源介绍与接线
- 7.2 开发环境搭建
- 7.3 创建与体验第1个工程
- 7.4 UART编程
- 7.5 libmodbus移植
- 7.6 传感器设计
- 7.7 访问多个传感器
- 7.8 程序改进
- 第8章 程序升级
- 8.1 程序升级的概念
- 8.2 实现升级功能
- 第9章 综合实现
- 9.1 产品框架
- 9.2 改造libmodbus实现文件传输
- 9.3 读写任意传感器
- 9.4 IAP升级
- 第10章 调试心得
-
- USB串口重复打开、关闭
-
- USB串口数据丢失
-
- STM32 DMA接收回调函数
-
- C++创建线程使用局部变量
-
- libmodbus使用DMA串口时超时时间的设置
-
- F030改用DMA后栈溢出导致切换到timer任务时崩溃
-