写了两天的步进电机速度调节程序 ,还是没成功,高手来指点一下啊

beyond_ic   2011-2-27 23:32 楼主
启动加速过程,正反转控制已经基本实现,现在就是速度调节有问题,不能调节,请高手指点
 
 
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code FFW[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};//转动数组
uchar code REV[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1};
uchar ffw_down,rev_down,speed_up_down,speed_down_down,stop_down;
uchar ffw_flag,rev_flag,speed_up_flag,speed_down_flag,stop_flag;//变量定义
int i,j,pp,ss,ttt,SET;
int TT = 30;
int kk = 20;
sbit ffw_moto = P3^4; //正转
sbit rev_moto = P3^5; //反转
sbit speed_up = P3^6; //加速
sbit speed_down = P3^7; //减速
sbit stop_moto = P3^2;  //停止
/****************按键延迟函数**********/
void delay(int tt)
{
 uchar a,b;
 for(a = tt;a > 0;a --)
  for(b = 0;b < 120;b ++);
}
/*************中断初始化***************/
void timer0_init(void)
{
 SET = 2000;    
    TMOD = 0x01;
 TR0 = 0;
    TH0=(65535 - SET) / 256;
    TL0=(65535 - SET) % 256;
 TR0 = 1;
 ET0 = 1;
    EA=1;
}
/***************按键扫描****************/
void key_scan(void)
{
 if(ffw_moto == 0)
 {
  delay(10);
  if(ffw_moto == 0) ffw_down = 1;
  if((ffw_down == 1)&&(ffw_moto == 1))
  {
   ffw_down = 0;
   ffw_flag = 1;
   rev_flag =0;
   stop_flag = 0;
  }
 }
 if(rev_moto == 0)
 {
  delay(10);
  if(rev_moto == 0)rev_down = 1;
  if((rev_down == 1)&&(rev_moto == 1))
  {
   rev_down = 0;
   rev_flag = 1;
   ffw_flag = 0;
   stop_flag = 0;
  }
 }
 if(speed_up == 0)
 {
  delay(10);
  if(speed_up == 0) speed_up_down = 1;
  if((speed_up_down == 1)&&(speed_up == 1))
  {
   speed_up_down = 0;
   speed_up_flag = 1;
   speed_down_flag = 0;
   stop_flag = 0;
  }
 }
 if(speed_down == 0)
 {
  delay(10);
  if(speed_down == 0)speed_down_down = 1;
  if((speed_down_down == 1) && (speed_down == 1))
  {
   speed_down_down = 0;
   speed_down_flag = 1;
   speed_up_flag = 0;
   stop_flag = 0;
  }
 }
 if(stop_moto == 0)
 {
  delay(10);
  if(stop_moto == 0) stop_down = 1;
  if((stop_down == 1)&&(stop_moto == 1))
  {
   stop_down = 0;
   stop_flag = 1;
   ffw_flag = 0;
   rev_flag = 0;
   speed_up_flag = 0;
   speed_down_flag = 0;
  }
 }
 
}
/*****************按键处理函数******************/
void key_chuli(void)
{
 key_scan();
 if(speed_down_flag == 1)   // 加速按键变量处理
 {
  kk = kk - 1;
  if(kk < 1) kk = 1;
 }
 if(speed_up_flag == 1)   //减速按键变量处理
 {
  kk = kk + 1;
  if(kk > 100)kk = 100;
 }
 if(stop_flag == 1) // 停止按键处理
 {
  P1 = 0x00;
 }
}
void timer0_isr(void) interrupt 1
{
 TR0 = 0;
 ET0 = 0;
    TH0=(65535-SET)/256;
    TL0=(65535-SET)%256;
 TR0 = 1;
 ET0 = 1;
/*************** 电机转动速度调节*********************/
  ss ++;
 if(ss >= kk)
 {
  ss = 0;
/******************启动加速阶段处理*********************/
  ttt --;
  if(ttt <= 1)
  { 
   if(j < TT)
   {
    j++;
    ttt = TT - j;
    }
   else
    j = TT;
   if(ttt <= 1) ttt = 0;
/*****************电机正向反向转动控制**********************/
   if(ffw_flag == 1)
   {
    P1 = FFW;  //正转数组
    i++;
    if(i >= 8)i = 0;
   }
    
   if(rev_flag == 1)
   {
    P1 = REV; // 反转数组
    i++;
    if(i >= 8)i = 0;
   }
  }
  }
 
 
}
void main(void)
{
 ttt = TT;
 timer0_init();
    while(1)
    {
  key_chuli();
 }
}

回复评论 (7)

没人理我啊,伤心啊
点赞  2011-2-28 19:25

回复 沙发 beyond_ic 的帖子

