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、小数分频波形输出效果如下图。

"小数分频波形输出"

小数分频波形输出