PWM(脉宽调制)调压调速是直流电机控制中最常用的方法之一,它通过快速开关电源来控制电机的平均电压,从而实现调速。
PWM调速工作原理:通过改变脉冲宽度(占空比)来调节电机的平均电压
占空比 = 导通时间 / 周期时间
平均电压 = 电源电压 × 占空比
PWM调速优点:效率高(开关损耗小);调速范围宽;控制简单;可实现数字控制。
PWM调速实现方式主要有
1. H桥PWM控制,可实现正反转和调速,四种工作模式:正向驱动,反向驱动,正向制动,反向制动
2. 单极性PWM控制,一个开关管工作于PWM模式,另一个常通适用于单向调速
3. 双极性PWM控制,两个开关管同时工作于PWM模式,可快速响应,减少电流波动
PWM频率选择:一般1kHz-20kHz,高频可减少噪声和电流波动,但开关损耗增加
占空比调节:0%-100%可调,实际应用中需考虑死区时间
实际应用考虑因素
电机特性匹配:启动电流限制,反电动势处理,
保护电路:过流保护,过压保护,温度保护
滤波电路:减少PWM谐波对电源的干扰
控制算法:开环控制(简单应用),闭环控制(带速度/位置反馈)
典型应用电路
[电源] → [PWM控制器] → [驱动电路] → [H桥] → [电机]
↑
[控制信号]
基础代码
#define MOTOR_PIN P1_0
unsigned char pwm_duty = 50; // 占空比 0-100
unsigned char pwm_counter = 0;
// 定时器0初始化
void timer0_init() {
TMOD |= 0x01; // 设置定时器0为模式1
TH0 = 0xFF; // 设置定时初值
TL0 = 0x9C; // 约100us中断一次
ET0 = 1; // 开启定时器0中断
EA = 1; // 开启总中断
TR0 = 1; // 启动定时器0
}
// 定时器0中断服务函数
void timer0_isr() interrupt 1 {
TH0 = 0xFF; // 重新加载初值
TL0 = 0x9C;
pwm_counter++;
if(pwm_counter >= 100) {
pwm_counter = 0;
}
if(pwm_counter < pwm_duty) {
MOTOR_PIN = 1; // 开启电机
} else {
MOTOR_PIN = 0; // 关闭电机
}
}
带PID控制的PWM调速
#define MOTOR_PIN P1_0
#define ENCODER_PIN P3_2 // 编码器输入
unsigned char pwm_duty = 0;
unsigned int actual_speed = 0;
unsigned int target_speed = 1000; // 目标转速(根据编码器脉冲计算)
// PID参数
float Kp = 0.5, Ki = 0.01, Kd = 0.1;
float error = 0, last_error = 0, integral = 0, derivative = 0;
// 定时器初始化
void timer_init() {
// 初始化代码...
}
// 编码器计数中断
void encoder_isr() interrupt 0 {
actual_speed++; // 简单计数,实际应根据时间计算转速
}
// PID计算
void pid_control() {
last_error = error;
error = target_speed - actual_speed;
integral += error;
if(integral > 100) integral = 100;
if(integral < -100) integral = -100;
derivative = error - last_error;
pwm_duty = Kp * error + Ki * integral + Kd * derivative;
if(pwm_duty > 100) pwm_duty = 100;
if(pwm_duty < 0) pwm_duty = 0;
actual_speed = 0; // 重置计数
}
注意事项
PWM频率选择要合适,通常1kHz-20kHz之间
电机启动时需要较大电流,可能需要特殊处理
加入死区时间防止H桥上下管直通
实际项目中需要考虑电机保护(过流、过热等)
|