STM32平衡车入门:从硬件接线到CubeMX工程配置全解析
1. 项目启动从零到一的硬件蓝图与软件地基做平衡车最怕的就是东西买回来一堆对着开发板两眼一抹黑不知道从哪根线开始接。或者CubeMX一通配置生成代码一编译全是错误连电机都转不起来。今天这篇咱们就彻底解决这个问题把“双轮自平衡车”这个项目在动手焊接和写代码之前所有该想清楚、该准备好的事情一次性捋明白。我会基于最经典的STM32F103C8T6也就是常说的“蓝桥杯”或“最小系统板”核心和TB6612电机驱动模块来展开这套组合性价比极高资料也多非常适合入门和进阶。核心就两件事硬件上你得知道每个模块怎么连电流电压对不对得上软件上你得用CubeMX这个“图形化配置神器”把芯片的引脚功能、时钟、外设参数都配置正确生成一个干净、可编译的工程框架。很多人卡在第一步是因为原理图没吃透线接错了或者供电不足更多人卡在第二步是CubeMX配置时漏了关键项导致后续开发步步维艰。咱们的目标是看完这一篇你手头的零件能组成一个通电后单片机可以跑程序、电机驱动能受控的“半成品”为后续的编码控制打下绝对可靠的基础。2. 硬件核心原理图接线与物料清单全解析硬件是项目的骨架接线错误轻则功能失常重则芯片冒烟。我们以STM32F103C8T6为主控TB6612为电机驱动MPU6050或GY-521模块为姿态传感器来构建核心系统。2.1 主控芯片STM32F103C8T6的引脚分配策略STM32F103C8T6有48个引脚但核心外设就那几个分配时需要统筹考虑。我的策略是先定死那些有硬件限制的引脚再把最常用的功能如PWM、中断分配给剩余引脚中性能最好的。电机驱动 (TB6612)需要4路PWM信号两路控制一个电机的速度和方向两个电机共四路和4路方向控制信号实际上TB6612的STBY、AIN1/AIN2、BIN1/BIN2。PWM必须从定时器的通道引脚产生。我选择TIM1的CH1(PA8)、CH2(PA9)、CH3(PA10)、CH4(PA11)来产生四路PWM。为什么是TIM1因为它是高级定时器互补输出、死区时间等功能对于电机控制是宝贵的储备资源即使现在不用也为未来优化留有余地。AIN1/AIN2、BIN1/BIN2是普通的GPIO输出我分配到PA0、PA1、PA2、PA3这些引脚驱动能力足够。姿态传感器 (MPU6050)使用I2C通信几乎可以连接到任意一组I2C引脚。我选择PB6(I2C1_SCL)、PB7(I2C1_SDA)这是最常用的一组。同时MPU6050的中断引脚INT可以接到一个具有外部中断功能的引脚上用于触发数据读取我选择PB5。调试与下载 (ST-Link)SWDIO(PA13)、SWCLK(PA14)这是固定的必须接。串口1USART1用于打印调试信息PA9(TX)、PA10(RX)。注意这里PA9和PA10与TIM1的CH2、CH3冲突了这是一个关键点一个引脚在同一时刻只能有一种复用功能。在平衡车项目中如果电机PWM必须用TIM1那么串口1就不能再用PA9和PA10。解决方案有两种1) 使用其他串口如USART2(PA2-TX, PA3-RX)2) 如果坚持用USART1则必须将PWM换到其他定时器如TIM2、TIM3。我这里为了保留TIM1给电机选择方案一使用USART2。电源与地这是最易出错的地方。STM32需要3.3V供电。TB6612的VM电机电源接电池如7.4V锂电池VCC逻辑电源必须接5V或3.3V。切记TB6612的VCC如果接5V其控制信号PWMA/AIN等的高电平阈值也是按5V逻辑来的此时不能直接与3.3V的STM32引脚相连需要电平转换或使用兼容5V TTL的STM32引脚部分IO是FT的但为保险起见最好统一逻辑电压。因此我建议将TB6612的VCC也接到一个3.3V的电源上确保STM32的IO可以直接驱动。整个系统需要一个3.3V LDO稳压芯片如AMS1117-3.3来给STM32和TB6612的逻辑部分供电。注意引脚复用冲突是新手最容易栽跟头的地方。在CubeMX中配置时如果某个引脚被标红就意味着冲突必须调整。务必在画原理图或接线前在CubeMX里完成初步的引脚分配验证。2.2 电机驱动模块TB6612的接线要点与保护TB6612比传统的L298N效率高、发热小是目前的主流选择。理解其真值表是关键AIN1AIN2PWMASTBY电机A状态00X1停止刹车10PWM1正转CCW01PWM1反转CW11X1停止刹车接线VM和GND接电机电源电池正负极。电容要足够靠近模块引脚滤除电机启停产生的尖峰电压。VCC和GND接逻辑电源建议3.3V和地。此GND必须与STM32的GND共地AIN1/AIN2, BIN1/BIN2, PWMA/PWMB接STM32对应的GPIO和PWM输出。STBY待机控制高电平有效。可以直接接VCC常使能或者接一个GPIO进行软件使能。AO1/AO2, BO1/BO2接两个直流减速电机的线。保护电机两端一定要并联续流二极管通常TB6612模块内部已集成防止电机线圈产生的反向电动势击穿驱动芯片。电源输入端VM建议串联一个可恢复保险丝如PTC防止电机堵转电流过大烧毁模块。2.3 物料清单BOM与采购建议以下是一份核心物料清单你可以根据它来采购类别名称规格/型号数量备注主控STM32最小系统板F103C8T6核心板1带3.3V LDO、复位、Boot选择、SWD接口电机驱动直流电机驱动模块TB6612FNG1注意版本选择引脚兼容的执行器直流减速电机N20电机带编码器减速比1:302编码器是必选项用于测速闭环传感器姿态传感器模块MPU6050 (GY-521)1集成DMP简化开发电源锂电池7.4V 2S 航模电池1容量根据车体大小选1000mAh左右电源管理降压模块DC-DC降压模块 (7.4V to 5V/3.3V) 或 LDO1给核心板和模块供电输出电流需1A车体结构平衡小车底盘套件亚克力或PCB车架、车轮、电机支架1套网上有大量成品套件调试下载调试器ST-Link V21必备其他杜邦线公对公、公对母、母对母若干用于连接各模块其他开关自锁开关1控制总电源其他电容100uF电解电容0.1uF瓷片电容若干用于电源滤波采购避坑指南电机编码器务必确认是AB相增量式编码器输出是方波脉冲而不是简单的霍尔传感器只输出单相低脉冲。编码器线数如11线越高速度测量越精确。MPU6050模块选择带电平转换电路的通常有3.3V和5V两个供电引脚这样可以直接与3.3V的STM32连接。检查模块是否引出AD0和INT引脚方便地址选择和中断触发。电池务必配套购买平衡充电器。2S锂电池必须用平衡充否则有安全隐患。电池要选带T型插头XT60或T插的方便连接。车架第一次做建议买成品亚克力激光切割套件自己拧螺丝组装即可。自己设计PCB车架门槛较高。3. 软件基石CubeMX工程配置详解硬件连接是躯干CubeMX配置就是给这个躯干注入灵魂的第一步。它生成的HAL库代码能帮你处理好绝大部分底层寄存器操作让你专注于控制算法。3.1 工程创建与时钟树配置打开CubeMX新建工程选择STM32F103C8Tx。系统核心SYS在SYS选项卡将Debug改为Serial Wire。这非常重要否则使用ST-Link下载调试后芯片可能被锁死。时钟RCC在RCC选项卡将High Speed Clock (HSE)设为Crystal/Ceramic Resonator。我们的核心板外部通常有一个8MHz的晶振。时钟树Clock Configuration这是提升系统性能的关键一步。默认使用内部HSI8MHz时钟性能受限。我们需要配置为外部HSE8MHz并通过PLL倍频到72MHz这是F103的极限主频。在时钟树界面点击HSE输入框选择Crystal/Ceramic Resonator。找到PLL Source Mux选择HSE。将PLLMUL设置为x9倍频。将System Clock Mux的源选择为PLLCLK。此时HCLK系统时钟应该显示为72MHz。APB1总线时钟最高36MHzAPB2总线时钟最高72MHz保持自动分配即可。为什么是72MHz更高的主频意味着代码执行更快中断响应更及时对平衡车这种实时性要求高的系统至关重要。HAL库的一些延时函数如HAL_Delay()其精度也依赖于系统时钟。3.2 关键外设的图形化配置根据我们之前的引脚分配方案在Pinout Configuration标签页进行配置。电机PWM (TIM1)找到TIM1激活通道1、2、3、4为PWM Generation CHx。在参数配置中Prescaler (PSC)预分频器设置为72-1。因为系统时钟是72MHz72MHz / 72 1MHz这是定时器的计数时钟。Counter Period (ARR)自动重装载值设置为1000-1。这样PWM的频率就是1MHz / 1000 1kHz。对于直流电机1kHz是一个常用且合适的频率既能保证响应速度又能避免驱动模块产生可闻噪音。Pulse初始脉冲宽度先设为0。CH Polarity极性一般选择High即有效电平为高。此时PA8, PA9, PA10, PA11会自动被配置为TIM1_CHx。电机方向控制 GPIO找到PA0, PA1, PA2, PA3分别设置为GPIO_Output。输出模式默认推挽输出速度选Low即可控制信号频率不高。编码器接口 (TIM2 TIM3)平衡车需要知道轮子转得多快必须读取编码器信号。我们需要两个定时器工作在编码器模式。找到TIM2在Combined Channels中选择Encoder Mode。编码器模式会自动将通道1和2配置为输入。参数配置中Encoder Mode选择Encoder Mode TI1 and TI2同时计数TI1和TI2的边沿精度最高4倍频。Polarity保持默认。Counter Period设置为6553516位定时器的最大值。编码器值会在这个范围内循环计数。引脚PA0(TIM2_CH1)和PA1(TIM2_CH2)会被占用。注意这与我们之前计划将PA0、PA1用作电机方向控制冲突了这就是配置时需要不断权衡调整的地方。我们必须为编码器腾出引脚。解决方案将电机方向控制引脚换到其他空闲IO例如PB12, PB13, PB14, PB15。同时将TIM2的编码器输入引脚换到PA0, PA1。同理配置TIM3为编码器模式用于另一个电机。可以选择PA6(TIM3_CH1), PA7(TIM3_CH2)。为什么用定时器的编码器模式因为它是硬件级的计数不占用CPU资源计数准确且速度快远优于用外部中断软件计数。姿态传感器 (I2C1)找到I2C1模式选择I2C。参数保持默认通常即可标准模式100kHz。对于MPU6050这个速率足够。如果需要高速读取可以后期调整为Fast Mode400kHz。引脚自动分配为PB6(I2C1_SCL), PB7(I2C1_SDA)。调试串口 (USART2)找到USART2模式选择Asynchronous异步通信。参数配置波特率115200字长8 Bits停止位1无校验。引脚自动分配为PA2(USART2_TX), PA3(USART2_RX)。系统时基 (SYS)在SYS的Timebase Source中务必选择除SysTick以外的定时器例如TIM4。因为HAL_Delay()和操作系统调度会用到SysTick而FreeRTOS如果后续要加也会占用它容易引发冲突。将其时基源转移到其他定时器可以避免潜在问题。3.3 生成工程代码前的最后检查在Project Manager标签页Project中设置工程名称、路径Toolchain/IDE选择MDK-ARM V5如果你用Keil5。Code Generator中勾选Generate peripheral initialization as a pair of .c/.h files per peripheral。这会将每个外设的初始化代码生成独立的文件结构非常清晰强烈推荐。点击GENERATE CODE生成工程。生成后用Keil5打开工程直接编译F7。一个健康的起点是零错误零警告可能有个别关于未使用的变量的警告可暂时忽略。如果编译失败请返回CubeMX检查是否有配置遗漏或冲突。4. 硬件连接实战与上电测试当代码框架生成并编译通过后就可以按照我们最终确定的原理图进行实物连接了。这里给出一个经过调整后的连接表示例STM32F103C8T6连接至备注3.3VTB6612.VCC, MPU6050.VCC逻辑电源统一GNDTB6612.GND, MPU6050.GND, 电池GND共地共地共地PA8 (TIM1_CH1)TB6612.PWMA电机A PWMPA9 (TIM1_CH2)TB6612.PWMB电机B PWMPB12TB6612.AIN1电机A方向1PB13TB6612.AIN2电机A方向2PB14TB6612.BIN1电机B方向1PB15TB6612.BIN2电机B方向2PA0 (TIM2_CH1)电机A编码器A相PA1 (TIM2_CH2)电机A编码器B相PA6 (TIM3_CH1)电机B编码器A相PA7 (TIM3_CH2)电机B编码器B相PB6 (I2C1_SCL)MPU6050.SCL上拉电阻模块通常已集成PB7 (I2C1_SDA)MPU6050.SDA上拉电阻模块通常已集成PB5MPU6050.INT中断引脚非必需PA2 (USART2_TX)USB转TTL模块的RX用于串口打印PA3 (USART2_RX)USB转TTL模块的TXPA13 (SWDIO)ST-Link的SWDIOPA14 (SWCLK)ST-Link的SWCLKNRSTST-Link的NRST方便复位VBAT接3.3V备份域供电避免RTC数据丢失上电测试流程先断电池只连接ST-Link和USB转TTL如果要用串口打印到电脑。给核心板上电通过ST-Link或USB口。在Keil中将刚才生成的空白程序下载到芯片。如果下载成功说明最小系统、ST-Link连接、芯片本身基本正常。写一个简单的测试程序例如让一个LED闪烁或者通过串口发送“Hello World”。编译下载后观察现象验证最基本的IO和串口功能。关键测试PWM输出。在main.c的while(1)循环前启动PWMHAL_TIM_PWM_Start(htim1, TIM_CHANNEL_1);并设置一个占空比__HAL_TIM_SET_COMPARE(htim1, TIM_CHANNEL_1, 500);500对应50%占空比。用示波器或逻辑分析仪测量PA8引脚应该能看到1kHz、50%占空比的方波。没有仪器的话可以用一个LED接到PA8和GND之间串联一个220Ω电阻LED会微亮因为1kHz频率人眼无法分辨闪烁看到的是持续光但亮度比直流驱动暗。测试电机驱动确认PWM输出正常后断开主控板电源按照上表连接好TB6612的控制线PWMA, AIN1, AIN2等。将电机电源电池先不接电机只接VM和GND。用万用表测量电机输出端AO1和AO2之间的电压。通过修改代码控制AIN1和AIN201或10并配合PWM你应该能测量到AO1和AO2之间有电压输出且极性随方向改变。切记此时不要接电机最后接电机以上所有测试通过后断开所有电源将电机接到TB6612的输出端。然后上电进行低速短时测试观察电机是否按预期正反转。用手轻轻捏住电机轴感受其力度。如果一切顺利那么恭喜你你的平衡车项目已经完成了最繁琐、最容易出错的基础搭建阶段。硬件通路是通的软件框架是干净的。接下来我们就可以在这个坚实的基础上开始编写读取MPU6050数据的代码并尝试让轮子根据一个固定的PWM值转动为最终的核心算法——PID控制与姿态融合——做好一切准备。记住前期在硬件连接和基础配置上多花一小时查错后期在调试算法时就能节省一整天的时间。

相关新闻

最新新闻

日新闻

周新闻

月新闻