62D单片机拥有四个定时器,定时器0是上数8位定时器,还能用于看门狗计数产生计数脉冲;定时器1、定时器2、定时器3 是具有预分器的10位下数定时器,通常还可用于产生硬件PWM输出,或者用于软件模拟PWM输出;定时器时钟可选择外部时钟以及指令时钟。可配置预分频器为2-256分频。可配置为自动重载模式(定时器溢出后重载目标数值继续下数)。定时器溢出可触发中断。
************************************************
//------------INITIAL TIM1------------------40MS pcs
TMRH = 0X10; //1/(8M(sysclk)/2)*256*312 = 20 MS
TMR1 = 0x38; //
T1CR1 = C_TMR1_Reload | C_TMR1_En; //自动重载
T1CR2 = C_TMR1_ClkSrc_Inst | C_PS1_Div256 ; //指令时钟
INTE = INTE | C_INT_TMR1; //使能定时器中断
INTF = 0; //清除中断标志
模拟IO 输出 PWM ,在每次发生中断后,累计中断次数,在次数达到周期值时和占空比值时 对IO操作置位和清零。
void isr_hw(void) __interrupt(0) //硬件中断号为0
{
if(T1IF)
{
if(msCycle < 250)
{
msCycle ++; //5MS/
}
pwmCycle++; //累计中断次数
if(pwmCycle == 20) //达到目标周期时清零IO口
{
pwmCycle = 0;
rLedCle = trLedCle; //更新占空比
gLedCle = tgLedCle;
bLedCle = tbLedCle;
if(rLedCle != 0) //占空比为0时无效
{
PA4 = 0;
}
else
{
PA4 = 1;
}
if(gLedCle != 0)
{
PA2 = 0;
}
else
{
PA2 = 1;
}
if(bLedCle != 0)
{
PA0 = 0;
}
else
{
PA0 = 1;
}
}
else
{
if(pwmCycle == rLedCle) //达到占空比时清零IO无效
{
PA4 = 1;
}
if(pwmCycle == gLedCle)
{
PA2 = 1;
}
if(pwmCycle == bLedCle)
{
PA0 = 1;
}
}
T1IF = 0; //清除定时中断标志
}
if(PABIF)
{
PABIF = 0;
}
}
硬件PWM结构图 定时期值为帧率,PWM1DUTY 为占空比。
更多使用上的问题,可以加群讨论,直接加群主QQ提问。
|