一个工科生的电机控制实验笔记
基于STM32的直流电机加减速正反转控制串口输出控制系统P 1100009-基于STM32的直流电机加减速正反转控制串口输出控制系统PCB 原理图 报告 源代码 proteus lcd1602 功能描述基于STM32平台 1、实现了电机控制正转、反转的功能 2、实现了电机控制加速、减速的功能 3、实现了串口输出控制信息的功能 4、串口可以模拟WIFI 蓝牙 RS232 等带有串口的功能。 资料包含 1、源代码工程文件 2、仿真工程文件 3、论文报告1W字以上 4、原理图工程文件 5、PCB工程文件最近在实验室折腾STM32控制直流电机从满地杜邦线到能精准控制转速转向踩坑无数。今天给大伙看看我的战损版电机控制系统支持正反转、加减速、串口调试连1602液晶都安排上了。### 硬件搭积木主控用了STM32F103C8T6最小系统板这货72MHz主频够用还便宜。电机驱动选了L298N模块能扛得住24V/2A的暴力输出。LCD1602接成4线模式省IO口串口转USB模块用来和电脑唠嗑。关键硬件配置c// GPIO初始化片段void MotorGPIOInit(void) {GPIOInitTypeDef GPIOInitStructure;RCCAPB2PeriphClockCmd(RCCAPB2Periph_GPIOA, ENABLE);// 方向控制引脚GPIOInitStructure.GPIOPin GPIOPin4 | GPIOPin5;GPIOInitStructure.GPIOMode GPIOModeOut_PP;GPIOInitStructure.GPIOSpeed GPIOSpeed50MHz;GPIOInit(GPIOA, GPIOInitStructure);// PWM引脚配置GPIOInitStructure.GPIOPin GPIOPin0; // PA0-TIM2_CH1GPIOInitStructure.GPIOMode GPIOModeAF_PP;GPIOInit(GPIOA, GPIOInitStructure);}这段代码配置了方向控制引脚和PWM输出引脚。方向控制用普通推挽输出PWM引脚要复用推挽模式。注意TIM2_CH1通道对应PA0脚别接到其他定时器通道上。### 软件里的速度魔法核心是PWM调速在TIM2上搞了个20kHz的PWM信号cvoid PWM_Init(u16 arr, u16 psc) {TIMTimeBaseInitTypeDef TIMInitStructure;TIMOCInitTypeDef TIMOCInitStructure;RCCAPB1PeriphClockCmd(RCCAPB1Periph_TIM2, ENABLE);TIMInitStructure.TIMPeriod arr; // 自动重装载值TIMInitStructure.TIMPrescaler psc; // 预分频系数TIMInitStructure.TIMClockDivision 0;TIMInitStructure.TIMCounterMode TIMCounterModeUp;TIMTimeBaseInit(TIM2, TIMInitStructure);TIMOCInitStructure.TIMOCMode TIMOCModePWM1;TIMOCInitStructure.TIMOutputState TIMOutputStateEnable;TIMOCInitStructure.TIMPulse 0; // 初始占空比TIMOCInitStructure.TIMOCPolarity TIMOCPolarityHigh;TIMOC1Init(TIM2, TIMOCInitStructure);TIM_Cmd(TIM2, ENABLE);TIM_CtrlPWMOutputs(TIM2, ENABLE);}这里TIM2的ARR寄存器决定PWM频率计算时注意APB1总线时钟是36MHz。比如预分频设为35ARR900时PWM频率就是36MHz/(351)/(9001) ≈ 1088Hz实际调试发现20kHz左右电机运行更平稳。基于STM32的直流电机加减速正反转控制串口输出控制系统P 1100009-基于STM32的直流电机加减速正反转控制串口输出控制系统PCB 原理图 报告 源代码 proteus lcd1602 功能描述基于STM32平台 1、实现了电机控制正转、反转的功能 2、实现了电机控制加速、减速的功能 3、实现了串口输出控制信息的功能 4、串口可以模拟WIFI 蓝牙 RS232 等带有串口的功能。 资料包含 1、源代码工程文件 2、仿真工程文件 3、论文报告1W字以上 4、原理图工程文件 5、PCB工程文件速度控制函数像这样cvoid Set_Speed(u8 speed) {if(speed 100) speed 100;TIMSetCompare1(TIM2, (TIMGetAutoReload(TIM2)1)*speed/100);LCD_ShowNum(2, 9, speed, 3); // 在LCD第二行显示速度}输入0-100的百分比自动换算成PWM占空比。TIM_GetAutoReload这个函数很实用能动态获取ARR值方便后续修改PWM频率时不用到处改代码。### 串口玩出花用中断接收模式处理串口指令cvoid USART1_IRQHandler(void) {if(USARTGetITStatus(USART1, USARTIT_RXNE)) {static u8 cnt 0;char ch USART_ReceiveData(USART1);if(ch #) { // 指令开始符cmd_index 0;memset(cmdbuffer, 0, sizeof(cmdbuffer));}else if(ch !) { // 指令结束符ProcessCommand(cmdbuffer);}else {if(cmdindex CMDMAX_LEN) {cmdbuffer[cmdindex] ch;}}}}自定义了简单的协议格式#指令内容!。比如发送#F20!表示正转加速到20%占空比#R-15!代表反转减速15%。这种格式比单纯用AT指令更灵活还能兼容各种串口转WIFI/蓝牙模块。在Proteus仿真里给电机模型加了个转速检测功能能看到加速时的电流变化曲线。实际调试时发现电机启动瞬间容易过流后来在代码里加了软启动cvoid SoftStart(u8 targetspeed) {for(u8 i0; iSet_Speed(i);Delay_ms(20); // 每20ms增加1%占空比}}虽然让加速过程变慢了0.5秒左右但有效保护了电机和驱动芯片实测L298N模块发热明显降低。这个项目从焊电路板到调PID参数虽然最后没用上闭环控制把本科学的单片机知识全过了一遍。资料包里那个1万多字的报告其实是边做边写的吐槽笔记改的...完整工程文件已打包需要源码的工友可以自己下回来魔改。