1.2 PWM驱动开发
PWM介绍
PWM(Pulse Width Modulation) 是一种通过调节脉冲宽度(占空比)来模拟不同模拟量输出的数字控制技术。它利用数字信号(高/低电平)控制模拟电路,广泛应用于电机调速、电源转换、LED调光等领域。其核心是通过调整脉冲的“有效时间比例”实现连续可调的电压、功率或信号输出
PWM 最关键的两个参数:频率和占空比。
频率是指单位时间内脉冲信号的周期数。比如开关灯,开关一次算一次周期,在 1s 进行多少次开关(开关一次为一个周期)。
占空比是指一个周期内高电平时间和低电平时间的比例。也拿开关当作例子,总共 100s,开了 50s 灯(高电平),关了 50s 灯(低电平),这时候的占空比就为 50%(比例)。
PWM核心特性
1.占空比可变
- 占空比越大,等效输出电压越高(例:占空比50% ≈ 最大电压的50%)
2.数字模拟转换能力
- 微控制器通过输出高频方波(如10kHz),配合滤波电路,可生成平滑的模拟电压(如0-5V连续可调)
3.控制灵活性强
- 频率可调:适应不同负载需求(电机控制常用6-16kHz,LED调光>80Hz避频闪)
- 动态响应快:占空比可实时调整(如根据传感器反馈调节电机转速)
PWM控制原理和工作过程
关键参数
- 周期(T):一个完整脉冲的时间(单位:秒)。
- 频率(f):周期的倒数(f=1/T),决定信号切换速度。
- 脉宽时间(tW):高电平持续时间,直接决定占空比
PWM波形生成过程
1.周期设定
- 通过定时器计数器设定周期值(PWM定时器的工作方式有点像一个精准的节拍器。它的核心是一个计数器,从0开始计数,数到某个设定值(称为模数)后清零,循环往复。这个模数决定了PWM信号的周期)
- 举例:假设模数设为9,计数器会从0数到9,总共10个状态,构成一个完整的周期。
- PWM定时器通常会有个预分频器,用来把主时钟频率降低,方便控制计数器的速度,这里我们假设主时钟频率24 MHz,预分频器可选1、2、4、8、16、32、64、128
- 预分频器的值决定了计数器的时钟频率,计数器的时钟频率 = 主时钟频率 / 预分频器的值
- 当预分频器设为8,计数器的时钟频率为24 MHz / 8 = 3 MHz
2.脉宽调制
- 设置“宽度寄存器”值W控制高电平时间,这里我们还是以上面的例子继续讲解:
- 我们需求电机静止脉宽:1.5毫秒,最大顺时针速度脉宽:1毫秒,最大逆时针速度脉宽:2毫秒
- 脉宽时间tW = W × 0.333微秒,W是宽度寄存器的值,由此
- 电机静止:1.5毫秒 ÷ 0.333微秒 ≈ 4500
- 最大顺时针速度:1毫秒 ÷ 0.333微秒 ≈ 3000
- 最大逆时针速度:2毫秒 ÷ 0.333微秒 ≈ 6000
飞腾派PWM硬件实现
飞腾派集成的 PWM 控制器支持典型的 PWM 功能,有 2 个完全独立的 compare 输出通道。使用 PWM 功能前,需要先配置相关 PAD 复用寄存器,将对应 PAD 配置到对应功能上,即可使用 PWM 功能。
飞腾派PWM硬件模块
模块 | 功能 |
---|---|
PWM控制器核心模块(处理器内置) | 支持compare输出模式,提供寄存器、FIFO双模式驱动,并支持中断控制:计数器溢出、比较匹配、FIFO空中断 |
死区生成器 | 防短路保护,并提供了Bypass(原始信号直通)、FallEdgeOnly(只添加下降沿延迟)、RiseEdgeOnly(只添加上升沿延迟)、FullDeadband(双边延迟)四种工作模式(由DBDLY和DBCTRL控制) |
飞腾派PWM驱动API调用表
API函数 | 描述 | 参数 | 返回值 |
---|---|---|---|
PwmDriver::new | 创建 PWM 驱动实例并映射硬件寄存器。 | base_addr: PWM 控制器的物理基地址 | 初始化的 PwmDriver 对象 |
configure_channel | 配置 PWM 通道参数 | channel: PWM 通道号 (0-7)、config: PwmConfig 结构体,包含:frequency: PWM 频率 (Hz)、duty_cycle: 占空比 (0.0-1.0)、counting_mode: 计数模式 (Modulo/UpAndDown)、deadtime_ns: 死区时间 (纳秒)、use_fifo: 是否使用 FIFO 模式 | Option:成功:Ok(());失败:错误信息(如无效通道、占空比越界等) |
init_fifo_mode | 初始化 FIFO 模式 | channel: PWM 通道号、 initial_duty: 初始占空比值 | Option:成功:Ok(());失败:错误信息 |
push_fifo_data | 向 FIFO 推送占空比数据 | channel: PWM 通道号;duty_value: 16 位占空比值 | Option:成功:Ok(());失败:错误信息 |
enable_channel | 启用 PWM 通道输出 | channel: PWM 通道号 | 无 |
safe_stop_channel | 安全停止 PWM 输出(防电源瞬变) | channel: PWM 通道号 | 无 |
enable_multiple_channels | 同时启用多个 PWM 通道 | mask: 通道掩码(bit0=通道0, bit1=通道1, ...) | 无 |
handle_interrupt | 处理 PWM 中断 | 无 | 无 |
pwm_init | 初始化 PWM 控制器(高级封装) | base_addr: PWM 控制器物理基地址 | 初始化的 PwmDriver 对象 |