1.6. mcpwm
mcpwm模块支持两路同时输出pwm,共6组,支持故障保护功能,支持复用。
1.6.1. mcpwm_init
mcpwm功能初始化。
原型:
int mcpwm_init(struct mcpwm_config *mcpwm_cfg);
参数:
mcpwm_cfg
mcpwm配置
返回值
mcpwm配置句柄(id号)
1.6.2. mcpwm_deinit
mcpwm功能初始化取消。
原型:
void mcpwm_deinit(int mcpwm_cfg_id);
参数:
rdec_cfg_id
init时返回的句柄(id号)
返回值
无
1.6.3. mcpwm_start
mcpwm功能启动。
原型:
void mcpwm_start(int mcpwm_cfg_id);
参数:
rdec_cfg_id
init时返回的句柄(id号)
返回值
无
1.6.4. mcpwm_pause
mcpwm功能暂停。
原型:
void mcpwm_pause(int mcpwm_cfg_id);
参数:
rdec_cfg_id
init时返回的句柄(id号)
返回值
无
1.6.5. mcpwm_resume
mcpwm功能恢复。
原型:
void mcpwm_resume(int mcpwm_cfg_id);
参数:
rdec_cfg_id
init时返回的句柄(id号)
返回值
无
1.6.6. mcpwm_set_frequencys
设置mcpwm输出频率,单位Hz。
原型:
void mcpwm_set_frequency(int mcpwm_cfg_id, mcpwm_aligned_mode_type align, u32 frequency);
参数:
rdec_cfg_id
init时返回的句柄(id号)
align
对齐方式:中心对齐、边沿对齐
frequency
频率,单位:Hz
返回值
无
1.6.7. mcpwm_set_duty
设置mcpwm输出占空比。
原型:
void mcpwm_set_duty(int mcpwm_cfg_id, u16 duty);
- 参数:
rdec_cfg_id
init时返回的句柄(id号)
duty
占空比,如:5123,51.23%
返回值
无
1.6.8. mcpwm参考demo
struct mcpwm_config usr_mcpwm_cfg;
usr_mcpwm_cfg.ch = MCPWM_CH0; //通道号
usr_mcpwm_cfg.aligned_mode = MCPWM_EDGE_ALIGNED; //边沿对齐
usr_mcpwm_cfg.frequency = 1000; //1KHz
usr_mcpwm_cfg.duty = 5000; //占空比50%
usr_mcpwm_cfg.h_pin = IO_PORTC_00; //任意引脚输出,不需要就填-1
usr_mcpwm_cfg.l_pin = IO_PORTC_01; //任意引脚输出,不需要就填-1
usr_mcpwm_cfg.complementary_en = 0; //两个引脚的波形, 0: 同步, 1: 互补,互补波形的占空比体现在H引脚上
usr_mcpwm_cfg.detect_port = MCPWM_FPIN_NONE; //选择一个通道作故障保护功能,不需要就填 MCPWM_FPIN_NONE
usr_mcpwm_cfg.edge = MCPWM_EDGE_FAILL; //检测方式,下升沿触发
usr_mcpwm_cfg.irq_cb = usr_mcpwm_detect_test_func; //故障保护回调函数
usr_mcpwm_cfg.irq_priority = 1; //优先级默认为1
int ch0_id = mcpwm_init(&usr_mcpwm_cfg);
mcpwm_start(ch0_id);
1.6.9. mcpwm小数分频功能
1、配置小数分频功能,蓝牙需要跑XOSC时钟.
注意:使用小数分频时需要关闭低功耗。
//根据对应的应用板载在对应的代码文件中修改:app/demo/hid/config/lib_driver_config.c
//打开BTOSC时钟
const u32 pll_auto_disable = 1; //0: PLL-48M 1: BTOSC-48M
//根据对应的应用板载在对应的代码文件中修改:apps/demo/hid/board/bd47/board_aw313n_demo_cfg.h
//关闭低功耗
#define TCFG_LOWPOWER_LOWPOWER_SEL LOWPOWER_CLOSE //SNIFF状态下芯片是否进入powerdown
2、mcpwm小数分频功能代码配置
void clk_set_en(u8 en);
u32 pll_frac_switch(u32 div, u32 nr);
void pll_frac_exit();
void test_m_pwm_001()
{
clk_set_en(1);
/* clk_set("sys", 64000000); */
clk_set("lsb", 96000000);
clk_set_en(0);
clock_dump();
u32 freq = pll_frac_switch(120, 995); // 471000.485000
/* pll_frac_switch(126, 1044); // 471000.485000 */
printf("**********-----pll:%d\n", freq);
struct mcpwm_config pwm_p_data ;
pwm_p_data.aligned_mode = MCPWM_EDGE_ALIGNED;
pwm_p_data.ch = MCPWM_CH0 ;
pwm_p_data.frequency = 471;
pwm_p_data.duty = 5000 ;
pwm_p_data.h_pin = IO_PORTA_01 ;
pwm_p_data.l_pin = -1 ;
pwm_p_data.detect_port = -1 ;
pwm_p_data.edge = MCPWM_EDGE_FAILL;
pwm_p_data.irq_priority = 1; //优先级默认为1
/* pwm_p_data.deadtime_ns = 1000; //死驱时间,1000ns */
pwm_p_data.complementary_en = 0 ;
int ch0_id0 = mcpwm_init(&pwm_p_data);
mcpwm_start(ch0_id0);
pwm_p_data.aligned_mode = MCPWM_EDGE_ALIGNED;
pwm_p_data.ch = MCPWM_CH1;
pwm_p_data.frequency = 484;
pwm_p_data.duty = 5000 ;
pwm_p_data.h_pin = IO_PORTA_02;
pwm_p_data.l_pin = -1 ;
pwm_p_data.complementary_en = 0 ;
int ch1_id0 = mcpwm_init(&pwm_p_data);
mcpwm_start(ch1_id0);
//while (1) ;
}
3、通过按键触发来验证该功能,K1按下,关闭低功耗,开启小数PWM,K2按下,关闭小数PWM,打开低功耗。
//在对应板载的按键触发函数中添加如下测试代码
if (event_type == 1) {
if (key_value == 0x0) {
printf("decimal PWM open");
hidkey_is_active = 1;
extern void test_m_pwm_001();
test_m_pwm_001();
} else {
printf("decimal PWM close");
extern void test_m_pwm_close(void);
test_m_pwm_close();
hidkey_is_active = 0;
}
return;
}
4、小数分频波形输出效果如下图。
![]()
小数分频波形输出