RTOS_PWM使用参考
REVISION HISTORY¶
Revision No. | Description |
Date |
---|---|---|
1.0 | 04/09/2025 |
1. 概述¶
PWM (Pulse Width Modulation) 模块用于产生脉宽波形,可通过改变频率和占空比来改变输出的电流、电压进而实现控制电机转速、液晶屏调光等功能;SigmaStar的PWM模块同时具备Group功能(细分为sync 、round、hold、stop),即每4个或者6个channel的PWM可绑定成一组,实现4路或6路PWM同步产生或停止。
设备和硬件组别的关系如下表所示:
PWM Group | bank addr | Channel |
---|---|---|
HW PWM group0 | 1119H | channel 0 ~ 3 |
HW PWM group1 | 111AH | channel 4 ~ 7 |
HW PWM group2 | 111CH | channel 8 ~ 11 |
HW PWM group3 | 112BH | channel 12 ~ 16 |
2. 关键字¶
sysdesc:
RTOS用于描述外设硬件属性的文件,外设节点中包含的属性值可用于外设的配置, 类似于linux的设备树文件。
padmux:
引脚复用,用于将模块功能引脚连接到具体的外部引脚上面,打通信号连接。
Dead Time:
PWM 死区时间(Dead Time)是指在PWM信号切换过程中,两个相邻的输出信号之间存在的时间间隔。它用于防止功率开关器件(如MOSFET或IGBT)在切换过程中同时导通,从而避免短路和损坏。
3. 功能描述¶
3.1. 概述¶
-
支持PWM的channel数量为20个,其中channel 0~17支持加入各自的Group,详见Group与channel对应关系
-
PWM channel 12~17支持最大设定值为(OSCCLK / 0x3FF)的Dead Time设定及刹车功能,例如OSCCLK = 12MHz,则范围是0~85250ns
-
支持double buffer来防止产生错误波形,即波形会等待当前波形完全生成之后更新
-
支持shift功能,即波形可以设置相位,相位会影响占空比,实际占空比 = 设置占空比 - 相位
-
支持sync功能,即Group内的PWM在同一个时刻产生波形,一般一组Group中会包含4个channel的PWM
-
支持round功能,即同Group内的PWM会在产生特定数量的脉冲后停止
-
支持hold功能,即同Group内的PWM会在完成当前周期的波形后暂停,常用于改变波形的设定,可设定暂停时间内的高低电平
-
支持stop功能,即同Group内的PWM会紧急停止
3.2. 频率和占空比¶
-
频率(frequency)
每秒钟信号从高电平到低电平再回到高电平的次数。
-
占空比(duty cycle)
高电平持续时间和低电平持续时间之间的比例。
-
举例说明
假设PWM的OSCCLK频率为12M,那么可设置的频率范围为:0.0007Hz~6MHz;
设定PWM0和PWM1为频率120Hz,占空比25%的波形,且PWM1相对于PWM0有180°的相位偏移,那么各参数配置如下:
period duty shift PWM0 120Hz 25% 0% PWM1 120Hz 75% 50% 对于channel 0~17支持的OSCCLK(Hz)为:86M、24M、12M、6M、3M、1.5M、750K;
PWM的工作频率范围是(OSCCLK/2)到(OSCCLK/2^34),实际工作频率范围如下:
clk-freq PWM freq range 86MHz 0.0050Hz ~ 43MHz 24MHz 0.0013Hz ~ 12MHz 12MHz 0.0007Hz ~ 6MHz 6MHz 0.00035Hz ~ 3MHz 3MHz 0.00017Hz ~ 1.5Mhz 1.5MHz 0.000087Hz ~ 750KHz 750KHz 0.000044Hz ~ 375KHz 产生的波形如下图:
3.3. 普通精度模式¶
rtos config中不开启CONFIG_SSTAR_PWM_EXTEND
,则使用普通精度模式,该模式下配置PWM的period的单位为Hz,duty cycle的单位为百分比。
假设要设置PWM0频率为10000HZ,占空比为50%,则:
period = 10000
duty cycle = 50
3.4. 高精度模式¶
rtos config中开启CONFIG_SSTAR_PWM_EXTEND
选项时,则使用高精度模式,该模式下配置PWM的period和duty_cycle均使用纳秒为单位,所以要先计算周期和占空比的值。
假设要设置PWM0频率为10000.5HZ,占空比为49.5%,则:
period = 10^9 ÷ 10000.5 = 99995
duty cycle = 99995 * 49.5% = 49498
由此可见,高精度模式的优势在于参数设定支持到小数。
3.5. GROUP相关概念¶
3.5.1. Sync mode¶
sync mode可以将每个pwm channel加入到各自的Group群组中,完成同时对多个PWM进行控制的目的,一个Group有4个pwm channel,且Group与channel对应关系如下:
Group | Group Member |
---|---|
Group0 | PWM0、PWM1、PWM2、PWM3 |
Group1 | PWM4、PWM5、PWM6、PWM7 |
Group2 | PWM8、PWM9、PWM10、PWM11 |
Group3 | PWM12、PWM13、PWM14、PWM15、PWM16、PWM17 |
3.5.2. Hold mode¶
Group的Hold功能会在pwm完成当前周期的波形后停止,并触发中断,此时可以改变各channel波形的配置以保持同步,完成修改后会关闭hold 功能,pwm就会重新产生新的波形,每组group都有自己独立的hold功能。
3.5.3. Round mode¶
round功能会在同group内的所有channel完成一定数量的脉冲后停止,每组group都有自己独立的round功能。
3.5.4. Stop mode¶
stop功能可以让当前group中的PWM立即停止(不会等当前周期完成)并维持结束时的电平,每组group都有自己独立的stop功能。
注意:stop 时间不建议太长,尤其是pwm停止后维持的电平为高电平时。
3.6. 死区时间¶
基于两路互补信号产生Dead Time,正向信号基于PWM clock的相对上升沿产生delay,反向信号基于PWM clock的相对下降沿产生delay
4. RTOS用法介绍¶
4.1 DRIVER PATH¶
sc/driver/sysdriver/pwm/drv/pub/drv_pwm.h sc/driver/sysdriver/pwm/drv/src/drv_pwm.c sc/driver/sysdriver/pwm/drv/src/drv_pwm_test.c sc/driver/sysdriver/pwm/hal/chipname/src/hal_pwm.c sc/driver/sysdriver/pwm/hal/chipname/inc/hal_pwm.h sc/driver/sysdriver/pwm/hal/chipname/inc/hal_pwm_cfg.h
4.2. CONFIG配置¶
#make menuconfig # Feature_Name = [DRV] PWM driver support # Description = PWM driver support # Option_Selection = TRUE, FALSE CONFIG_PWM_SUPPORT = TRUE //使能PWM驱动 CONFIG_SSTAR_PWM_DDT = TRUE //使能dead time功能 CONFIG_SSTAR_PWM_EXTEND = TRUE //TRUE:高精度模式,FLASE:低精度模式
4.3 SYSDESC配置¶
chipname_xxx.sys
文件是用于描述外设硬件属性的文件,外设节点中包含的属性值可用于外设的配置,类似Linux的设备树,该文件位于sc/driver/sysdriver/sysdesc/hal/chipname/pub
, 下文以pwm12举例:
<pwm12> [reg_u32_u16] 0x1F205600 0x40; [interrupts_u32] INT_IRQ_PWM_GROUP3; [camclk_u16] CAMCLK_pwm; [group_u32] 3; [spwm_group_u32] 0xFFFF; [clk_level_u8] 0; [ddt_reg_u32] 0x1F203600; [idle_status_u8] 0, 0; [padmux_u16] PINMUX_FOR_UNKNOWN_MODE; [status_u8] 1;
pwm驱动中支持配置的属性如下表:
属性 | 描述 | 设定值 | 备注 |
---|---|---|---|
reg_u32_u16 | 指定pwm bank地址 | 0x2205600 | 禁止修改 |
interrupts_u32 | 指定硬件中断号 | INT_IRQ_PWM_GROUP3 | 禁止修改 |
camclk_u16 | 指定时钟源 | CAMCLK_pwm | 禁止修改 |
group_u32 | 选择是否加入group | 按照Group与channel对应关系赋值相应的group index,0xFFFF表示不加入 | 可根据需要修改,加入group或加入spwm group只能二选一 |
spwm_group_u32 | 选择是否加入spwm group | 0xFFFF | 加入group或加入spwm group只能二选一 |
clk_level_u8 | 选择时钟源 | pwm017可选06分别对应12M/6M/3M/1.5M/750K/86M/ 24M | pwm0~17选择必须一致 |
ddt_reg_u32 | 指定dead time bank地址 | 0x2203600 | 禁止修改 |
idle_status_u8 | 选择dead time波形idle时的电平状态 | 0-低电平;1-高电平 | 可根据需要修改 |
status_u8 | 选择是否使能驱动 | 1:enable;0:disable | 可根据需要修改 |
4.4 PADMUX配置¶
CONFIG配置:CONFIG_PADMUX_SUPPORT=TRUE
如果chipname_xxx.sys
文件配置了属性<padmux>
,那么PADMUX的设定直接在此配置:
<padmux> [schematic_u32_u32_u32] PAD_GPIOC_00 PINMUX_FOR_PWM0_MODE_1 MDRV_PUSE_PWM0, PAD_GPIOC_01 PINMUX_FOR_PWM1_MODE_1 MDRV_PUSE_PWM1, PAD_GPIOC_02 PINMUX_FOR_PWM2_MODE_1 MDRV_PUSE_PWM2, PAD_GPIOC_03 PINMUX_FOR_PWM3_MODE_1 MDRV_PUSE_PWM3, PAD_GPIOC_04 PINMUX_FOR_PWM4_MODE_1 MDRV_PUSE_PWM4, PAD_GPIOC_05 PINMUX_FOR_PWM5_MODE_1 MDRV_PUSE_PWM5, PAD_GPIOC_06 PINMUX_FOR_PWM6_MODE_1 MDRV_PUSE_PWM6, PAD_GPIOC_07 PINMUX_FOR_PWM7_MODE_1 MDRV_PUSE_PWM7, PAD_GPIOC_08 PINMUX_FOR_PWM8_MODE_1 MDRV_PUSE_PWM8, PAD_OUTP_CH0 PINMUX_FOR_PWM9_MODE_1 MDRV_PUSE_PWM9, PAD_GPIOA_00 PINMUX_FOR_PWM10_MODE_2 MDRV_PUSE_PWM10, PAD_GPIOA_01 PINMUX_FOR_PWM11_MODE_2 MDRV_PUSE_PWM11, PAD_GPIOA_02 PINMUX_FOR_PWM12_MODE_2 MDRV_PUSE_PWM12, PAD_GPIOA_03 PINMUX_FOR_PWM13_MODE_2 MDRV_PUSE_PWM13, PAD_GPIOA_04 PINMUX_FOR_PWM14_MODE_2 MDRV_PUSE_PWM14, PAD_GPIOA_05 PINMUX_FOR_PWM15_MODE_2 MDRV_PUSE_PWM15, PAD_GPIOA_06 PINMUX_FOR_PWM16_MODE_2 MDRV_PUSE_PWM16, PAD_GPIOA_07 PINMUX_FOR_PWM17_MODE_2 MDRV_PUSE_PWM17, //dead time PAD_GPIOE_17 PINMUX_FOR_PWM_COMP0_MODE_1 MDRV_PUSE_PWMOUT0_P, PAD_GPIOE_18 PINMUX_FOR_PWM_COMP0_MODE_1 MDRV_PUSE_PWMOUT0_N, PAD_GPIOE_23 PINMUX_FOR_PWM_COMP1_MODE_1 MDRV_PUSE_PWMOUT1_P, PAD_GPIOE_24 PINMUX_FOR_PWM_COMP1_MODE_1 MDRV_PUSE_PWMOUT1_N, PAD_GPIOA_00 PINMUX_FOR_PWM_COMP2_MODE_1 MDRV_PUSE_PWMOUT2_P, PAD_GPIOA_01 PINMUX_FOR_PWM_COMP2_MODE_1 MDRV_PUSE_PWMOUT2_N, PAD_GPIOA_08 PINMUX_FOR_PWM_COMP3_MODE_2 MDRV_PUSE_PWMOUT3_P, PAD_GPIOA_09 PINMUX_FOR_PWM_COMP3_MODE_2 MDRV_PUSE_PWMOUT3_N, PAD_EMMC_RST PINMUX_FOR_PWM_COMP4_MODE_1 MDRV_PUSE_PWMOUT4_P, PAD_EMMC_CLK PINMUX_FOR_PWM_COMP4_MODE_1 MDRV_PUSE_PWMOUT4_N, PAD_EMMC_D0 PINMUX_FOR_PWM_COMP5_MODE_1 MDRV_PUSE_PWMOUT5_P, PAD_EMMC_D5 PINMUX_FOR_PWM_COMP5_MODE_1 MDRV_PUSE_PWMOUT5_N, //break PAD_GPIOA_12 PINMUX_FOR_PWM_INT_MODE_1 MDRV_PUSE_PWMADC_INT, PAD_GPIOA_13 PINMUX_FOR_PWM_INT_MODE_1 MDRV_PUSE_PWMOUT_INT; [status_u8] 1;
第一列为引脚索引号,可以在sc/drivers/sysdriver/gpio/hal/chipname/pub/gpio.h
中查询;
第二列为模式定义,可以在sc/drivers/sysdriver/gpio/hal/chipname/pub/padmux.h
中查询;
第三列为引脚及搭配模式的索引名称,可以在sc/drivers/sysdriver/padmux/drv/pub/drv_puse.h
中查询
4.5 DEMO¶
demo源码位于sc/driver/sysdriver/pwm/drv/src/drv_pwm_test.c
5. API 参考¶
该功能模块提供以下接口
API名 | 功能 |
---|---|
drv_pwm_set_period | 设置pwm周期 |
drv_pwm_set_duty | 设置pwm占空比 |
drv_pwm_set_shift | 设置pwm相位偏移 |
drv_pwm_set_polarity | 设置pwm极性 |
drv_pwm_set_chan_config | 配置pwm指定通道的属性 |
drv_pwm_get_chan_config | 获取当前pwm通道的属性 |
drv_pwm_channel_enable | 使能pwm配置 |
drv_pwm_set_group_config | 配置group属性 |
drv_pwm_get_group_config | 获取当前group的属性配置 |
drv_pwm_group_enable | 使能pwm group功能 |
drv_pwm_stop_enable | 使能stop功能 |
drv_pwm_round_enable | 设置round mode的脉冲数量 |
drv_pwm_update_enable | 更新pwm配置 |
drv_pwm_set_deadtime | 配置pwm指定通道的dead time |
drv_pwm_ddt_enable | 使能pwm指定通道的dead time功能 |
drv_pwm_ddt_break | 使能死区波形的刹车功能 |
头文件位于sc/driver/sysdriver/pwm/drv/pub/drv_pwm.h
struct pwm_ch_cfg { u64 duty; //设定占空比,实际占空比=duty-shift u64 shift; //设定起始相位 u64 period; //设定周期 u32 polarity; //极性设置:0-正常,1-极性取反 u32 channel; //指定channel }; struct pwm_gp_cfg { u64 duty; u64 shift; u8 polar; u32 group; u64 period; };
5.1. drv_pwm_set_period¶
-
功能
设置pwm周期
-
语法
int drv_pwm_set_period(u32 channel, u64 period, u8 sync)
-
参数
参数名称 描述 channel 选择pwm的通道 period pwm周期,高精度模式以ns为单位,低精度模式以Hz为单位 sync 0表示配置在此次接口调用后生效,1表示此次接口调用后不生效,生效需要调用drv_pwm_update_enable接口 -
返回值
返回值 描述 0 成功 负数 失败
5.2. drv_pwm_set_duty¶
-
功能
设置pwm占空比
-
语法
drv_pwm_set_duty(u32 channel, u64 duty, u8 sync)
-
参数
参数名称 描述 channel 选择pwm的通道 duty pwm占空比,高精度模式以ns为单位,低精度模式以Hz为单位 sync 0表示配置在此次接口调用后生效,1表示此次接口调用后不生效,生效需要调用drv_pwm_update_enable接口 -
返回值
返回值 描述 0 成功 负数 失败
5.3. drv_pwm_set_shift¶
-
功能
设置pwm相位偏移
-
语法
int drv_pwm_set_shift(u32 channel, u64 shift, u8 sync)
-
参数
参数名称 描述 channel 选择pwm的通道 shift pwm相位偏移,高精度模式以ns为单位,低精度模式以Hz为单位 sync 0表示配置在此次接口调用后生效,1表示此次接口调用后不生效,生效需要调用drv_pwm_update_enable接口 -
返回值
返回值 描述 0 成功 负数 失败
5.4. drv_pwm_set_polarity¶
-
功能
设置pwm极性
-
语法
int drv_pwm_set_polarity(u32 channel, u64 polar, u8 sync)
-
参数
参数名称 描述 channel 选择pwm的通道 polar pwm极性,0:normal,1:invert sync 0表示配置在此次接口调用后生效,1表示此次接口调用后不生效,生效需要调用drv_pwm_update_enable接口 -
返回值
返回值 描述 0 成功 负数 失败
5.5. drv_pwm_set_chan_config¶
-
功能
配置pwm指定通道的属性
-
语法
int drv_pwm_set_chan_config(struct pwm_ch_cfg * pwm_ch)
-
参数
参数名称 描述 pwm_ch 用于配置pwm的通道、周期、占空比、相位偏移和极性信息 -
返回值
返回值 描述 0 成功 负数 失败
5.6. drv_pwm_get_chan_config¶
-
功能
获取当前pwm通道的属性
-
语法
int drv_pwm_get_chan_config(struct pwm_ch_cfg * pwm_ch)
-
参数
参数名称 描述 pwm_ch 用于获取pwm的通道、周期、占空比、相位偏移和极性信息 -
返回值
返回值 描述 0 成功 负数 失败
5.7. drv_pwm_channel_enable¶
-
功能
使能pwm配置
-
语法
int drv_pwm_channel_enable(u32 channel, u8 enable)
-
参数
参数名称 描述 channel 选择pwm的通道 enable 1:enable,0:disable -
返回值
返回值 描述 0 成功 负数 失败
5.8. drv_pwm_set_group_config¶
-
功能
配置group属性
-
语法
int drv_pwm_set_group_config(struct pwm_gp_cfg *pwm_gp)
-
参数
参数名称 描述 pwm_gp 用于配置pwm group的通道、周期、占空比、相位偏移和极性信息,生效需要调用drv_pwm_update_enable接口 -
返回值
返回值 描述 0 成功 负数 失败
5.9. drv_pwm_get_group_config¶
-
功能
获取当前group的属性配置
-
语法
int drv_pwm_get_group_config(struct pwm_gp_cfg *pwm_gp)
-
参数
参数名称 描述 pwm_gp 用于获取pwm group的通道、周期、占空比、相位偏移和极性信息 -
返回值
返回值 描述 0 成功 负数 失败
5.10. drv_pwm_group_enable¶
-
功能
使能pwm group功能
-
语法
int drv_pwm_group_enable(u32 group, u8 enable)
-
参数
参数名称 描述 group 选择要使能pwm波形的group enable 1:enable,0:disable -
返回值
返回值 描述 0 成功 负数 失败
5.11. drv_pwm_stop_enable¶
-
功能
使能stop功能
-
语法
int drv_pwm_stop_enable(u32 group, u8 stop_en)
-
参数
参数名称 描述 group 选择要使能停止功能的group stop_en 1:enable,波形停止;0:disable,波形恢复 -
返回值
返回值 描述 0 成功 负数 失败
5.12. drv_pwm_round_enable¶
-
功能
设置round mode的脉冲数量
-
语法
int drv_pwm_round_enable(u32 group, u32 round_num)
-
参数
参数名称 描述 group 选择使能round mode的group round_num 指定输出PWM波形的周期数 -
返回值
返回值 描述 0 成功 负数 失败
5.13. drv_pwm_update_enable¶
-
功能
更新pwm配置
-
语法
int drv_pwm_update_enable(u32 group)
-
参数
参数名称 描述 group 选择要进行参数更新的group -
返回值
返回值 描述 0 成功 负数 失败
5.14. drv_pwm_set_deadtime¶
-
功能
配置pwm指定通道的dead time
-
语法
int drv_pwm_set_deadtime(u32 channel, u64 p_ddt, u64 n_ddt)
-
参数
参数名称 描述 channel 选择要配置dead time的pwm通道 p_ddt 指定pwm通道正向波形的死区时间,以ns为单位 n_ddt 指定pwm通道反向波形的死区时间,以ns为单位 -
返回值
返回值 描述 0 成功 负数 失败
5.15. drv_pwm_ddt_enable¶
-
功能
使能pwm指定通道的dead time功能
-
语法
int drv_pwm_ddt_enable(u32 channel, u8 enable)
-
参数
参数名称 描述 channel 选择要配置dead time的pwm通道 enable 1:enable,0:disable -
返回值
返回值 描述 0 成功 负数 失败
5.16. drv_pwm_ddt_break¶
-
功能
使能死区波形的刹车功能
-
语法
int drv_pwm_ddt_break(u32 channel, u8 break_pol, u8 enable)
-
参数
参数名称 描述 channel 选择要配置dead time的pwm通道 break_pol 指定PIN脚,以PAD_GPIOA_13为例,0:PAD_GPIOA_13接地后,死区波形停止;1:PAD_GPIOA_13接高电平后,死区波形停止 enable 1:enable,0:disable -
返回值
返回值 描述 0 成功 负数 失败
6 FAQ¶
6.1 PWM各接口不存在¶
-
检查 sysdesc PWM节点的
status
是否为ok
-
检查config是否配置,详见SYSDESC配置
6.2 配置后PWM无波形产生¶
Step1: 首先确认测量的引脚是否正确:打开对应的原理图确认即可,如果没有错误的话,则进行下一步。
Step2: 确认对应的PWM mode是否生效,引脚复用失败主要有两个原因:
原因一:该引脚没有设置为PWM mode,设置方法详见PADMUX配置
原因二:有优先级比PWM mode更高级别的padmux mode被开启,
Step3:检查相关参数是否设置成功