【立创开发板】基于立创梁山派GD32F450的智能小车硬件选型、电源设计与外设驱动全解析最近用立创的梁山派开发板GD32F450主控做了一个智能小车从车架拼装、硬件设计到软件驱动算是完整走了一遍。很多朋友问怎么从零开始搭一个能跑能遥控的小车今天我就把整个项目的硬件选型、电源设计还有外设驱动的思路和细节掰开揉碎了跟大家聊聊。如果你刚接触嵌入式想做个综合性的实战项目这篇应该能帮到你。1. 项目整体构思与硬件选型做小车第一步不是写代码而是想清楚你要它干什么然后根据功能去选配件。我这个车子的核心需求很简单能用手机蓝牙遥控能显示一些传感器数据跑起来要稳。基于这个我选了下面这些核心部件主控板立创·梁山派开发板。核心是GD32F450ZGT6这颗国产MCU性能足够Cortex-M4内核带FPU外设丰富多个定时器、ADC、串口、SPI、I2C都有关键是配套的教程和社区资源很全对新手特别友好。电机驱动TB6612FNG模块。这是驱动直流电机的经典芯片比老的L298N效率高、发热小。一个模块能驱动两个电机正好做小车左右轮独立控制。姿态传感器MPU-6050模块。集成三轴陀螺仪和三轴加速度计我主要用它来读取数据并在屏幕上显示后续可以做姿态控制或平衡车。显示模块1.8寸TFT LCD (ST7735S驱动)。SPI接口128x160分辨率用来实时显示MPU-6050的数据、电池电压等信息调试的时候非常直观。无线遥控JDY-31蓝牙模块。串口透传模块便宜好用。手机装个串口调试助手APP就能发送指令控制小车。车架我在闲鱼上搜的“特技漂移车”车架。原车架底盘不平为了方便固定各种模块我专门画了一块PCB底板。把主控板、电机驱动、电池等都固定在这块底板上再把底板装到车架上整个结构就规整多了。虽然走线看着还有点乱但功能第一嘛。选型的原则就是在满足功能的前提下优先选择资料多、社区支持好的模块能大大降低开发难度。2. 核心电路设计电源是“心脏”玩嵌入式很多玄学问题最后都出在电源上。小车用电池供电但各个模块需要的电压不同所以一个可靠高效的电源电路至关重要。我的小车电源方案是这样的一块2S锂电池标称7.4V作为总输入然后通过降压电路得到系统需要的5V和3.3V。2.1 降压芯片选型MP2225 vs MP2236原文里提到了两款MPS的降压芯片MP2236和MP2225。MP2236同步整流降压最大输出电流6A性能强悍。MP2225也是同步整流降压最大输出电流5A更紧凑。我最后选了MP2225。原因很简单MP2236当时价格稍贵而我手头正好有MP2225的芯片本着节约和利用现有资源的原则就用它来生成3.3V电压给主控MCU、蓝牙模块、传感器等供电。5V部分例如给某些模块供电可以用其他降压模块或直接从电池经LDO得到。提示同步整流比传统的二极管整流效率高很多尤其是压差大、电流大的时候发热量小对小车这种空间紧凑、电池供电的设备特别重要。2.2 动手制作降压模块直接买现成的降压模块当然方便但自己根据芯片手册设计并制作理解会更深刻。我参考MP2225的数据手册里的典型应用电路画了一个小小的降压模块。这里的关键是反馈电阻R1和R2。MP2225的输出电压Vout由这两个电阻的比值决定公式在芯片手册里Vout 0.8V * (1 R1/R2)你需要多大的输出电压比如3.3V就按公式计算并选取合适阻值的标准电阻。我做的模块引脚间距特意设计成2.54mm标准排针间距的倍数这样可以直接插在洞洞板上非常方便既节省成本体积又小。注意电源电路中的电感、电容的选型如材质、额定电流、ESR等也必须严格按照数据手册推荐不能随便用否则影响效率甚至导致芯片工作不稳定。3. 外设连接与引脚分配硬件连接是软件驱动的基础。把各个模块正确、合理地连接到梁山派开发板的GPIO上需要仔细规划。下面这个表格是我实际项目中使用的引脚分配你可以参考外设模块使用协议/功能梁山派引脚分配说明TB6612电机驱动 (左)PWM速度控制TIMER2_CH0, TIMER2_CH1控制一个电机的正反转和速度TB6612电机驱动 (右)PWM速度控制TIMER3_CH2, TIMER3_CH3控制另一个电机的正反转和速度MPU-6050I2C通信I2C0 (SCL: PB8, SDA: PB9)读取陀螺仪和加速度计数据1.8寸 TFT LCDSPI通信 控制引脚SPI5 (CS: PE11, SCK: PE12, MOSI: PE13)DC(数据/命令): PE8, RESET: PE9ST7735S驱动SPI接口JDY-31蓝牙模块USART串口通信USART5 (TX: PC12, RX: PD2)与手机APP通信接收控制指令电脑调试串口USART串口通信USART0 (TX: PA9, RX: PA10)连接PC用于打印调试信息电池电压监测ADC模拟输入ADC01_IN15 (对应某个GPIO)监测电池电压防止过放LED指示灯GPIO输出 / PWMTIMER2_CH2, CH3 和 TIMER8_CH0, CH1目前仅作普通LED用PWM调光功能预留注意引脚分配时一定要避开冲突。比如同一个定时器的不同通道可以给同一个电机的两个输入用但如果你把同一个引脚既配置为SPI又配置为I2C那肯定不行。最好在画原理图或连接前先列个这样的表格规划好。4. 软件驱动与功能实现硬件搭好了接下来就是让代码跑起来。基于GD32的标准库或HAL库驱动这些外设有比较固定的套路。4.1 定时器TIMER电机的“油门”小车移动的核心是控制电机速度这就需要PWM脉宽调制。PWM信号可以用定时器的输出比较功能来产生。// 以TIMER2的CH0通道初始化为例生成PWM void timer2_pwm_init(uint32_t period, uint32_t pulse) { timer_oc_parameter_struct timer_ocinitpara; timer_parameter_struct timer_initpara; // 1. 打开TIMER2和外设时钟 rcu_periph_clock_enable(RCU_TIMER2); rcu_periph_clock_enable(RCU_GPIOA); // 假设PWM输出在PA0 // 2. 配置GPIO为复用推挽输出 gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0); // 3. 初始化定时器基本参数向上计数预分频周期 timer_initpara.prescaler 108 - 1; // 假设系统时钟108MHz分频后1MHz timer_initpara.alignedmode TIMER_COUNTER_EDGE; timer_initpara.counterdirection TIMER_COUNTER_UP; timer_initpara.period period - 1; // PWM周期 (period / 1MHz) 秒 timer_initpara.clockdivision TIMER_CKDIV_DIV1; timer_initpara.repetitioncounter 0; timer_init(TIMER2, timer_initpara); // 4. 配置PWM模式通道0 timer_ocinitpara.outputstate TIMER_CCX_ENABLE; timer_ocinitpara.ocpolarity TIMER_OC_POLARITY_HIGH; timer_ocinitpara.ocidlestate TIMER_OC_IDLE_STATE_LOW; timer_channel_output_config(TIMER2, TIMER_CH_0, timer_ocinitpara); timer_channel_output_pulse_value_config(TIMER2, TIMER_CH_0, pulse); // 设置占空比 timer_channel_output_mode_config(TIMER2, TIMER_CH_0, TIMER_OC_MODE_PWM0); timer_channel_output_shadow_config(TIMER2, TIMER_CH_0, TIMER_OC_SHADOW_DISABLE); // 5. 使能定时器 timer_auto_reload_shadow_enable(TIMER2); timer_enable(TIMER2); }在程序中我通过改变pulse值比较寄存器的值来调整占空比进而控制电机转速。TIMER2和TIMER3的四个通道分别控制两个TB6612模块的四个输入AIN1/AIN2, BIN1/BIN2实现正反转和调速。4.2 串口USART小车的“耳朵和嘴巴”串口用于通信。USART0连接电脑方便我们通过串口助手打印传感器数据、调试信息。USART5连接JDY-31蓝牙模块接收手机发来的控制指令比如‘F’前进、‘B’后退、‘L’左转、‘R’右转。// 蓝牙指令处理示例在串口中断服务函数或主循环查询中 void usart5_irq_handler(void) { if(usart_interrupt_flag_get(USART5, USART_INT_FLAG_RBNE) ! RESET){ char cmd usart_data_receive(USART5); switch(cmd){ case F: motor_move_forward(); break; case B: motor_move_backward(); break; case L: motor_turn_left(); break; case R: motor_turn_right(); break; case S: motor_stop(); break; default: break; } } }4.3 I2C与SPI与传感器和屏幕“对话”MPU-6050 (I2C)通过I2C0总线读取其寄存器获取原始的陀螺仪和加速度计数据。需要先初始化I2C然后按照MPU-6050的数据手册进行器件唤醒、配置量程、读取数据等操作。数据读取后通常需要经过滤波和姿态解算如互补滤波才能得到更稳定的角度信息。TFT屏幕 (SPI)通过SPI5向ST7735S驱动芯片发送命令和数据。初始化序列比较固定网上有很多开源驱动如Adafruit_ST7735库的移植版。初始化后就可以通过写像素点、画线、显示字符等函数把MPU-6050的数据、电池电压等信息显示出来。4.4 ADC监测电池电量我预留了ADC01_IN15这个通道来监测电池电压。思路是通过电阻分压将电池电压比如最高8.4V降到MCU的ADC量程内通常3.3V。ADC采样得到数字值后再反推回实际的电池电压。这是一个很重要的功能可以防止电池过放损坏。不过原文提到因为已经装了物理电压表头所以分压电阻没焊这个功能暂时没启用但程序框架是写好的。5. 项目心得与后续玩法这个小车项目做下来最主要的收获不是仅仅让车跑起来而是经历了一个完整的嵌入式开发流程需求分析、器件选型、电路设计原理图/PCB、焊接组装、引脚分配、外设驱动、功能联调。尤其是对于GD32这款之前没接触过的国产芯片通过这个项目把它的主要外设都用了一遍理解深刻了很多。目前实现的功能是通过手机蓝牙遥控小车完成前进、后退、平移、转圈等基本动作同时屏幕显示传感器数据。后续还有很多可以玩的方向智能升级把预留的USART1用起来连接一个K210之类的AI视觉模块。让K210识别赛道或物体通过串口发送指令给梁山派小车就能实现巡线、避障、跟随等高级功能。灯光效果把现在的普通LED换成RGB彩灯用上预留的PWM定时器通道就能做出炫酷的呼吸灯、转向灯、音乐律动等效果。姿态控制深入挖掘MPU-6050的数据实现一个简单的自平衡小车挑战性更大。做项目最开心的就是看到自己的想法一点点变成现实。这个基于立创梁山派的小车就是一个很好的起点硬件开源软件也有迹可循希望你能在此基础上玩出更多花样。