OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5749|回复: 5

请教一个51单片机定时时间差问题

[复制链接]

6

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2012-7-26
在线时间
30 小时
发表于 2013-3-17 23:55:55 | 显示全部楼层 |阅读模式

我用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。

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



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2012-7-26
在线时间
30 小时
 楼主| 发表于 2013-3-17 23:57:01 | 显示全部楼层
我还修改进时间,把设定正转改为2S,反转改为2S;

运行中也还是一样,会变短。
回复 支持 反对

使用道具 举报

6

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2012-7-26
在线时间
30 小时
 楼主| 发表于 2013-3-17 23:59:20 | 显示全部楼层
这个变短也是随机的,有时出现在正转,有时出现在反转,有时正转反转都出现。

变量也设定正常:
unsigned short int run_time;
回复 支持 反对

使用道具 举报

6

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2012-7-26
在线时间
30 小时
 楼主| 发表于 2013-3-18 08:03:57 | 显示全部楼层
会不会我Keil有问题啊!!!!

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

也是一样!
回复 支持 反对

使用道具 举报

6

主题

153

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2013-4-4
在线时间
0 小时
发表于 2013-4-22 12:05:46 | 显示全部楼层
数组的问题呢 计时导致数据越界问题呢?
~~~~ 欢迎讨论,拒绝谩骂 ~~~~
回复 支持 反对

使用道具 举报

2

主题

255

帖子

0

精华

高级会员

Rank: 4

积分
821
金钱
821
注册时间
2013-6-5
在线时间
141 小时
发表于 2013-6-7 04:47:47 | 显示全部楼层
电机干扰了单片机的运行,定时器的值被干扰了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 11:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表