目录
stm32 PWM学习专题二(直流电机驱动)
一、直流电机基础
1)直流电机基本原理
- 核心结构
- 定子:产生固定磁场(永磁体或电磁铁)
- 转子(电枢):通电线圈在磁场中受力旋转
- 换向器与电刷:机械切换电流方向,维持转子持续转动
- 工作原理
- 电磁力定律:通电导体在磁场中受力 F = BILsinθ
- 右手定则:确定力的方向(区分左右定则和右手螺旋定则)相关学习链接
- 能量转换
- 电能 → 磁能 → 机械能
- 反电动势(Back EMF):转子旋转时产生
2)直流电机正反转控制
- 方法一:切换电源极性(H桥电路)
- 正传 A → B
- 反转 B → A
- 方法二:PWM控制(无需切换极性)
- 通过改变PWM占空比调整有效电压方向
// 正转:PA8高,PB13低 GPIO_SetBits(GPIOA, GPIO_Pin_8); // CH1高 GPIO_ResetBits(GPIOB, GPIO_Pin_13); // CH1N低 // 反转:PA8低,PB13高 GPIO_ResetBits(GPIOA, GPIO_Pin_8); GPIO_SetBits(GPIOB, GPIO_Pin_13);
3)直流电机停止控制
- 自由停止(Coasting)
- 操作:断开电源
- 特点:电机惯性滑行至停止,无制动力。
- 制动停止(Braking)
- 短路制动:将电机两端短接,反电动势产生阻尼。
- 反向电压制动:短暂施加反向电压。
- 特点:快速停止,但可能产生电流冲击。
// 正转:PA8高,PB13低 // 短路制动:PA8和PB13均输出低 GPIO_ResetBits(GPIOA, GPIO_Pin_8); GPIO_ResetBits(GPIOB, GPIO_Pin_13);
4)直流电机调速原理
-
方法一:通过PWM占空比控制平均电压
特点:- 低速时效率高(相比电阻调速)
- 需配合续流二极管保护电路
-
方法二:调节励磁电流(仅对他励电机有效)
原理:减弱定子磁场可升速,但扭矩降低。 -
方法三:闭环调速(PID控制)
传感器:编码器测速 → 反馈调整PWM占空比。float PID_Control(float target_rpm, float current_rpm) { static float integral = 0, prev_error = 0; float error = target_rpm - current_rpm; integral += error; float derivative = error - prev_error; prev_error = error; return Kp*error + Ki*integral + Kd*derivative; // 输出PWM占空比 }
5)关键公式和注意点
- 关键公式
- 注意点
- H桥保护:必须添加死区时间防止上下管直通。
- 反电动势处理:高速急停时可能损坏电路,需加泄放回路。
- 启动电流:初始电流大,可软启动(逐步增加PWM占空比)。
二、实验
1)使用PWM驱动直流电机
- 能用单片机输出一个PWM信号,驱动电机实现正转、反转、停止,能够实现对直流电机的调速。
- 关键代码:
void Motor_Init(void){ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); PWM_Init(); } void Motor_SetSpeed(float speed){ if(speed >= 0 ){ GPIO_SetBits(GPIOA, GPIO_Pin_4); GPIO_ResetBits(GPIOA, GPIO_Pin_5); PWM_SetCompare3(speed); }else{ GPIO_SetBits(GPIOA, GPIO_Pin_5); GPIO_ResetBits(GPIOA, GPIO_Pin_4); PWM_SetCompare3(-speed); } if(speed == 9900){ //急停模式 GPIO_ResetBits(GPIOA, GPIO_Pin_5); GPIO_ResetBits(GPIOA, GPIO_Pin_4); } if(speed == -9900){ //缓停模式 PWM_SetCompare3(0); } }