Skip to content

嵌入式学习中的思考与记录 ​

嵌入式学习并不是简单地掌握一门编程语言,或者熟悉某一款开发板。它更像是在软件与硬件之间建立联系:理解代码如何被执行、外设如何响应,以及系统为什么会在某个时刻表现出意料之外的行为。

这篇文章用于记录学习过程中的阶段性认识,也会随着实践不断补充。最重要的是为了在VibeCoding中,能够随时回顾学习的记录,形成长久记忆,不忘本源。

目前接触过的开发板 ​

  1. STM32F103C8T6(便宜能打,十块钱的开发板甚至用的M3内核支持freeRTOS)
  2. STM32F407VET6(强者无需多言)
  3. MSPM0G3507(除了低功耗和性价比我真的找不出任何优点)

软件 ​

  1. STM32CubeMX
  2. Code Composer Studio
  3. Keil MDK
  4. VSCode

Agents ​

  1. Codex(ChatGPT Plus订阅相对管饱,但是codex cli体验不佳)
  2. GitHub Copilot(教育认证羊毛被薅完了)
  3. Claude Code(接入的DeepSeek API,目前最好用的coding cli,但是token消耗较严重)
  4. DeepSeek(梁圣开源,性价比之光)
  5. OpenCode(OpenCode Go 提供 GLM5.2 及 Kimi K3 ,Zen 提供免费 DeepSeek V4 flash 等)
  6. Z.ai(GLM5.2国产精品)
  7. Kimi(全新K3模型仅次于Fable 5 和 GPT 5.6-Sol)

做过的项目 ​

  1. 裕达杯智能小车挑战赛
  2. TI杯第十四届大学生电子设计竞赛

接触过的重要元件 ​

传感器 ​

惯性测量元件(IMU) ​

IMU是一种用于测量和报告物体的三个基本线性运动(加速度)和三个基本角运动(角速度)的电子设备,根据测量性能指标分为3/6/9/10轴传感器。其中3轴仅有加速度计,6轴在此基础上包含了陀螺仪,9轴新增了磁力计,10轴有了气压计。当前使用最广泛的是MPU6050,一种6轴传感器。

针对于MPU6050,其采用I2C总线进行数据传输,其数据格式为16位,即两个字节。寄存器地址与数据格式如下:

数据类型起始寄存器地址数据长度数据格式
加速度计0x3B616位
温度0x41216位
陀螺仪0x43616位

上表中均采用大端序(高字节在前)的排列方式,所以一般情况下读取数据时需要将数据向左移动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

通讯与协议设置

  1. 通过RS485或USB转485连接上位机
  2. 短按Enter键进入电机小屏幕菜单,将Checksum设置为Modbus(无小屏幕型号通过上位机设置)
  3. 如果需要,修改UartBaud菜单项调整波特率

区分X固件与Emm固件

  • Emm固件:小屏幕第二行显示0.00err(角度误差),绿灯常亮
  • X固件:小屏幕第二行显示0.0°(实时角度),绿灯每秒闪烁1次

两种固件的大部分Modbus指令相同,但部分指令的寄存器地址不同(Emm为红色,X为蓝色),且X固件独有力矩模式和速度模式。

主要控制模式

  1. 触发动作命令(功能码06H)

    • 编码器校准:写入00 06 00 01,电机缓慢正反转各一圈完成线性化校准
    • 重启电机:写入00 08 00 01,接入掉电电池时位置不丢失
    • 位置角度清零:写入00 0A 00 01
    • 解除堵转/过热/过流保护:写入00 0E 00 01
    • 恢复出厂设置:写入00 0F 00 01
  2. 电机使能控制(功能码10H,寄存器0x00F3/0x00E0)

    • 使能状态:00=不使能(松轴),01=使能
    • 同步标志:00=立即执行,01=缓存命令
  3. 力矩模式(X固件):电机以给定电流和给定最大速度的较小值持续旋转。适合电动夹爪、自动收线等需要恒力夹紧的应用。当夹爪夹紧(堵转)后电流达到设定值并维持恒定力矩。

  4. 速度模式(X固件):电机按照指定加速度加速到目标速度持续旋转,可限制最大电流。适合传送带、收放卷等连续旋转场景。

  5. 梯形曲线位置模式:指定加速加速度、减速加速度、最大速度和目标位置(0.1°分辨率),电机按梯形加减速曲线运动到指定位置。支持三种运动模式:

    • 00:相对上一输入目标位置运动
    • 01:相对坐标零点绝对位置运动
    • 02:相对当前实时位置运动

使用注意事项

  1. 初次使用或更换/松动电机后,必须先执行空载编码器校准(Cal_MFL),否则电机无法正常运行
  2. 禁止带电拔插电源线、通讯线和电机线,以免造成电气损坏
  3. 常见故障及处理:
屏幕显示问题处理
Sample Current Error!电流采样异常联系售后
Encoder Error!编码器出错检查磁铁安装
Phase A+A- Error!电机线序错误检查A+A-接线
Not Cal电机未校准执行编码器校准
UnderVol Warning供电电压过低检查电源10-29V
Clogging Protect!堵转保护发送解除保护命令
OverTemp Warning过热保护降温后解除
OverCur Warning过流保护检查负载,解除保护
  1. Modbus命令错误时,电机返回功能码 | 0x80作为响应
  2. 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指令设置教程

Last updated:

Build fast, ship useful things.