位置式PID和速度式PID傻子式学法 📅 2026/7/12 5:07:04 1. CubeMX配置概述STM32CubeMX是ST官方提供的图形化配置工具用于初始化STM32微控制器的外设和生成初始化代码。2. PWM信号输出配置2.1 基础配置该项目应该选择输出到引脚的PWM波。2.2 参数详解ARR自动重装载寄存器ARR代表了PWM波输出占空比为100%时对应的电机速度。为什么不需要分频高频PWM的优势总结高频的PWM波由于导通时间短电流纹波小扭矩转动小电机运动更加平稳。简单比喻低频PWM 用大锤敲钉子冲击力大不平稳高频PWM 用小锤快速敲冲击力小平稳2.3 预装载功能提问允许预装载的核心作用是什么呢预装载 缓冲 同步当你修改定时器参数ARR、CCR等时预装载使能修改的值先存入缓冲寄存器等下一个更新事件UEV再生效预装载禁用修改的值立即生效2.4 其他关键参数Master/Slave Mode是否开启主从模式。Trigger Event SelectionTRGO触发源TRGO触发源 选择什么事件会产生触发输出信号核心作用实现定时器与其他外设的同步常用场景定时器触发ADC采样同步采样定时器级联复杂定时定时器触发DAC输出波形生成注意本项目不需要使用TRGO所以配置为Disable即可。ModePWM mode 1向上计数。Pulse初始占空比。Output compare preload输出比较预装载Enable修改CCR后的值先存入缓冲寄存器等待下一个更新事件计数器溢出才生效。与PSC的区别联想他和PSC有什么区别修改PSC → 影响计数频率 → 不会产生瞬间的异常波形修改CCR → 影响占空比 → 如果不同步会产生不完整周期占空比计算公式占空比 (CCR 1) / (ARR 1) × 100%注意CCR范围0 ~ ARR当CCR0时占空比≈0%几乎全低当CCRARR时占空比100%全高Fast Mode快速模式控制比较匹配时输出的更新时机Enable比较匹配时立即更新输出不需要等待计数器溢出会产生PWM毛刺不用Disable比较匹配后输出在下一个更新事件时更新CH Polarity通道输出极性决定PWM输出的有效电平和无效电平High有效电平高电平(1)无效电平低电平(0)Low有效电平低电平(0)无效电平高电平(1)注意电机驱动板通常是高电平有效PWMA1时电机驱动电路导通。3. GPIO口配置3.1 输出模式选择推挽输出Push-Pull既能拉高水平也能拉低水平驱动能力强速度快。Alternate Function Push Pull 外设控制的推挽输出。开漏输出Open-Drain只能拉低不能拉高需要外部上拉电阻才能输出高电平。3.2 使用场景对比什么时候用推挽输出需要快速切换高低电平如PWM、高速通信需要强驱动能力如电机控制、LED需要独立输出不需要线与功能什么时候用开漏输出需要线与功能如I2C总线需要电平转换如3.3V转5V多个设备共享信号线简单判断如果是输出信号且需要主动驱动 → 推挽如果是总线信号需要多设备共享 → 开漏3.3 输出速度配置Maximum output speed: High高速输出GPIO输出速度 GPIO引脚电平切换的最大频率作用限制GPIO引脚的上升沿和下降沿速度速度越快 → 开关频率越高 → 功耗越大 → 电磁干扰(EMI)越大速度越慢 → 开关频率越低 → 功耗越小 → 电磁干扰越小三个速度等级Low低速2MHzMedium中速10MHzHigh高速50MHz4. 编码器配置4.1 标准库配置TIM4-CR1 0x0000; // 基础配置向上计数 TIM4-SMCR 0x03; // 编码器模式3TI1和TI2都计数4.2 HAL库配置4.3 ARR参数说明ARR在编码器模式下的作用决定计数器的最大值16位计数器的最大值就是655350xFFFF选择ARR65535的原因最大计数范围 0 ~ 65535不容易溢出减少溢出处理的复杂度电机在正常转速下10ms内的计数远小于655354.4 溢出问题分析如果ARR太小如1000电机快速转动时计数器容易溢出溢出后需要处理方向判断的问题增加代码复杂度ARR65535提供了充足的计数空间4.5 配置要点只需要改counter mode四倍频就可以啦。4.6 计算示例假设编码器每转100脉冲编码器模式3四倍频→ 每转400计数电机最高转速 1000转/分钟 16.7转/秒PID控制周期 10ms10ms内的最大计数计算10ms内的最大计数 16.7转/秒 × 400计数/转 × 0.01秒 16.7 × 400 × 0.01 66.8 ≈ 6767 65535完全不会溢出注意编码器每转的脉冲数和电机最高转速都是电机固有的参数哦。5. 按键配置5.1 上拉电阻的作用问题如果按键不上拉会怎么样呢想象一下┌───────────────┐ │ PA2 │── 没有连接任何东西 └───────────────┘PA2引脚悬空时它没有明确的高电平或低电平可能受到周围电路的干扰可能读到1也可能读到0状态不稳定随机变化就像你问一个没有立场的人支持还是反对他可能今天说支持明天说反对完全不可预测如果接了上拉电阻的话未按下时PA2通过上拉电阻连接到VCCPA2 高电平1状态稳定可靠按下时按键闭合PA2直接接地接地的电阻远小于上拉电阻PA2 低电平0状态稳定可靠就像给那个人一个明确的立场未按下 默认支持高电平按下 明确反对低电平状态清晰不会混淆结论上拉电阻解决了悬空引脚的不确定性问题。所以配置按键只需要改一下上拉的问题就可以啦。按键按下去有效故还要改为下降沿触发。5.2 轮询与中断模式对比问题为什么KEY2和其他配置不一样呢轮询模式轮询 vs 外部中断用生活场景来理解最清楚轮询Polling—— 主动去问场景你在办公室工作想知道快递到了没有。做法你每隔几分钟就放下手头工作跑到门口去看快递来了没有。while(1) { if(KEY2 0) { // 主动检查按键状态 // 处理按键 } // 做其他事情... }外部中断Interrupt—— 被动通知场景你在办公室工作想知道快递到了没有。做法你专心工作门口装了门铃。快递到了门铃响了你才去开门。代码示例KEY5/KEY7/KEY11/KEY12void EXTI9_5_IRQHandler(void) { if(KEY5 0) { // 门铃响了才检查是谁 Flag_Stop !Flag_Stop; } EXTI-PR 1 5; // 清除中断标志 }所以产生了配置上的区别。6. OLED配置6.1 推挽输出特点有PMOS和NMOS两个管子高电平输出3.3V低电平输出0V驱动能力强不需要外部上拉电阻适合主动控制外部设备6.2 为什么不上拉下拉上拉/下拉电阻是为输入引脚设计的解决悬空引脚的不确定性问题给引脚一个明确的默认状态对于输出引脚引脚由MCU主动控制不会悬空推挽输出本身就有明确的高低电平不需要额外的上拉/下拉电阻