SSU_PWM使用参考
REVISION HISTORY¶
Revision No. | Description |
Date |
---|---|---|
1.0 | 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