【九齐单片机专题】源程序讲解[2] TIM定时器

[复制链接]
620|1
手机看帖
扫描二维码
随时随地手机跟帖
xys9190|  楼主 | 2020-11-1 16:48 | 显示全部楼层 |阅读模式
62D单片机拥有四个定时器,定时器0是上数8位定时器,还能用于看门狗计数产生计数脉冲;定时器1、定时器2、定时器3 是具有预分器的10位下数定时器,通常还可用于产生硬件PWM输出,或者用于软件模拟PWM输出;定时器时钟可选择外部时钟以及指令时钟。可配置预分频器为2-256分频。可配置为自动重载模式(定时器溢出后重载目标数值继续下数)。定时器溢出可触发中断。 屏.PNG
************************************************
//------------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 为占空比。
屏.PNG
更多使用上的问题,可以加群讨论,直接加群主QQ提问。
Nyquest-8bit-mcu交流群群二维码.png








使用特权

评论回复

相关帖子

该死的微笑| | 2021-4-15 16:36 | 显示全部楼层
有没有时钟配置方面的呢?我想把时钟配置成16M,规格书都没找到相应的寄存器

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

18

主题

140

帖子

5

粉丝