调整 W600 PWM的输出频率

    通过调整驱动函数,可以使W600的PWM输出更加详细的频率,当然这是以牺牲占空比的可调度为代价的。因为占空比有频率共同分享了从时钟时钟总线上所分得的频率;

如果你对占空比需要不大,就可以通过修改驱动函数来输出更加详细的频率,官方sdk里默认可调的占空比分辨率为 1/256;

如果下为默认的驱动及修改后的驱动,修改后的驱动能够输出最详细的频率:

int tls_pwm_init(u8 channel,u32 freq, u8 duty, u8 pnum)
{
    pwm_init_param pwm_param;
    int ret=-1;
	tls_sys_clk sysclk;
	
	tls_sys_clk_get(&sysclk);

    memset(&pwm_param, 0, sizeof(pwm_init_param));
    pwm_param.period = 255;
    pwm_param.cnt_type = WM_PWM_CNT_TYPE_EDGE_ALIGN_OUT;
    pwm_param.loop_type = WM_PWM_LOOP_TYPE_LOOP;
    pwm_param.mode = WM_PWM_OUT_MODE_INDPT;
    pwm_param.inverse_en = DISABLE;
    pwm_param.pnum = pnum;
    pwm_param.pnum_int = DISABLE;
    pwm_param.duty = duty;
    pwm_param.channel = channel;
    pwm_param.clkdiv = sysclk.apbclk*UNIT_MHZ/256/freq;
//	printf("clkdiv:%d\n", pwm_param.clkdiv);
    ret = tls_pwm_out_init(pwm_param);
//    tls_pwm_start(channel);

    return 	ret;
}
int tls_pwm_init(u8 channel,u32 freq, u8 duty, u8 pnum)
{
    pwm_init_param pwm_param;
    int ret=-1;
	tls_sys_clk sysclk;
	
	tls_sys_clk_get(&sysclk);

    memset(&pwm_param, 0, sizeof(pwm_init_param));
    pwm_param.period = 1;
    pwm_param.cnt_type = WM_PWM_CNT_TYPE_EDGE_ALIGN_OUT;
    pwm_param.loop_type = WM_PWM_LOOP_TYPE_LOOP;
    pwm_param.mode = WM_PWM_OUT_MODE_INDPT;
    pwm_param.inverse_en = DISABLE;
    pwm_param.pnum = pnum;
    pwm_param.pnum_int = DISABLE;
    pwm_param.duty = duty;
    pwm_param.channel = channel;
    pwm_param.clkdiv = sysclk.apbclk*UNIT_MHZ/2/freq;
//	printf("clkdiv:%d\n", pwm_param.clkdiv);
    ret = tls_pwm_out_init(pwm_param);
//    tls_pwm_start(channel);

    return 	ret;
}
发布了63 篇原创文章 · 获赞 95 · 访问量 41万+

猜你喜欢

转载自blog.csdn.net/zwl1584671413/article/details/103123609