[求助] 请教一个51单片机定时时间差问题

北宸xyz   2013-3-21 22:34 楼主
我用STC12LE5A32S2做了个东西。

用定时器0产生定时时间。
定时器是这样的:
void Time0(void) interrupt 1
{   
ET0 = 0; //定时器0中断关
TH0=0xE5;//(65536-n*FOSC/12/1000)/256;//n=10ms 这里采用8M晶振计算的
TL0=0xF5;//(65536-n*FOSC/12/1000)%256;

if(run_time_flag==1) run_time--;
if(parameter[1]==1) L1 = 0;//L1指示灯,用于调试
else L1 = 1;

ET0 = 1;     //定时器0中断打开

}

这里产生10MS定时。一直开着的。
在run_time_flag==1时进入运行时间递减。



主程序里面是这样的。

在SL1按下后,进入自动运行状态。
自动运行工作是这样的,
RUN=0就是运行,硬件电路是个继电器电路。硬件电路是没有问题的。
运行时间是在parameter[3]变量中存着。
然后发送一串按键数据出去:
“”“”“”“”“”“”“”“”“”“”“”“
  Send_Data(0);
”“”“”“”“”“”“”“”“”“”“”“”“”“”“”“
以上数据发送出去电机在RUN=0动作继电器后就会反转。

parameter[1] 是个电机运行状态记录变量,0为正转,1为反转;

主程序如下:

     if(SL1 == 0)
    {
     delay(20);
     if(SL1 == 0)
     {
      Show_flag = 1;
      while(SL1 == 0);//
      Auto_Flag=1;
      Break_off_SL2 = 0;//暂停后自动运行取消标志   1:为取消
     }
    }

   if(Auto_Flag == 1)
   {
    if(parameter[1]==1) Send_Data(0);
    parameter[1] = 0;//启动  正转  存数据
    run_time = parameter[3];//forward_run_time;
    run_time_flag = 1;//开始计时
    run = 0;run1 = 0;
    while (run_time>0) //执行自动进刀 这里的80也为了给下面电机换向时的转动时间补
    {      
     }
    }
   
    if(Break_off_SL2==0)
    {
     run_time_flag = 0;
       run = 1;//停止
       run1 = 1;
     delay(10); //电机停下,后再发转 100ms
     if(parameter[1]==0) Send_Data(0);
     parameter[1] = 1;//启动  反转 数据保存
     run_time = parameter[4];//backward_run_time;
     run_time_flag = 1;
     run = 0;
     run1 = 0;
     while (run_time>0)
     {
      }
    }
    run_time_flag = 0;
    run = 1;//停止
    run1 = 1;
    Auto_Flag = 0;//自动运行结束
    if(parameter[1]==1) Send_Data(0);
    parameter[1] = 0;//正转 数据保存
    Write_Chanshu();//写EEPROM参数,保存数据


问题是出现在:
运行是可以。
我设定正转运行个5S;反转运行个5S;中间有个100MS电机停机时间

我测试过,可以正常工作下下

我测试运行时间,每按下SL1后,电机会运行,并中间也会停机,然后再反转运行。

就是在三次到五次中间会出现个一次运行时间不是5S,而3S左右。
其他次数测试都是正常工作,运行时间也都正常,正转5S,反转5S。

测试过二三十次都是这样。

回复评论 (4)

我还修改进时间,把设定正转改为2S,反转改为2S;

运行中也还是一样,会变短。

这个变短也是随机的,有时出现在正转,有时出现在反转,有时正转反转都出现。

变量也设定正常:
unsigned short int run_time;

会不会我Keil有问题啊!!!!

但我也换过一台电脑试过呀!

也是一样!
点赞  2013-3-21 22:36
volatile unsigned short int run_time;
点赞  2013-3-22 09:46
看的出你很想描述你的程序,不过还是很难理解,也就不好推测问题出在哪里了.
既然有串口把关键的数据发出来分析分析,软件问题有时别人很难帮忙.
点赞  2013-3-22 14:19
之后一直都是正常的?那就很难理解了.如果以后误差会累计那可能是因为进入IRQ需要几个语句.
TH0=0xE5;//(65536-n*FOSC/12/1000)/256;//n=10ms 这里采用8M晶振计算的
TL0=0xF5;//(65536-n*FOSC/12/1000)%256;
这个需要修正

你可以找一下对应的文章.
点赞  2013-3-23 22:20
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复