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