求助大神!!51单片机定时器1和定时器0冲突

2019-07-15 11:28发布

做的PWM直流电机调速,我用定时器0定时产生PWM脉冲,定时器1计时50msTMOD = 0x11;
    TH0 = 0x0FF;
    TL0 = 0x9C;//100us
TH1=0x3C;
        TL1=0x0B0;//50ms
    EA = 1;
    ET0 = 1;
    TR0 = 1;
ET1 = 1;
    TR1 = 1;

关了T1PWM波形正常,但是只要开了T1波形就不对了,像图中那样,中间会有一端高电平。外部中断1检测速度脉冲,这个没啥影响。求各位大佬这个怎么解决啊

        void time_0()interrupt 1
{
        TR0=0;
   num++;
        if(num<PWM)
                         ENA=1; //L298N使能端
    else
              ENA=0;
        if(num>100) num=1;
    TMOD = 0x01;
    TH0 = 0x0FF;//100us
        TR0=1;
}

void INT0_INTERRUPT()interrupt 0
{
        EX0=0;
velocity++;
        EX0=1;
}

void time_1()interrupt 3
{   
     TR1=0;
     count++;
         if(count==51)
         {  
            sprintf(dsp,"%3d", velocity);
                  display_string(7,4,dsp);
                 ldelay(100);         
                  count=1;
      velocity=0;
      }
          TH1=0x3c;
          TL1=0x0b0;
          TR1=1;
               

}

捕获.PNG
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
人中狼
1楼-- · 2019-07-15 17:13
没太看出来什么问题,需要确定几个问题,pwm持续高电平时,单片机有没有其他动作出现,比如显示什么的,另外在定时器0里更改了tmod的值,并只更新了th0的值。再试试设置中断优先级,虽然有缺省值,但现在在解决问题,就把需要明确的值都明确了 最佳答案
人中狼
2楼-- · 2019-07-15 18:21
试试设置定时器0的中断优先级高于定时器1
红尘客栈丶
3楼-- · 2019-07-15 19:19
人中狼 发表于 2017-4-6 10:23
试试设置定时器0的中断优先级高于定时器1

定时器0的优先级不是本来就比定时器1优先级高吗
红尘客栈丶
4楼-- · 2019-07-15 21:10
人中狼 发表于 2017-4-6 10:54
没太看出来什么问题,需要确定几个问题,pwm持续高电平时,单片机有没有其他动作出现,比如显示什么的,另外在定时器0里更改了tmod的值,并只更新了th0的值。再试试设置中断优先级,虽然有缺省值,但现在在解决问题,就把需要明确的值都明确了 ...

定时器0里更改了tmod的值,并只更新了th0的值,属于手误,应该th0th1都更新,谢谢提醒;然后我似乎找到了持续高电平的原因,T1中断函数里有个延时函数看到了吧,我把它去掉就正常了,反正目前看是挺正常。我一会儿在设置下优先级试试,只求更稳定。我再鼓捣一会儿,看看会还有什么问题。另外谢谢大佬的关注!
红尘客栈丶
5楼-- · 2019-07-15 22:40
 精彩回答 2  元偷偷看……
wulinwl
6楼-- · 2019-07-15 23:49
红尘客栈丶 发表于 2017-4-6 14:01
后来又出现了冲突问题,貌似是和外部中断0的,我把T0优先级设置最高,问题果然解决了,谢谢

设置优先级排序并不代表中断冲突不存在,只是区分轻重缓急,能用一个中断处理的任务就不要开两个中断。你的两个定时中断的时间有倍数关系,只要添加一个计数变量就可以合用一个定时中断。中断里通常只产生标识,不处理任务,更不能有长延时,叫做打一枪就跑,任务放在主循环里处理。

一周热门 更多>