我都不会写
欢迎大家一起交流!!!!
点赞  2011-2-28 23:52
以下程序已调通,供LZ参考。

void main()
{
  uchar keyValueRead;
  target_init();
  moterState=MOTER_STOP;
  timer0Count=0x00;
  moterAddReduce=0x00;
  moterStep=0x00;
  moterSpeed=0x00;   
  moterSpeedMax=0x00;   //默认停止
  moterDirect=0x00;             //默认停止
  moter_state_display(MOTER_STOP);
  display_is_ok=1;
  sei();
  while(1)
  {
    keyValueRead=get_key_value();
        switch(keyValueRead)
        {
          case KEY_FRONT:          //正转
          {
            moterState=MOTER_FRONT_LOWER;
                moterDirect=0x01;
                moterSpeedMax=MOTER_SPEED_MIN;
                display_is_ok=0;
                //moter_state_display(MOTER_FRONT_LOWER);
                break;
          }
          case KEY_QUEEN:          //反转
          {
            moterState=MOTER_QUEEN_LOWER;
                moterDirect=0x02;
                moterSpeedMax=MOTER_SPEED_MIN;
                display_is_ok=0;
                //moter_state_display(MOTER_QUEEN_LOWER);
                break;
          }
          case KEY_ADD:                  //加速
          {
            speedDirect=0x01;
            moterAddReduce=100;
                display_is_ok=0;
                if(moterDirect==0x01)  //正转
                  moter_state_display(MOTER_FRONT_ADD);
                else if(moterDirect==0x02)
                            moter_state_display(MOTER_QUEEN_ADD);
                break;
          }
          case KEY_REDUCE:          //减速
          {
                speedDirect=0x02;
            moterAddReduce=100;
                display_is_ok=0;
                if(moterDirect==0x01) //正转
                  moter_state_display(MOTER_FRONT_REDUCE);
                else if(moterDirect==0x02)
                           moter_state_display(MOTER_QUEEN_REDUCE);
                break;
          }
          case KEY_STOP:      //停止
          {
            moterState=MOTER_STOP;
            moterSpeedMax=0x00;    //默认停止
        moterDirect=0x00;           //默认停止
                moter_state_display(MOTER_STOP);
                display_is_ok=1;
                break;
          }
          default:
            break;
        }
        if(display_is_ok==0)
        {
           switch(moterSpeedMax)
       {
         case MOTER_SPEED_NORMAL:
             {
               if(moterDirect==0x01)
                     moter_state_display(MOTER_FRONT_NORMAL);
                   else if(moterDirect==0x02)
                     moter_state_display(MOTER_QUEEN_NOMAL);
                   display_is_ok=1;
               break;
             }
            case MOTER_SPEED_MIN:
            {
              if(moterDirect==0x01)
                    moter_state_display(MOTER_FRONT_LOWER);
                  else if(moterDirect==0x02)
                    moter_state_display(MOTER_QUEEN_LOWER);
                  display_is_ok=1;
              break;
            }
            default:
              break;
      }
        }
  }
}
void timer0_overflow(void) interrupt 1    //timer0定时5ms
{
   TH0=0xEE;          //定时10ms
   TL0=0x00;
   if(timer0Count      timer0Count++;
   else
   {
     timer0Count=0x00;
         if(speedDirect==0x01)
         {
           if(moterSpeedMax>MOTER_SPEED_NORMAL)
             moterSpeedMax--;
           else
           {
             moterAddReduce=0x00;
                 speedDirect=0x00;
           }   
         }
         else if(speedDirect==0x02)
         {
                   if(moterSpeedMax               moterSpeedMax++;
            else
            {
              moterAddReduce=0x00;
                  speedDirect=0x00;
            }
         }
   }
   if(moterSpeed      moterSpeed++;
   else
   {
     moterSpeed=0x00;
         if(moterDirect==0x01) //正转
         {
           if(moterStep>0x00)
             moterStep--;
           else
             moterStep=0x07;
         }
         else if(moterDirect==0x02)        //反转
              {
                    if(moterStep<0x07)
                  moterStep++;
                else
                  moterStep=0x00;
              }
         ground(moterStep);
   }
}
科学家研究已有的世界,工程师创造未来的世界!
点赞  2011-3-1 19:52

楼上的兄弟很好,建议发一个奖励!

一个为理想不懈前进的人,一个永不言败人! http://shop57496282.taobao.com/ 欢迎光临网上店铺!
点赞  2011-3-2 09:00
牛人还是很多的
点赞  2011-4-16 07:41
ddddddddd
点赞  2011-8-1 10:34
很不错  过来mark一下 。。。。
点赞  2011-9-3 23:00
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复