4、理想PWM波形生成:方波生成、占空比调节、频率变化、死区时间插入
好,咱们进入正题。这一章讲的是PWM波形的理想生成,说白了就是怎么在数字电路里造出那个方波信号。你想想看,电机控制好不好,很大程度上就取决于这个PWM波形干不干净。我做了这么多年电机驱动,踩过的坑有一半都跟波形质量有关。
4.1 方波生成——从0到1的跳跃
方波生成是PWM的基础。在数字电路里,我们通常用计数器加比较器来实现。原理很简单:计数器从0开始往上数,数到某个值就翻转电平。
我个人习惯用这种结构:
// 伪代码示例:方波生成核心逻辑
always @(posedge clk) begin
if (counter == PERIOD) begin
counter <= 0;
pwm_out <= ~pwm_out; // 翻转电平
end else begin
counter <= counter + 1;
end
end
这里有个细节要注意——计数器的位宽决定了频率分辨率。比如你用8位计数器,那频率就只能调256档。我在项目中遇到过用10位计数器结果频率精度不够的情况,后来换成了12位才解决问题。
核心要点:方波生成的关键是计数器溢出时翻转输出。溢出频率 = 时钟频率 / (PERIOD + 1) / 2。
4.2 占空比调节——让方波学会说话
方波只会傻傻地50%占空比来回翻,这显然不够用。我们需要调节高电平的时间比例,这就是占空比调节。
实现方式其实就是在计数器的基础上加一个比较值:
// 占空比可调PWM生成
always @(posedge clk) begin
if (counter == PERIOD) begin
counter <= 0;
end else begin
counter <= counter + 1;
end
// 比较器决定输出电平
if (counter < DUTY_CYCLE) begin
pwm_out <= 1'b1;
end else begin
pwm_out <= 1'b0;
end
end
嗯,这里要注意:DUTY_CYCLE的值范围是0到PERIOD。当DUTY_CYCLE=0时,输出一直为低;等于PERIOD时,输出一直为高。我曾经犯过一个低级错误——把DUTY_CYCLE设成了PERIOD+1,结果波形直接卡死了。
我的经验:实际项目中,占空比调节建议用线性映射。比如你要控制0-100%的占空比,那就把输入值映射到0-PERIOD的范围。我习惯用乘法器做映射,精度高一些。
4.3 频率变化——别让电机转得忽快忽慢
频率变化其实就是在改变PERIOD的值。PERIOD越大,频率越低;PERIOD越小,频率越高。公式很简单:
PWM频率 = 时钟频率 / (PERIOD + 1)
举个例子:时钟50MHz,PERIOD=999,那PWM频率就是50kHz。如果你想调到20kHz,PERIOD就得改成2499。
但这里有个坑——频率变化时占空比会跟着变。为什么?因为占空比是DUTY_CYCLE/PERIOD的比值。你改了PERIOD,如果不调整DUTY_CYCLE,占空比就变了。
我建议的做法是:
- 先确定目标频率,算出PERIOD
- 根据目标占空比,重新计算DUTY_CYCLE
- 同时更新两个寄存器
警告:千万不要在PWM输出高电平的中间时刻改变PERIOD!否则会产生一个异常长的脉冲,电机可能会突然抖动一下。我吃过这个亏,后来加了同步更新逻辑才解决。
4.4 死区时间插入——保护你的功率管
这是本章的重头戏。死区时间,说白了就是上下桥臂同时关断的那段时间。为什么要这么做?因为功率管从导通到关断需要时间,如果上管还没完全关断下管就导通了,那就直通短路了。
死区时间的插入逻辑:
// 带死区时间的互补PWM生成
// pwm_high 和 pwm_low 是互补输出
always @(posedge clk) begin
// 原始PWM信号
if (counter < DUTY_CYCLE) begin
pwm_raw <= 1'b1;
end else begin
pwm_raw <= 1'b0;
end
// 插入死区:上升沿延迟DEAD_TIME个时钟周期
pwm_high <= pwm_raw;
pwm_low <= ~pwm_raw_delayed; // 延迟后的信号取反
end
死区时间的大小怎么定?我一般按这个原则:
| 功率管类型 | 推荐死区时间 | 说明 |
|---|---|---|
| MOSFET(低压) | 50-200ns | 开关速度快,死区可以小 |
| IGBT(高压) | 1-3μs | 开关速度慢,死区要大 |
| SiC/GaN | 20-100ns | 超快开关,但死区太小容易炸管 |
避坑指南:我曾经在一个项目中把死区时间设得太小,结果上电瞬间就炸了两个IGBT模块,一个模块好几千块啊!从那以后,我定死区时间都会留50%的余量。
4.5 知识体系总览
下面这张图把本章的核心逻辑串起来了,你看看就明白了:
这张图把整个流程串起来了。你从左边时钟源开始,经过计数器、比较器,再到死区插入,最后输出互补的PWM_H和PWM_L。每一步都有对应的参数可以调节。
最后说一句:理想PWM波形在实际电路中是不存在的。上升沿有振铃,下降沿有拖尾,死区时间还会造成电压损失。但这些是后面章节要讲的内容了。先把理想的搞明白,后面处理非理想情况时你心里才有底。
公众号:蓝海资料掘金营,微信deep3321