通过调整驱动函数,可以使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;
}