你的"要想实现呼吸灯,必须通过PWM设置占空比和周期"这句话时对的.
后面为什么一定要老想着某某芯片时怎么样的, 这个芯片有没有?
我觉得就应该跟着你第一句的思路, 占空比, 周期.
那这两个值怎么设?看看手册PWM介绍.
噢, 原来周期是根据你要设置的频率算出来的, 放在PWMPH, PWMPL(所有PWM公用一个频率)
占空比是放在PWMxH,PWMxL的.(如PWM0H, PWM0L).
下面是我的代码.void set_freq_duty_pwm0(UINT16 freq, UINT8 duty)
{
UINT32 temp;
/**********************************************************************
PWM frequency = Fpwm/((PWMPH,PWMPL) + 1) <Fpwm = Fsys/PWM_CLOCK_DIV>
***********************************************************************/
PWM_CLOCK_DIV_2;
if(freq > (FOSC_SYS_FREQ)){
return;
}
if(duty > 100){
return;
}
temp = (FOSC_SYS_FREQ/2/freq) - 1;
PWMPH = (UINT8)((temp>>8)&0xff);
PWMPL = (UINT8)(temp&0xff);
/**********************************************************************
PWM Duty = (PWMnH,PWMnL)/((PWMPH,PWMPL) + 1)
***********************************************************************/
temp += 1;
temp = temp*duty;
temp = temp/100;
PWM0H = (UINT8)((temp>>8)&0xff);
PWM0L = (UINT8)(temp&0xff);
set_LOAD;
}
|