)
1. 项目背景与硬件选型直流电机控制是嵌入式开发中的经典案例而STM32与L298N的组合堪称黄金搭档。我当年第一次用STM32F103驱动电机时L298N模块的价格还不到10块钱性价比极高。这个方案特别适合初学者理解PWM调速和H桥驱动原理。核心硬件清单STM32F103C8T672MHz主频的Cortex-M3内核MCU自带12位PWM输出L298N驱动模块双H桥设计支持5-35V电压峰值电流2A直流电机建议选择12V/1A左右的减速电机实测空载电流约200mA按键模块5个轻触开关实现功能控制LCD1602用于显示电机状态和档位可选注意Proteus仿真时建议电机参数设置为12V/10W仿真模型编号MOTOR-DC。实际硬件中若电机功率较大需给L298N加装散热片。2. Proteus仿真电路搭建2.1 元件布局技巧在Proteus中新建工程后按CtrlP调出元件库搜索添加STM32F103C6仿真型号L298电机驱动MOTOR-DC电机模型BUTTON按键RES电阻LED状态指示灯关键连接点STM32的PA6、PA7分别接L298N的IN1、IN2PB0接ENAPWM调速通道PC13-PC17接5个按键电机接OUT1、OUT2VS接12V电源VSS接5V逻辑电源2.2 常见问题排查电机不转检查L298N的ENA是否使能逻辑电源VSS是否接入方向控制异常用示波器查看IN1/IN2电平组合正转应为10反转01PWM无输出确认TIM3_CH3已正确配置时钟树配置为72MHz3. STM32程序设计详解3.1 PWM配置关键代码使用CubeMX生成工程时定时器配置如下// TIM3 Channel3 (PB0) 配置 htim3.Instance TIM3; htim3.Init.Prescaler 71; // 1MHz计数频率 htim3.Init.CounterMode TIM_COUNTERMODE_UP; htim3.Init.Period 999; // 1kHz PWM频率 htim3.Init.ClockDivision TIM_CLOCKDIVISION_DIV1; HAL_TIM_PWM_Init(htim3); sConfig.OCMode TIM_OCMODE_PWM1; sConfig.Pulse 500; // 初始占空比50% sConfig.OCPolarity TIM_OCPOLARITY_HIGH; HAL_TIM_PWM_ConfigChannel(htim3, sConfig, TIM_CHANNEL_3);3.2 多档位调速实现通过修改CCR寄存器值实现4档调速void Set_Speed(uint8_t level) { switch(level) { case 1: __HAL_TIM_SET_COMPARE(htim3, TIM_CHANNEL_3, 250); break; // 25% case 2: __HAL_TIM_SET_COMPARE(htim3, TIM_CHANNEL_3, 500); break; // 50% case 3: __HAL_TIM_SET_COMPARE(htim3, TIM_CHANNEL_3, 750); break; // 75% case 4: __HAL_TIM_SET_COMPARE(htim3, TIM_CHANNEL_3, 999); break; // 100% } }3.3 按键扫描逻辑采用状态机方式消除抖动void Key_Scan() { static uint8_t key_state 0; switch(key_state) { case 0: // 初始状态 if(!HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0)) { key_state 1; HAL_Delay(10); // 延时消抖 } break; case 1: // 确认按下 if(!HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0)) { Motor_Forward(); // 执行正转 key_state 2; } else { key_state 0; } break; case 2: // 等待释放 if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0)) { key_state 0; } break; } }4. 进阶功能扩展4.1 速度平滑过渡通过线性插值实现加速度控制void Speed_Ramp(uint16_t target) { uint16_t current TIM3-CCR3; while(current ! target) { current (current target) ? 1 : -1; __HAL_TIM_SET_COMPARE(htim3, TIM_CHANNEL_3, current); HAL_Delay(10); // 10ms步进 } }4.2 过流保护利用ADC检测电流需硬件增加采样电阻if(HAL_ADC_GetValue(hadc1) 2000) { // 超过2A Emergency_Stop(); HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET); // 报警LED }5. 调试经验分享Proteus仿真三大坑电机参数设置不合理会导致仿真卡死建议惯性系数设为0.01L298N模型中的二极管方向必须正确否则续流失效按键扫描频率不宜过高建议20ms检测一次实测数据对比档位理论转速(RPM)实测转速(RPM)误差1档150014235.1%2档300028764.1%3档450043124.2%4档600059241.3%遇到电机启动困难时可以尝试在PWM初始化后先输出100%占空比1秒钟给电机一个初始动能。