一、整体架构:主控 NUCLEO-F303RE 做主控,MP6540H 驱动直流有刷电机,采用PWM 调压调速 + 闭环转速控制、软件适配 STM32F3 标准库 / STM32CubeHAL,支持开环调速、PI 闭环转速控制、正反转、刹车、限流保护。电源为7.5V 18650电池。
主控层:STM32F303RET6(NUCLEO-F303RE) 资源:128KB RAM、512KB Flash、硬件高级定时器(TIM1/TIM8)、正交编码器接口 TIM2/TIM3、高速 ADC、硬件 DMA。
驱动层:MP6540H H 桥直流电机驱动
执行层:直流有刷电机
辅助外设:电源模块、电流采样、保护电路、按键、指示灯调速方式:IN1/IN2 其中一路输入 PWM 波,另一路固定电平,依靠占空比调压调速。
IN1 & IN2 电机驱动器A的输入引脚,控制电机A转动及旋转角度
IN1输入高电平HIGH,IN2输入低电平LOW,对应电机A正转
IN1输入低电平LOW,IN2输入高电平HIGH,对应电机A反转
IN1、IN2同时输入高电平HIGH或低电平LOW,对应电机A停止转动
调速就是改变IN1、IN2高电平的占空比。
二、软件设计
- STM32 CUBEMX配置MCU接口
外部晶振 8MHz,系统主频配置72MHz;
定时器配置
1.TIM1(高级定时器)
CH1 PA8:PWM 输出,模式 PWM1,预分频 PSC=71,ARR=999,PWM 频率 = 72M/(72*1000)=10kHz;
占空比范围:0~1000(对应 0~100%)。
外设
ADC1:电流采集;
USART1:115200 波特率,串口通信;
GPIO:按键输入、FAULT 故障检测、方向控制 IO;
开启中断:定时器更新中断、FAULT 外部中断。
- STM32程序编写
驱动层:gpio.c、tim_pwm.c、tim_encoder.c、adc.c、usart.c
控制层:motor.c(电机基础驱动)、speed_calc.c(测速)、pid.c(PI控制器)
逻辑层:main.c 主循环
以MOTOR CONTROL为例,借用STM32 自动生成的MOTOR 控制程序。
extern TIM_HandleTypeDef htim1;
void MOTOR_SetMode(Motor_Mode_t mode, uint16_t duty){
if(duty > PWM_MAX) duty = PWM_MAX;
if(duty < PWM_MIN) duty = PWM_MIN;
switch(mode)
{
case MOTOR_FORWARD:
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET);
\__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, duty);
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
break;
case MOTOR_BACKWARD:
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_SET);
\__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, duty);
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
break;
case MOTOR_STOP_BRAKE:
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET);
\__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 0);
HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_1);
break;
case MOTOR_STOP_COAST:
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_SET);
\__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, PWM_MAX);
HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_1);
break;
default: MOTOR_Brake(); break;
}}
void MOTOR_Brake(void){
MOTOR_SetMode(MOTOR_STOP_BRAKE, 0);}
void MOTOR_Coast(void){
MOTOR_SetMode(MOTOR_STOP_COAST, 0);}
- STM32 调试
本次为7.5V直流电机调速,通过直接修改 PWM 占空比,无转速反馈,结构简单,负载变化转速波动大。
