嵌入式学习中的思考与记录
嵌入式学习并不是简单地掌握一门编程语言,或者熟悉某一款开发板。它更像是在软件与硬件之间建立联系:理解代码如何被执行、外设如何响应,以及系统为什么会在某个时刻表现出意料之外的行为。
这篇文章用于记录学习过程中的阶段性认识,也会随着实践不断补充。最重要的是为了在VibeCoding中,能够随时回顾学习的记录,形成长久记忆,不忘本源。
目前接触过的开发板
- STM32F103C8T6(便宜能打,十块钱的开发板甚至用的M3内核支持freeRTOS)
- STM32F407VET6(强者无需多言)
- MSPM0G3507(除了低功耗和性价比我真的找不出任何优点)
软件
Agents
- Codex(ChatGPT Plus订阅相对管饱,但是codex cli体验不佳)
- GitHub Copilot(教育认证羊毛被薅完了)
- Claude Code(接入的DeepSeek API,目前最好用的coding cli,但是token消耗较严重)
- DeepSeek(梁圣开源,性价比之光)
- OpenCode(OpenCode Go 提供 GLM5.2 及 Kimi K3 ,Zen 提供免费 DeepSeek V4 flash 等)
- Z.ai(GLM5.2国产精品)
- Kimi(全新K3模型仅次于Fable 5 和 GPT 5.6-Sol)
做过的项目
- 裕达杯智能小车挑战赛
- TI杯第十四届大学生电子设计竞赛
接触过的重要元件
传感器
惯性测量元件(IMU)
IMU是一种用于测量和报告物体的三个基本线性运动(加速度)和三个基本角运动(角速度)的电子设备,根据测量性能指标分为3/6/9/10轴传感器。其中3轴仅有加速度计,6轴在此基础上包含了陀螺仪,9轴新增了磁力计,10轴有了气压计。当前使用最广泛的是MPU6050,一种6轴传感器。
针对于MPU6050,其采用I2C总线进行数据传输,其数据格式为16位,即两个字节。寄存器地址与数据格式如下:
| 数据类型 | 起始寄存器地址 | 数据长度 | 数据格式 |
|---|---|---|---|
| 加速度计 | 0x3B | 6 | 16位 |
| 温度 | 0x41 | 2 | 16位 |
| 陀螺仪 | 0x43 | 6 | 16位 |
上表中均采用大端序(高字节在前)的排列方式,所以一般情况下读取数据时需要将数据向左移动8位,随后相与得到一个完整的16位数据。并且表中的温度并不是指环境温度,而是传感器自身的的温度,因其受温度漂移的影响较大。
获取到的值为原始ADC的值,需要通过量程转换获取实际值。加速度计通过反三角函数直接计算出俯仰角和横滚角,没有累计误差,但易受运动加速度的干扰。陀螺仪对时间积分累计角度变化,可以快速响应,但是积分会导致误差随时间漂移。两者通过互补滤波(直接分配权重)或卡尔曼滤波得到相对准确的结果,但是因为没有磁力计,无法直接感知水平旋转,所以只能通过陀螺仪积分的方式得到偏航角,漂移严重无法长时间准确计算。
电机驱动模块
有刷直流电机
电机驱动模块是连接控制器和电机之间的功率转换电路。单片机等控制器通常只能输出小电压、小电流,而电机需要大电压、大电流才能驱动。因此控制器通过向电机驱动模块输出PWM/方向产生大电压和电流,从而驱动电机。
电机驱动模块包含逻辑输入电路,栅极驱动电路,功率开关电路和保护电路。
对于有刷直流电机来说,经常使用H桥驱动,结构如下图。
电机电源 VM
│
Q1 Q2
│ │
A──电机──B
│ │
Q3 Q4
│
GND四个开关围绕电机排列。当Q1和Q4打开时,电机正转,当Q2和Q3打开时,电机反转。四个开关全部关闭时,电机与电源断开,此时会因为惯性电机继续转动,称之为惯性停车;同时导通Q1和Q2或者Q3和Q4,电机旋转产生的反电动势会形成内部电流,产生反向制动例句,电机快速停止,称之为短路制动。
不能同时导通Q1和Q3或者Q2和Q4,此时相当于电源短路,会直接损坏电机,因此我们需要在其中加入死区避免在切换的过程中产生短路。
直流电机通过PWM周期性控制开关的导通和关闭间接性的降低电机获得的平均电压。当PWM频率过低的时候会出现电机抖动等异响,PWM频率过高会导致门电路切换开关过快导致发热增加,电机功率降低。
常用的模块有L298N、TB6612FNG等。L298N和TB6612FNG都是双路H桥有刷直流电机驱动器。由于L298N采用双极型晶体管而TB6612FNG采用MOSFET,所以TB6612FNG有更低的压降、更高的效率和更小的发热。
L298N 双H桥驱动 TB6612FNG 双H桥驱动
电源: 电源:
12V / VS 电机电源 VM 电机电源
5V / VSS 逻辑电源 VCC 逻辑电源
GND 公共地 GND 公共地
电机输出: A通道:
OUT1、OUT2 电机A AO1 AO2
OUT3、OUT4 电机B AIN1 AIN2 PWMA
控制输入: B通道:
IN1、IN2 电机A方向 BO1 BO2
IN3、IN4 电机B方向 BIN1 BIN2 PWMB
ENA 电机A使能/PWM
ENB 电机B使能/PWM 公共控制:
STBY 待机控制以A通道为例。AIN1=1,AIN2=0,则电机A正转;AIN1=0,AIN2=1,电机A反转;AIN1=0,AIN2=0,电机惯性停车;AIN1=1,AIN2=1,电机短路制动。
步进电机
步进电机是一种将电脉冲信号转换为角位移的电机。每输入一个脉冲,转子转动一个固定角度(步距角),因此可以通过控制脉冲数量精确定位,无需反馈即可实现开环位置控制。常见的步距角有1.8°(200步/圈)和0.9°(400步/圈)。
步进电机内部有多个定子齿极和永磁转子。驱动器按一定顺序给各相绕组通电,产生旋转磁场牵引转子一步步转动。常见的励磁方式包括:
- 整步:每步走一个步距角,力矩大但分辨率低、低速振动大。
- 半步:交替单相通电和双相通电,步距角减半,分辨率提高。
- 微步:通过正弦波电流控制,将一个步距角细分为多个微步,显著降低振动和噪声,提高低速平稳性。
步进电机的核心问题是丢步——当负载力矩超过电机保持力矩或加减速过快时,转子无法跟上脉冲指令,导致位置误差。传统开环驱动无法检测丢步,需要在选型时预留足够的力矩裕量,并采用加/减速曲线(梯形或S形)启动和停止。
闭环步进电机(以ZDT驱动板为例)
ZDT闭环步进电机驱动板在传统步进电机基础上增加了编码器反馈,驱动器实时检测转子实际位置,一旦检测到丢步立即补偿,兼具步进电机的低成本优势和伺服电机的可靠性。ZDT驱动板采用Cortex-M4F内核,支持Modbus RTU协议通过RS485/RS232/CAN/串口TTL通讯,主要分为X固件和Emm固件两个版本。
基本规格
- 供电电压:常规版本10-29V,高压版本10-48V,推荐3A以上电源
- 支持20/28/35/42/57/86系列步进电机
- 通讯方式:串口TTL/RS232/RS485/CAN(20/28/35板卡可插拔更换通讯小板,42/57/86为集成通讯芯片)
- 脉冲信号支持3.3-24V,光耦版本带光耦隔离,支持共阳(NPN)输入
- 默认通讯参数:波特率115200、数据位8、校验位None、停止位1
通讯与协议设置
- 通过RS485或USB转485连接上位机
- 短按Enter键进入电机小屏幕菜单,将Checksum设置为Modbus(无小屏幕型号通过上位机设置)
- 如果需要,修改UartBaud菜单项调整波特率
区分X固件与Emm固件
- Emm固件:小屏幕第二行显示
0.00err(角度误差),绿灯常亮 - X固件:小屏幕第二行显示
0.0°(实时角度),绿灯每秒闪烁1次
两种固件的大部分Modbus指令相同,但部分指令的寄存器地址不同(Emm为红色,X为蓝色),且X固件独有力矩模式和速度模式。
主要控制模式
触发动作命令(功能码06H)
- 编码器校准:写入
00 06 00 01,电机缓慢正反转各一圈完成线性化校准 - 重启电机:写入
00 08 00 01,接入掉电电池时位置不丢失 - 位置角度清零:写入
00 0A 00 01 - 解除堵转/过热/过流保护:写入
00 0E 00 01 - 恢复出厂设置:写入
00 0F 00 01
- 编码器校准:写入
电机使能控制(功能码10H,寄存器0x00F3/0x00E0)
- 使能状态:00=不使能(松轴),01=使能
- 同步标志:00=立即执行,01=缓存命令
力矩模式(X固件):电机以给定电流和给定最大速度的较小值持续旋转。适合电动夹爪、自动收线等需要恒力夹紧的应用。当夹爪夹紧(堵转)后电流达到设定值并维持恒定力矩。
速度模式(X固件):电机按照指定加速度加速到目标速度持续旋转,可限制最大电流。适合传送带、收放卷等连续旋转场景。
梯形曲线位置模式:指定加速加速度、减速加速度、最大速度和目标位置(0.1°分辨率),电机按梯形加减速曲线运动到指定位置。支持三种运动模式:
- 00:相对上一输入目标位置运动
- 01:相对坐标零点绝对位置运动
- 02:相对当前实时位置运动
使用注意事项
- 初次使用或更换/松动电机后,必须先执行空载编码器校准(Cal_MFL),否则电机无法正常运行
- 禁止带电拔插电源线、通讯线和电机线,以免造成电气损坏
- 常见故障及处理:
| 屏幕显示 | 问题 | 处理 |
|---|---|---|
| Sample Current Error! | 电流采样异常 | 联系售后 |
| Encoder Error! | 编码器出错 | 检查磁铁安装 |
| Phase A+A- Error! | 电机线序错误 | 检查A+A-接线 |
| Not Cal | 电机未校准 | 执行编码器校准 |
| UnderVol Warning | 供电电压过低 | 检查电源10-29V |
| Clogging Protect! | 堵转保护 | 发送解除保护命令 |
| OverTemp Warning | 过热保护 | 降温后解除 |
| OverCur Warning | 过流保护 | 检查负载,解除保护 |
- Modbus命令错误时,电机返回
功能码 | 0x80作为响应 - X固件32位数据先传低字再传高字(高字低字自动对调位置)
无线通信模块
ESP-12F(ESP 8266系列) 2.4G WiFi模块
ESP-12F 是由安信可科技开发的 Wi-Fi 模块,该模块核心处理器ESP8266在较小尺寸封装中集成了业界领先的Tensilica L106超低功耗32位微型MCU,带有16位精简模式主频支持80 MHz和160 MHz,支持RTOS,集成Wi-Fi MAC/BB/RF/PA/LNA。在我的日常使用中主要是将其作为一个WiFi通讯模块使用,使用成品的SDK进行开发,暂不研究ESP的编程。
在日常学习中,主要采用串口与ESP模块通讯,通过MQTT协议与华为云/阿里云等服务商提供的MQTT Broker进行数据传输,使单片机拥有了与互联网交互的能力。
通过MQTT Broker,可以实现单片机-物联网或者单片机-物联网-单片机的通讯,实现多设备在系统内的协调配置,成为物联网体系。
MQTT协议中数据的类型为Topic,本质为通过”/“划分层级的字符串,并且区分大小写。数据交互的方式为发布(Publish)和订阅(Subscribe)。对于订阅,当其他的设备向云端发布数据的时候,订阅的这个设备就会收到数据,实现自动同步。MQTT通信一般建立长时间的长连接,保持与云端的握手。简单的信息可以直接发送字符串,相对复杂的信息可以通过JSON格式进行发送。
在PC上可以通过MQTT.fx与MQTT Broker进行数据交互,烧录了安信可固件的ESP-12F可以通过AT指令与MQTT Broker进行数据交互。在烧录固件的时候需要将GPIO0与GND引脚做共地,进入烧录模式。AT指令参考乐鑫官方文档。
HC-05 蓝牙串口通信模块
HC-05 是一种常见的经典蓝牙串口模块。它可以把蓝牙通信转换成UART串口通信,因此单片机可以像使用普通串口一样与手机、电脑或其他蓝牙设备交换数据。HC-05使用的是经典蓝牙Bluetooth Classic,通常采用串口端口协议SPP。
将EN与VCC同时置高电平的时候,HC-05会进入AT模式,此时可以通过串口发送AT命令来配置HC-05。AT指令参考:HC-05蓝牙模块AT指令设置教程