Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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 对象