3、STM32微控制器基础:STM32系列选型(F1/F4/H7)、时钟系统、GPIO、定时器、中断、DMA等外设概述
运动控制卡的核心是实时、确定性地完成位置环、速度环和电流环的运算,并精确输出PWM脉冲或模拟量指令。STM32凭借其丰富的定时器资源、强大的中断响应能力和DMA(直接存储器访问)通道,成为中低端运动控制器主控芯片的优选。本章将围绕STM32的选型逻辑、时钟树构建、GPIO(通用输入输出)配置以及关键外设(定时器、中断、DMA)在运动控制场景下的应用展开,帮助读者建立从芯片选型到外设映射的完整知识框架。
上图展示了STM32在运动控制卡中的核心地位:时钟系统为所有外设提供时基,GPIO负责低速开关量控制,高级定时器产生PWM波形,编码器接口读取位置反馈,中断与DMA保证实时性。下面将逐一展开这些模块的工程应用要点。
3.1 STM32系列选型:从F1到H7的演进与运动控制适配
STM32家族庞大,但运动控制领域最常用的是F1、F4和H7三个系列。选型不能只看主频,要综合考量定时器资源、ADC精度、DMA通道数以及封装引脚数。
| 对比维度 | STM32F1 (Cortex-M3) | STM32F4 (Cortex-M4F) | STM32H7 (Cortex-M7) |
|---|---|---|---|
| 最高主频 | 72MHz | 168MHz (部分180MHz) | 480MHz (双核可达550MHz) |
| 高级定时器 | 2个 (TIM1/TIM8) | 2个 (TIM1/TIM8) | 2个 (TIM1/TIM8) + 更多通用 |
| 32位定时器 | 2个 (TIM2/TIM5) | 2个 (TIM2/TIM5) | 2个 (TIM2/TIM5) |
| ADC位数 | 12位 | 12位 (更快采样率) | 16位 (可选) |
| DMA通道数 | 12个 (DMA1+DMA2) | 16个 (DMA1+DMA2) | 32个 (DMA1+DMA2+DMA3) |
| 浮点运算 | 无 (软件浮点) | 单精度FPU | 双精度FPU |
| 典型运动控制场景 | 3轴以下步进控制 | 4-6轴步进/伺服 | 多轴伺服+视觉联动 |
| 功耗 | 低 | 中等 | 较高 |
选型判断流程:首先统计需要控制的轴数,每轴需要1路PWM脉冲输出、1路方向信号、1路编码器输入(A/B/Z三相)。其次评估是否需要电流环闭环,若需要则要计算ADC采样率与定时器同步能力。最后考虑通信接口,如EtherCAT从站需要F4以上才能流畅运行。
3.2 时钟系统:运动控制时基的精确性保障
运动控制对时钟精度要求极高,PWM频率误差超过0.1%就会导致电机转速漂移。STM32时钟树的核心是PLL倍频,但必须注意各总线分频后的实际频率。
典型配置流程(以F4为例):
- 选择HSE外部晶振(通常8MHz或25MHz),确保精度在±20ppm以内。
- 配置PLL倍频系数,使SYSCLK达到168MHz。
- 设置AHB预分频为1,APB1分频为4(42MHz),APB2分频为2(84MHz)。
- 定时器时钟:若APB1预分频不为1,则定时器时钟自动倍频为APB1×2,即84MHz。
// 以STM32F407为例,HSE=8MHz,SYSCLK=168MHz
RCC->CR |= RCC_CR_HSEON; // 开启HSE
while(!(RCC->CR & RCC_CR_HSERDY)); // 等待HSE就绪
RCC->PLLCFGR = (8 << 0) | (336 << 6) | (0 << 16) | (2 << 24);
// PLL_M=8, PLL_N=336, PLL_P=2 → SYSCLK=8/8*336/2=168MHz
RCC->CFGR |= RCC_CFGR_HPRE_DIV1 | RCC_CFGR_PPRE1_DIV4 | RCC_CFGR_PPRE2_DIV2;
// AHB=168MHz, APB1=42MHz, APB2=84MHz
RCC->CR |= RCC_CR_PLLON; // 开启PLL
while(!(RCC->CR & RCC_CR_PLLRDY));
RCC->CFGR |= RCC_CFGR_SW_PLL; // 切换系统时钟到PLL
运动控制中需要特别关注的是定时器时钟频率。例如TIM1挂在APB2上,若APB2=84MHz,则TIM1时钟为84MHz。要产生20kHz的PWM,则ARR=84MHz/20kHz-1=4199。若需要精确到0.01Hz,则必须使用32位定时器(TIM2/TIM5)来扩展计数范围。
3.3 GPIO:运动控制IO的电气特性与配置策略
GPIO在运动控制卡中承担限位开关输入、原点信号输入、伺服使能输出、报警信号输入等任务。这些信号直接关系到设备安全,配置错误可能导致飞车或撞机。
关键配置参数:
- 输入模式:限位开关建议使用上拉输入(内部上拉),开关闭合接地。若使用外部上拉,需计算电阻值,通常4.7kΩ~10kΩ。
- 输出模式:伺服使能信号使用推挽输出,驱动能力足够。若需要驱动继电器,则必须加三极管或光耦隔离。
- 速度等级:PWM输出引脚需配置为50MHz高速,普通IO配置为2MHz即可,降低EMI。
- 复用功能:定时器通道必须配置为AF模式,且要查表确认引脚对应的AF编号。
运动控制卡IO设计规范:所有外部信号必须经过光耦隔离,防止电机驱动器干扰损坏MCU。光耦输入端串联限流电阻,输出端接上拉电阻到3.3V。对于差分信号(如编码器),需使用RS422接收器(如AM26LS32)转换为单端信号后再接入GPIO。
某3轴运动控制卡使用GPIO检测原点开关,发现偶尔会丢失原点信号。分析过程:示波器测量发现开关闭合瞬间存在约20ms的抖动,而程序只读取一次电平。解决方案:在GPIO中断服务函数中启动定时器,延时10ms后再次读取电平确认。同时将GPIO配置为上升沿和下降沿都触发中断,通过状态机判断稳定电平。最终原点定位精度从±0.5mm提升到±0.02mm。
3.4 定时器:PWM生成与编码器接口的工程实现
定时器是运动控制的核心外设,STM32的高级定时器(TIM1/TIM8)专为电机控制设计,具备互补PWM输出、死区插入和刹车功能。
PWM生成关键参数:
| 参数 | 典型值 | 计算公式 | 影响 |
|---|---|---|---|
| PWM频率 | 20kHz~100kHz | Fpwm = TIM_CLK / (ARR+1) | 频率越高,电机噪音越小,但开关损耗增大 |
| 占空比分辨率 | 0.1% | CCR / (ARR+1) | 决定速度控制精度 |
| 死区时间 | 0.5μs~3μs | 由TIM_BDTR寄存器配置 | 防止上下桥臂直通 |
| 计数模式 | 边沿对齐/中心对齐 | — | 中心对齐用于电流采样同步 |
编码器接口模式:TIM1/TIM2等支持正交编码器模式,硬件自动解码A/B相脉冲,计数器值直接代表位置。Z相(索引)信号可触发捕获中断,用于回零操作。
// 编码器模式配置示例(TIM2,PA0=CH1, PA1=CH2)
TIM2->SMCR = TIM_SMCR_SMS_0 | TIM_SMCR_SMS_1; // 编码器模式3
TIM2->CCER = 0; // 禁止捕获
TIM2->CCMR1 = TIM_CCMR1_CC1S_0 | TIM_CCMR1_CC2S_0; // 输入映射
TIM2->ARR = 0xFFFF; // 16位计数
TIM2->CR1 |= TIM_CR1_CEN; // 使能计数
3.5 中断与DMA:实时性与数据吞吐的平衡
运动控制对实时性要求苛刻:位置环中断周期通常为1ms,电流环为100μs。中断响应延迟必须小于10μs,否则会导致轨迹偏差。
中断优先级分组策略:
- 最高优先级:电流环采样定时器中断(TIM1更新中断),抢占优先级0,子优先级0。
- 次高优先级:编码器Z相捕获中断,用于回零,抢占优先级0,子优先级1。
- 中等优先级:位置环定时中断(TIM2更新中断),抢占优先级1,子优先级0。
- 低优先级:通信中断(UART/SPI),抢占优先级2。
DMA在运动控制中的典型应用:
- ADC连续采样:电流传感器输出模拟信号,ADC通过DMA循环采样,无需CPU干预。
- PWM波形更新:将预计算好的占空比表存入内存,通过DMA定时更新CCR寄存器,实现S型加减速曲线。
- 通信数据搬运:UART接收上位机指令,DMA自动将数据存入缓冲区,CPU仅在整帧接收完成后处理。
// DMA配置示例:ADC1连续采样,循环模式
DMA_InitTypeDef DMA_InitStruct;
DMA_InitStruct.DMA_Channel = DMA_Channel_0;
DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;
DMA_InitStruct.DMA_Memory0BaseAddr = (uint32_t)adc_buffer;
DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralToMemory;
DMA_InitStruct.DMA_BufferSize = 3; // 三相电流
DMA_InitStruct.DMA_Mode = DMA_Mode_Circular;
DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStruct.DMA_Priority = DMA_Priority_High;
DMA_Init(DMA2_Stream0, &DMA_InitStruct);
3.6 综合案例:4轴步进运动控制卡外设资源分配
设计一个基于STM32F407的4轴步进电机控制卡,要求每轴独立PWM输出(20kHz)、方向控制、原点输入、限位输入,同时支持UART通信和编码器反馈(可选)。
资源分配方案:
| 功能 | 外设 | 引脚 | 说明 |
|---|---|---|---|
| X轴PWM | TIM1_CH1 | PE9 | 高级定时器,支持死区 |
| X轴方向 | GPIO | PE10 | 推挽输出 |
| Y轴PWM | TIM1_CH2 | PE11 | 与X轴同定时器 |
| Z轴PWM | TIM8_CH1 | PC6 | 独立高级定时器 |
| A轴PWM | TIM8_CH2 | PC7 | — |
| 原点输入×4 | GPIO EXTI | PA0~PA3 | 上升沿触发中断 |
| 限位输入×8 | GPIO | PB0~PB7 | 上拉输入,轮询读取 |
| 编码器X轴 | TIM2_CH1/CH2 | PA0/PA1 | 与原点共用需注意 |
| UART通信 | USART1 | PA9/PA10 | 115200bps,DMA接收 |
实施步骤:
- 初始化时钟:HSE=8MHz,SYSCLK=168MHz,APB1=42MHz,APB2=84MHz。
- 配置GPIO:PWM引脚复用为AF1(TIM1)或AF3(TIM8),方向引脚推挽输出。
- 配置TIM1:PWM模式1,ARR=4199(20kHz),CCR初始为0,使能主输出MOE。
- 配置TIM2:编码器模式3,32位计数,连接X轴编码器。
- 配置NVIC:TIM1更新中断优先级0,EXTI0~3优先级1,UART优先级2。
- 配置DMA:UART1_RX循环接收,ADC1连续采样(若需电流检测)。
测试结果:4轴同时以20kHz PWM运行,CPU占用率约35%,中断响应时间最大8μs,满足运动控制要求。编码器反馈精度达到0.01mm(1000线编码器4倍频)。