[求助] 定时器延时问题,求助!!!!!

artj   2016-6-19 17:12 楼主
void TA1_Init()
{
        P2DIR &=~ BIT0;         //CAPTURE
        P2SEL |= BIT0;
        TA1CCTL1 = CAP + CCIS_0 + CM_1 + SCS+CCIE; // Capture CCIxA, pos edge, interrupt enable.
        TA1CTL = TASSEL_2 + MC_1 + ID__1; // SMCLK, up mode.
}
void TA0_Init(void)
{
        TA0CCTL0 &=~ CCIE;       //比较功能0(定时计数)开启CCIFG位中断
        TA0CTL = TACLR | TASSEL_2 | MC_1 | ID__1;
        //计数器清零,选择SMCLK作为时钟(16MHz),选用増计数模式
}
#pragma vector=TIMER1_A1_VECTOR
__interrupt void Timer1_A1 (void)
{
        //_disable_interrupts();
        TA1CCTL1 &= ~CCIFG;
        folg=~folg;
        if(folg)
        {
                if(yx==0)
                        fb_L;
                //TA1CCTL1 &= ~CM_2;
                TA1CCTL1 |= CM_1;  //捕获方式切换
        }
        else
        {
                if(yx==0)
                        fb_H;
                //TA1CCTL1 &= ~CM_1;
                TA1CCTL1 |= CM_2;  //捕获方式切换
        }
        if(yx!=0)
        {
                if(yx<179)
                {
                        TA0CCR0=time[yx]; //
                        //TA0R=0;
                        //TA0CTL|=TAIE;
                        TA0CCTL0 |= CCIE;                //TR0=1;
                }
                else
                {
                        TA0CCR0=time[180];
                        //TA0R=0;
                        //TA0CTL|=TAIE;
                        TA0CCTL0 |= CCIE;                //TR0=1;
                }
        }
        //_enable_interrupts();
}
#pragma vector=TIMER0_A0_VECTOR
__interrupt void TimerA0(void)
{
        //_disable_interrupts();
        //TA0CTL &= ~TAIFG;
        TA0CCTL0 &=~ CCIFG;
        TA0CCTL0 &=~ CCIE;
        if(folg)
                fb_L;
        else
                fb_H;
        //_enable_interrupts();
}
/********************************************************/
我想用定时器1捕获方波,当捕获到上升沿或下降延时开定时器0延时输出。起到输出方波与被采集的方波存在相位差。但是现在经过测试,发现并不能达到效果。捕获中断进去后,定时器的CCR0能被赋值,然后定时器0中断也能进去,但是延时输出的效果没有。就像没有定时一样。TA0CCR0的赋值由time[]这个数组提供,不论给TA0CCR0赋多大的值,延时效果都是一样的。

回复评论 (4)

感觉你这个刚好重叠了,把定时器0的时钟改一下看看现象
点赞  2016-6-21 08:20
引用: 数码小叶 发表于 2016-6-21 08:20
感觉你这个刚好重叠了,把定时器0的时钟改一下看看现象

原先我的定时器0和1都配的SMCLK(8MHz),延时后能出来波形但是不管定是多少时间波形都是一样的。听了你的意见将定时器1的改为ACLCK(32k),定时器0不变。结果波形出现了抖动还是没有延时效果。
然后我将两个定时器的时钟对掉,情况还是差不多没有延时效果。并且延时时间稍长,发现I/O口输出的波形不是1KHz(我设置的波形是1KHz)
点赞  2016-6-21 10:30
Lock_in_Amplifier.zip (595.22 KB)
(下载次数: 7, 2016-6-21 10:33 上传)

Lock_in_Amplifier.zip (595.22 KB)
(下载次数: 7, 2016-6-21 10:33 上传)

这是我的工程。用的LAUNCHPAD 430F5529 。
点赞  2016-6-21 10:35
问题已经解决,是在重新打开CCR0中断前(TA0CCTL0 |= CCIE;) 没有清除中断标志位。原因是定时器0在程序运行时一直在计数,只要达到CCRO,中断标志就会置位。
点赞  2016-6-23 18:49
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复