SSU_PWM使用参考


REVISION HISTORY

Revision No.
Description
Date
1.0
  • Initial release
  • 10/30/2022

    1. 概述

    1.1. 概述

    PWM (Pulse Width Modulation) 模块通过改变占空比来改变输出的电流、电压进而控制电机转速、液晶屏调光等。

    1.2. 说明

    目前PWM支持的period范围:

    pwm driver的period精度支持2档调节,普通模式精度范围为44Hz – 6MHz;设置更高的精度时在menuconfig中打开CONFIG_PWM_NEW选项,此时精度范围为0.000698Hz – 6MHz。

    1.3. 频率和占空比

    • 频率(frequency)

      每秒钟信号从高电平到低电平再回到高电平的次数。

    • 占空比(duty)

      高电平持续时间和低电平持续时间之间的比例。


    2. 驱动配置

    2.1. DTSI配置

    PWM在dtsi中的节点如下所示:

    1. pwm {
    2.     compatible = "sstar,pwm";
    3.     reg = <0x1F203200 0x200>;
    4.     npwm = <22>;
    5.     clocks = <&CLK_pwm>;
    6.     interrputs = <GIC_SPI INT_IRQ_PWM IRQ_TYPE_level_HIGH>;
    7.     status = "ok";
    8. };
    

    2.2. 节点属性

    PWM驱动支持的属性如下:

    属性 描述 备注
    compatible 用于匹配驱动进行驱动注册,需与代码中一致 禁止修改
    reg 用于指定PWM寄存器bank的地址 不需要修改
    interrupts 用于指定使用的硬件中断号及属性 不需要更改
    clocks 用于指定使用的时钟源 不需要更改
    npwm 用于指定PWM Channel的数量 不需要修改
    status 用于选择是否使能PWM驱动 可根据需要修改,“ok”表示使能,“disable”表示不使能

    2.3. KERNEL CONFIG

    编译Kernel时:make menuconfig

    Device Drivers-->
        [*] SStar SoC platform drivers-->
            [*] PWM driver
                [*] Support NEW PWM configuration
    

    Support NEW PWM configuration:

    开启该选项可以提高PWM设置的精度和范围,可以根据情况选择是否打开。不打开时PWM可以设置的范围为44Hz – 6MHz,打开时可以设置的范围为0.000698Hz – 6MHz。

    2.4. PADMUX配置

    在padmux.dtsi中配置mode格式如下图的,"<>"中第一个值为PAD值,第二个值为要设置的mode,第三个值为PAD在该mode下对应的功能,示例如下。

    1. <PAD_PWM_OUT0    PINMUX_FOR_PWM_OUT0_MODE_1  MDRV_PUSE_PWM0>,
    2. <PAD_PWM_OUT1    PINMUX_FOR_PWM_OUT1_MODE_1  MDRV_PUSE_PWM1>,
    3. <PAD_PWM_OUT2    PINMUX_FOR_PWM_OUT2_MODE_1  MDRV_PUSE_PWM2>,
    4. <PAD_PWM_OUT3    PINMUX_FOR_PWM_OUT3_MODE_1  MDRV_PUSE_PWM3>,
    5. <PAD_FUART_RX    PINMUX_FOR_PWM_OUT4_MODE_2  MDRV_PUSE_PWM4>,
    6. <PAD_FUART_TX    PINMUX_FOR_PWM_OUT5_MODE_2  MDRV_PUSE_PWM5>,
    7. <PAD_FUART_RTS   PINMUX_FOR_PWM_OUT6_MODE_2  MDRV_PUSE_PWM6>,
    8. <PAD_FUART_CTS   PINMUX_FOR_PWM_OUT7_MODE_2  MDRV_PUSE_PWM7>,
    9. <PAD_EMMC_DS     PINMUX_FOR_PWM_OUT8_MODE_2  MDRV_PUSE_PWM8>,
    10. <PAD_EMMC_D4     PINMUX_FOR_PWM_OUT9_MODE_2  MDRV_PUSE_PWM9>,
    11. <PAD_EMMC_D5     PINMUX_FOR_PWM_OUT10_MODE_2 MDRV_PUSE_PWM10>,
    12. <PAD_EMMC_D6     PINMUX_FOR_PWM_OUT11_MODE_2 MDRV_PUSE_PWM11>,
    13. <PAD_SAR_ADC_0   PINMUX_FOR_PWM_OUT12_MODE_1 MDRV_PUSE_PWM12>,
    14. <PAD_SAR_ADC_1   PINMUX_FOR_PWM_OUT13_MODE_1 MDRV_PUSE_PWM13>,
    15. <PAD_SAR_ADC_2   PINMUX_FOR_PWM_OUT14_MODE_1 MDRV_PUSE_PWM14>,
    16. <PAD_SAR_ADC_3   PINMUX_FOR_PWM_OUT15_MODE_1 MDRV_PUSE_PWM15>,
    17. <PAD_SAR_ADC_4   PINMUX_FOR_PWM_OUT16_MODE_1 MDRV_PUSE_PWM16>,
    18. <PAD_SAR_ADC_5   PINMUX_FOR_PWM_OUT17_MODE_1 MDRV_PUSE_PWM17>,
    19. <PAD_SAR_ADC_6   PINMUX_FOR_PWM_OUT18_MODE_1 MDRV_PUSE_PWM18>,
    20. <PAD_SAR_ADC_7   PINMUX_FOR_PWM_OUT19_MODE_1 MDRV_PUSE_PWM19>,
    

    2.5. 驱动路径

    kernel/drivers/sstar/pwm/mdrv_pwm.c


    3. 配置PWM输出(普通模式)

    3.1. 普通精度设置

    menuconfig中不开启PWM_NEW的情况下可以配置pwm周期与占空比的精度相对较低,建议开启PWM_NEW。这种模式下配置PWM的period的单位为Hz,duty的单位为百分比。

    配置方法如下:

    1. # 跳转到PWM控制目录
    2. cd sys/class/pwm/pwmchip0/
    3.
    4. # 创建PWM0节点
    5. echo 0 > export
    6.
    7. # 进入PWM0控制目录
    8. cd pwm0
    9.
    10. # 设置周期为10000Hz
    11. echo 10000 > period
    12.
    13. # 设置占空比为50%
    14. echo 50 > duty_cycle
    15.
    16. # 设置极性为反向(不设置反向为echo normal > polarity)
    17. echo inversed > polarity
    18.
    19. # 使能PWM0
    20. echo 1 > enable
    

    3.2. 高精度设置

    在menuconfig中开启PWM_NEW选项时,PWM的period与duty_sycle配置的范围更大,精度也更高。配置方法与普通精度也不同,这种模式下配置PWM的period和duty_cycle使用纳秒为单位,所以要先计算周期和占空比的值。

    要设置PWM0频率为10KHZ占空比为½,则:

    period = 109 ÷ 10000 = 100000

    duty cycle = ½ × 100000 = 50000

    要设置PWM1频率为30HZ占空比为½,则:

    period = 109 ÷ 30 = 33333333

    duty cycle = ½ × 33333333 = 16666666

    配置PWM:

    1. # 跳转到PWM控制路径
    2. cd sys/class/pwm/pwmchip0/
    3.
    4. # 创建PWM0节点 使用PAD_GPIO0
    5. echo 0 >export
    6.
    7. # 进入PWM0控制路径
    8. cd pwm0
    9.
    10. # 配置周期
    11. echo 100000 >period
    12.
    13. # 设置占空比
    14. echo 50000 >duty_cycle
    15.
    16. # 使能PWM0
    17. echo 1 >enable
    


    4. GROUP相关概念

    4.1. Group功能(Sync mode)

    Group功能可以同时对多个PWM进行控制(一个group有4个PWM通道),要使用PWM的Group功能需要将PWM加入到Group中。

    Group Group Member
    Group0 PWM0、PWM1、PWM2、PWM3
    Group1 PWM4、PWM5、PWM6、PWM7
    Group2 PWM8、PWM9、PWM10、PWM11
    Group3 PWM12、PWM13、PWM14、PWM15
    Group4 PWM16、PWM17、PWM18、PWM19

    可通过以下命令将一个PWM加入到Group中:

    1.  echo PWM_ID enable > group_mode
    

    之后对加入到Group的各个PWM进行配置再Enable,这时driver会将之前的配置一起下到寄存器中再Enable Group中的PWM,Group中的PWM会同时开始出配置的波形。

    Group功能的典型应用是Sync mode(也叫马达模式),这个模式要求在同一个Group中的PWM的Period都相同,这样波形的周期就是同时开始同时结束,可以用来实现电机同步等功能。

    4.2. period、begin、end

    period是PWM的周期,开关PWM_NEW配置period的值单位不同,详见配置PWM输出(GROUP模式),配置方法如下:

    1.  echo PWM_ID period > group_period
    

    begin设置的是PWM 的shift值,这个值可以将PWM的相位相对于其他的PWM有一个偏移,end设置的是PWM的duty值,group中的duty与普通模式下不同,group中PWM的占空比需要将duty减去shift即end – begin

    Group中配置begin与shift的方法如下:

    1.  echo PWM_ID end > group_end
    
    2.  echo PWM_ID begin > group_begin
    

    4.3. Hold功能

    Group的Hold功能目前主要用于修改配置后,让之后输出的波形按修改的配置生效,起到切换作用。可以让加入到Group中的PWM在收到Hold命令后,停止当前波形的发送,切换发送新配置的波形。

    Hold命令如下:

    1.  echo GROUP_ID enable > group_hold
    

    在Enable group波形正在输出时修改了PWM的配置(如:修改占空比之类),再使用Hold会将新配置导入到寄存器并输出新波形,这样不会影响到Group之间的PWM同步,具体操作方法见:配置PWM输出(GROUP模式)

    4.4. Round功能

    Round功能可以让Group中的PWM输出完指定数量的周期波形后停止发送。Round命令如下:

    1.  echo GROUP_ID round > group_round
    

    4.5. Stop功能

    Stop功能可以让当前Group中的PWM立即停止(不会等当前周期完成),PWM会维持结束时的电平。Stop命令如下:

    1.  echo GROUP_ID enable > group_stop
    


    5. 配置PWM输出(GROUP模式)

    Group模式为了保持PWM之间的同步会将用户的配置先暂存,只有在Enable以及Hold中断触发时将用户的配置写到寄存器中才生效。

    使用中需要Group在enable之后,更改PWM的period、begin、end的值时,先进行配置,再下Hold_mode_0使能命令来触发中断,将新的配置下到寄存器中来使其生效。

    5.1. 普通精度设置

    menuconfig中不开启PWM_NEW的情况下,配置pwm周期与占空比的精度相对较低,建议开启PWM_NEW。这种模式下配置PWM的period的单位为Hz,duty的单位为千分比。配置方法如下(注意:在同一个GROUP中的PWM的period要相同):

    1. # 进入马达模式控制目录
    2. cd sys/devices/virtual/mstar/motor/
    3.
    4. # 将PWM1加入到GROUP模式中
    5. echo 1 1 > group_mode
    6.
    7. # 设置PWM0的period为10000HZ
    8. echo 0 10000 > group_period
    9.
    10. # 设置PWM0的duty为500‰
    11. echo 0 500 > group_end
    12.
    13. # 设置PWM1的period为10000HZ
    14. echo 1 10000 > group_period
    15.
    16. # 设置PWM1的shift为250‰
    17. echo 1 250 > group_begin
    18.
    19. # 设置PWM1的duty为750‰
    20. echo 1 750 > group_end
    21.
    22. # 启动Group0
    23. echo 0 1 > group_enable
    24.
    25. # 更改PWM0的duty为750‰
    26. echo 0 750 > group_end
    27.
    28. # 触发Group0 Hold中断使Enable之后的配置生效
    29. echo 0 1 > group_hold
    30.
    31. # 配置Group0输出1000个周期的
    32. echo 0 1000 > group_round
    

    5.2. 高精度设置

    menuconfig中开启PWM_NEW时,PWM的period与duty_sycle配置的范围更大,精度也更高。配置方法与普通精度也不同,这种模式下配置PWM的period和duty_cycle使用纳秒为单位,所以要先计算周期和占空比的值。

    要设置PWM0频率为10KHZ占空比为½,则:

    period = 109 ÷ 10000 = 100000

    duty cycle = ½ × 100000 = 50000

    要设置PWM1频率为30HZ占空比为½,则:

    period = 109 ÷ 30 = 33333333

    duty cycle = ½ × 33333333 = 16666666

    配置PWM:

    1. # 进入马达模式控制目录
    2. cd sys/devices/virtual/mstar/motor/
    3.
    4. # 将PWM1加入到GROUP模式中
    5. echo 1 1 > group_mode
    6.
    7. # 设置PWM0的period为10000HZ,100000代表100000ns
    8. echo 0 100000 > group_period
    9.
    10. # 设置PWM0的duty为500‰,50000代表50000ns
    11. echo 0 50000 > group_end
    12.
    13. # 设置PWM1的period为10000HZ,100000代表100000ns
    14. echo 1 100000 > group_period
    15.
    16. # 设置PWM1的shift为250‰,25000代表25000ns
    17. echo 1 25000 > group_begin
    18.
    19. # 设置PWM1的duty为750‰,75000代表75000ns
    20. echo 1 75000 > group_end
    21.
    22. # 启动Group0
    23. echo 0 1 > group_enable
    24.
    25. # 更改PWM0的duty为750‰,75000代表75000ns
    26. echo 0 75000 > group_end
    27.
    28. # 触发Group0 Hold中断使Enable之后的配置生效
    29. echo 0 1 > group_hold
    30.
    31. # 配置Group0输出1000个周期的
    32. echo 0 1000 > group_round