RISCV_PWMOUT&PWMIN使用参考


REVISION HISTORY

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

    1. 概述

    1.1. 概述

    PWMOUT & PWMIN 主要用于电机的操控和电机转速状态反馈,PWMOUT输出PWM波形控制电机工作,PWMIN捕获PWM波形的周期占空比信息,以此形成反馈,得到电机当前的工作状态。

    1.2. 说明

    PWMOUT与同样是生成PWM波形的Traditional PWM(详见PWM使用参考)的区别在于,PWMOUT支持生成两路互补信号,基于两路互补信号能够产生一段死区时间,并且支持PWM的刹车功能。

    在介绍死区时间之前,需要了解的是,通常来说带有H桥或者三相桥的大功率电机在工作的时候,为了避免功率元件被烧毁,上半桥和下半桥是不允许同时导通,但是在实际工作的情况下,不可避免地会产生延时关断的效果,导致某个半桥在应该关断的时候没有关断,而此时另一个半桥已经打开。

    所以,为了处理这种情况,需要在某个半桥关断后,延迟一段时间再打开另一个半桥。而这个延迟时间就是死区。死区基于两路互补信号产生死区的原理是,正向信号基于PWM clock的相对上升沿产生delay,反向信号基于PWM clock的相对下降沿产生delay。PWM clock支持Traditional PWM的PWM0~PWM5通道生成。

    PWM的刹车功能是为了在发生紧急情况的时候可以立刻停止产生PWM波形,后续可以由软件恢复波形。

    PWMIN(PWM Input Capture),顾名思义,可以捕获PWM波形信息,包括周期、占空比、脉冲个数。

    当source clock 选择12M的时候,PWMOUT支持输出频率范围为45.78 ~ 6MHz的PWM 波形,支持长度0~85333ns的死区设定。

    当source clock选择12M的时候,为了保证波形捕获的稳定性,目前会滤除333ns以下的波形,所以PWMIN支持捕获的最大频率为3MHz。

    2. 基础配置

    2.1. CONFIG配置

    CONFIG_PWM_SUPPORT=TRUE

    2.2. sysdesc配置

    PWMOUT&PWMIN在dtsi中的节点如下所示:

    1. <pwm_out>
    2.     [reg_u32_u16] = 0x2203600 0x200 0x2200E00 0x200;
    3.     [interrupts_u8] INT_FIQ_ADC_FIQ;
    4.     [clkfrequency_u32] 12000000;
    5.     [camclk_u16] CAMCLK_pwm_adc;
    6.     [status_u8] 1;
    7.
    8. <pwm_in>
    9.     [reg_u32_u16] = 0x2201A00 0x200;
    10.     [interrupts_u8] INT_IRQ_PWM_CAPTURE;
    11.     [clkfrequency_u32] 12000000;
    12.     [camclk_u16] CAMCLK_pwm_capture;
    13.     [status_u8] 1;
    

    2.3. PADMUX配置

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

    1. <padmux>
    2. [schematic_u32_u32_u32]
    3. /* PWM_OUT */
    4. PAD_PWM_OUT0    PINMUX_FOR_PWM0_PN_1    MDRV_PUSE_PWMOUT0_P,
    5. PAD_PWM_OUT1    PINMUX_FOR_PWM0_PN_1    MDRV_PUSE_PWMOUT0_N,
    6. PAD_PWM_OUT2    PINMUX_FOR_PWM1_PN_1    MDRV_PUSE_PWMOUT1_P,
    7. PAD_PWM_OUT3    PINMUX_FOR_PWM1_PN_1    MDRV_PUSE_PWMOUT1_N,
    8. PAD_PWM_OUT4    PINMUX_FOR_PWM2_PN_1    MDRV_PUSE_PWMOUT2_P,
    9. PAD_PWM_OUT5    PINMUX_FOR_PWM2_PN_1    MDRV_PUSE_PWMOUT2_N,
    10. PAD_PWM_OUT6    PINMUX_FOR_PWM3_PN_1    MDRV_PUSE_PWMOUT3_P,
    11. PAD_PWM_OUT7    PINMUX_FOR_PWM3_PN_1    MDRV_PUSE_PWMOUT3_N,
    12. PAD_PWM_OUT8    PINMUX_FOR_PWM4_PN_1    MDRV_PUSE_PWMOUT4_P,
    13. PAD_PWM_OUT9    PINMUX_FOR_PWM4_PN_1    MDRV_PUSE_PWMOUT4_N,
    14. PAD_PWM_OUT10   PINMUX_FOR_PWM5_PN_1    MDRV_PUSE_PWMOUT5_P,
    15. PAD_PWM_OUT11   PINMUX_FOR_PWM5_PN_1    MDRV_PUSE_PWMOUT5_N,
    16. /* PWM_IN* MODE1 */
    17. PAD_KEY0        PINMUX_FOR_PWM_IN0_MODE_1   MDRV_PUSE_PWMIN0,
    18. PAD_KEY1        PINMUX_FOR_PWM_IN1_MODE_1   MDRV_PUSE_PWMIN1,
    19. PAD_KEY2        PINMUX_FOR_PWM_IN2_MODE_1   MDRV_PUSE_PWMIN2,
    20. PAD_KEY3        PINMUX_FOR_PWM_IN3_MODE_1   MDRV_PUSE_PWMIN3,
    21. PAD_KEY4        PINMUX_FOR_PWM_IN4_MODE_1   MDRV_PUSE_PWMIN4,
    22. PAD_KEY5        PINMUX_FOR_PWM_IN5_MODE_1   MDRV_PUSE_PWMIN5,
    23. PAD_KEY6        PINMUX_FOR_PWM_IN6_MODE_1   MDRV_PUSE_PWMIN6,
    24. PAD_KEY7        PINMUX_FOR_PWM_IN7_MODE_1   MDRV_PUSE_PWMIN7,
    25. /* PWM_IN MODE2 */
    26. PAD_EMMC_D7       PINMUX_FOR_PWM_IN0_MODE_2   MDRV_PUSE_PWMIN0,
    27. PAD_OUTN_TX1_CH_2 PINMUX_FOR_PWM_IN1_MODE_2  MDRV_PUSE_PWMIN1,
    28. PAD_OUTP_TX1_CH_3 PINMUX_FOR_PWM_IN2_MODE_2  MDRV_PUSE_PWMIN2,
    29. PAD_OUTN_TX1_CH_3 PINMUX_FOR_PWM_IN3_MODE_2  MDRV_PUSE_PWMIN3,
    30. PAD_RGMII0_RXCLK  PINMUX_FOR_PWM_IN4_MODE_2  MDRV_PUSE_PWMIN4,
    31. PAD_RGMII0_RXCTL  PINMUX_FOR_PWM_IN5_MODE_2  MDRV_PUSE_PWMIN5,
    32. PAD_RGMII0_MDIO   PINMUX_FOR_PWM_IN6_MODE_2  MDRV_PUSE_PWMIN6,
    33. PAD_RGMII0_MDC    PINMUX_FOR_PWM_IN7_MODE_2  MDRV_PUSE_PWMIN7,
    34. /* PWM_IN MODE3 */
    35. PAD_I2C5_SCL    PINMUX_FOR_PWM_IN0_MODE_3   MDRV_PUSE_PWMIN0,
    36. PAD_I2C5_SDA    PINMUX_FOR_PWM_IN1_MODE_3   MDRV_PUSE_PWMIN1,
    37. PAD_UART_RX1    PINMUX_FOR_PWM_IN2_MODE_3   MDRV_PUSE_PWMIN2,
    38. PAD_UART_TX1    PINMUX_FOR_PWM_IN3_MODE_3   MDRV_PUSE_PWMIN3,
    39. PAD_SAR_ADC_7   PINMUX_FOR_PWM_IN4_MODE_3   MDRV_PUSE_PWMIN4,
    40. PAD_SAR_ADC_8   PINMUX_FOR_PWM_IN5_MODE_3   MDRV_PUSE_PWMIN5,
    41. PAD_SAR_ADC_18  PINMUX_FOR_PWM_IN6_MODE_3   MDRV_PUSE_PWMIN6,
    42. PAD_SAR_ADC_19  PINMUX_FOR_PWM_IN7_MODE_3   MDRV_PUSE_PWMIN7,
    

    2.4. 驱动路径

    rtk\proj\sc\driver\sysdriver\pwm\drv\src\drv_pwm_out.c.

    rtk\proj\sc\driver\sysdriver\pwm\drv\src\drv_pwm_in.c.

    3. API使用

    3.1. 互补波形和死区设置

    3.1.1. 配置步骤

    1、生成源PWM波形,作为互补波形的source

    1. drv_pwm_channel_config(struct pwm_ch_cfg * pwm_ch)
    2. drv_pwm_channel_enable(u32 channel, u8 enable)
    

    2、进行死区配置

    1. drv_pwmout_ddt(struct pwmout_set *pwm_out_set, u8 id, u8 enable); //参数:struct pwmout_set *pwm_out_set 所需要配置的成员描述如下
    
    • 配置说明 | struct pwmout_set的成员 | 描述 | |-----------|--------| | p_ddt_len | 设置p极死区长度,单位为ns| | p_enable | 选择是否开启p极死区波形,1:enable,0:disable | | n_ddt_len | 设置n极死区长度,单位为ns| | n_enable | 选择是否开启n极死区波形,1:enable,0:disable |

    3、enable互补波形

    1. drv_pwmout_en(u8 id, u8 enable)
    

    3.2. 刹车功能

    3.2.1. 配置步骤

    1、设置PWM$n的刹车触发方式和刹车后的电平状态

    1. drv_pwmout_bkin(struct pwmout_set *pwm_out_set, u8 id, u8 enable)
    
    • 配置说明 | struct pwmout_set的成员 | 描述 | |-----|--------| | p_idle | 设置p极的刹车后电平状态,1表示高电平,0表示低电平 | | n_idle | 设置n极的刹车后电平状态,1表示高电平,0表示低电平 | | bkin_sel | 设置刹车触发方式,1表示sw & hw trigger,0表示only sw trigger |

    2、恢复PWM$n的波形

    1. drv_pwmout_en(u8 id, u8 enable)
    

    3.3. 捕获功能

    3.3.1. 配置步骤

    1、进行波形捕获的配置

    1. drv_pwmin_capture(struct pwmin_set *pwm_in_set, u8 id, u8 enable) //参数:struct pwmin_set *pwm_in_set 所需要配置的成员描述如下
    
    • 配置说明 | struct pwmin_set的成员 | 描述 | |-----------|--------| | rst_mode | 设置reset mode:每次捕获都重新计算时间戳,1表示enable,0表示disable,默认enable| | det_mode | 设置detect mode:奇数通道可以捕获同组偶数通道的波形,1:enable,0:disable | | timer_div | 设置计数时钟的除频数,timer_div越小误差越小,默认设置为0 | | pul_div | 设置第2^k个脉冲之后开始捕获边沿,当捕获的波形频率较高的时候,可以调大k,k支持设置为0、1、2、3四个挡位,默认设置为3 | | edge_sel | 选择捕获的边沿类型,0表示捕获下边沿,1表示捕获上边沿,2表示捕获双边沿 |

    2、获取channel$n捕获信息

    1. drv_pwmin_get(u8 id, u32 *period, u32 *duty_i, u32 *duty_d)
    
    • 参数 | 参数 | 描述 | |-----------|--------| | period | 获取到的周期| | duty_i | 获取到的占空比(整数部分)| | duty_d | 获取到的占空比(小数部分)|

    3.4. 脉冲计数

    3.4.1. 配置步骤

    1、配置计数的边沿类型

    1. drv_pwmin_pul_cal(struct pwmin_set *pwm_in_set, u8 id, u8 enable) //参数:struct pwmin_set *pwm_in_set 所需要配置的成员描述如下
    
    • 配置说明 | struct pwmin_set的成员 | 描述 | |-----------|--------| | pul_cal_edge | 选择计数的边沿类型,0表示下边沿,1表示上边沿,2表示双边沿|

    2、获取脉冲个数

    1. drv_pwmin_get_pul(u8 u8Id, u32 *pul_num);
    

    4. 相关文件路径

    4.1. 头文件路径

    rtk\proj\sc\driver\sysdriver\pwm\drv\pub\drv_pwm_out.h

    rtk\proj\sc\driver\sysdriver\pwm\drv\pub\drv_pwm_in.h

    4.2. Demo路径

    rtk\proj\sc\driver\sysdriver\pwm\drv\src\drv_pwm_out_test.c.

    rtk\proj\sc\driver\sysdriver\pwm\drv\src\drv_pwm_in_test.c.