久久久国产一区二区_国产精品av电影_日韩精品中文字幕一区二区三区_精品一区二区三区免费毛片爱

機(jī)械社區(qū)

標(biāo)題: 步進(jìn)電機(jī)這個(gè)c程序怎么改電機(jī)頻率阿?是改哪個(gè)參數(shù)頻率能降低 [打印本頁(yè)]

作者: shooting_stars    時(shí)間: 2014-7-19 17:42
標(biāo)題: 步進(jìn)電機(jī)這個(gè)c程序怎么改電機(jī)頻率阿?是改哪個(gè)參數(shù)頻率能降低
#include<reg51.H>
#include <intrins.h>         //內(nèi)部包含延時(shí)函數(shù) _nop_();
typedef  unsigned char   u8;
typedef  unsigned int    u16;
sbit key =P1^0;   //正反轉(zhuǎn)
sbit key1=P1^1;          //啟動(dòng)停止
sbit key2=P1^2;   //加速
sbit key3=P1^3;   //減速
sbit LCD_RS=P2^4;
sbit LCD_WR=P2^3;
sbit LCD_EN=P2^2;
sbit BEEP=P3^5;
sbit Ir_Pin = P3^2;
u8 Ir_Buf[4]; //用于保存解碼結(jié)果
u8 code table[]="Zhang and wh 0011 ";
u8 code table0[]="---- STOP 00R/M";   //初始 停止
u8 code table3[]="FOR SPEED 12R/M";   //啟動(dòng) 3檔正轉(zhuǎn)
u8 code table2[]="FOR SPEED 05R/M";   //2檔正轉(zhuǎn)
u8 code table1[]="FOR SPEED 03R/M";   //1檔正轉(zhuǎn)
u8 code table4[]="FOR SPEED 20R/M";   //4檔正轉(zhuǎn)
u8 code table5[]="FOR SPEED 30R/M";   //5檔正轉(zhuǎn)
u8 code table10[]="---- STOP 00R/M";   // 停止
u8 code table13[]="BACK SPEED 12R/M";   //3檔反轉(zhuǎn)
u8 code table12[]="BACK SPEED 05R/M";   //2檔反轉(zhuǎn)
u8 code table11[]="BACK SPEED 03R/M";   //1檔反轉(zhuǎn)
u8 code table14[]="BACK SPEED 20R/M";   //4檔反轉(zhuǎn)
u8 code table15[]="BACK SPEED 30R/M";   //5檔反轉(zhuǎn)
u8 code FFW[8]={0x7F,0x3F,0xBF,0x9F,0xDF,0xCF,0xEF,0x6F};
u8 code REV[8]={0x6F,0xEF,0xCF,0xDF,0x9F,0xBF,0x3F,0x7F};
u8 code SPD[6]={0x18,0x16,0x12,0x08,0x06,0x04};                //五個(gè)檔
bit flag=1;
bit flag1=0;
u8 j=0x01;                         
u8 s=0x00;
u8 d=0x00;
void int1_init(void)
{
        IT0 = 1; //下降沿有效
        EX0 = 1;
        EA = 1;
}

/*********************************************
* UART初始化
* 波特率:9600
*********************************************/
void uart_init(void)
{
    TMOD = 0x21;
    SCON = 0x50;
    TH1 = 0xFD;
    TL1 = 0xFD;
    TR1 = 1;
}
/*********************************************
* UART發(fā)送一字節(jié)
*********************************************/
void UART_Send_Byte(u8 dat)
{
        SBUF = dat;
        while (TI == 0);
        TI = 0;
}
/*********************************************
* 獲取低電平時(shí)間
*********************************************/
u16 Ir_Get_Low()
{
        TL0 = 0;
        TH0 = 0;
        TR0 = 1;
        while (!Ir_Pin && (TH0&0x80)==0);  
        TR0 = 0;           
        return (TH0 * 256 + TL0);
}
/*********************************************
* 獲取高電平時(shí)間
*********************************************/
u16 Ir_Get_High()
{
        TL0 = 0;
        TH0 = 0;
        TR0 = 1;
        while (Ir_Pin && (TH0&0x80)==0);

        TR0 = 0;
        return (TH0 * 256 + TL0);
}


void delay(u16 x)
{
        u16 a,b;
        for(a=x;a>0;a--)
                for(b=10;b>0;b--);
}
  void beep(void)
{
  u8 i;
  for (i=0;i<180;i++)
   {
     delay(6);
     BEEP=!BEEP;                 //BEEP取反
   }
  BEEP=1;                      //關(guān)閉蜂鳴器
}
void sdelay(u8 n)                //延時(shí)程序
{
        u8 i,k;
        for(i=2*n;i>0;i--)
for(k=125;k>0;k--);
}
u8 READ_COM(void)                        //讀狀態(tài)(命令)函數(shù)
{
        u8 a;
        LCD_RS=0;                        //命令(狀態(tài))字操作
        LCD_WR=1;                        //讀操作
        LCD_EN=1;                        //操作允許
        delay(1);                        //延時(shí)
        a=P0;                                //讀取狀態(tài)賦值到a
        LCD_EN=0;                        //操作禁止
        return a;                         //將讀取的命令(狀態(tài))字返回
}
void WRITE_COM(u8 com)                        //寫(xiě)狀態(tài)(命令)函數(shù),入口參數(shù)為命令(狀態(tài))字
{
        LCD_RS=0;                        //命令(狀態(tài))字操作
        LCD_WR=0;                        //寫(xiě)操作       
        P0=com;                                // 命令(狀態(tài))字準(zhǔn)備好
        LCD_EN=0;                        //操作使能位高脈沖
        delay(10);
        LCD_EN=1;
        delay(10);
        LCD_EN=0;
        LCD_WR=1;                        //寫(xiě)禁止
}
u8 READ_DAT()                        //讀數(shù)據(jù)函數(shù)
{
        u8 a;
        P0=0xFF;
        LCD_RS=1;                        //數(shù)據(jù)操作
        LCD_WR=1;                        //讀操作
        LCD_EN=1;                        //操作允許
        delay(1);                        //延時(shí)
        a=P0;                                //數(shù)據(jù)讀取到a
        LCD_EN=0;                        //操作禁止
        return a;                         //將讀取數(shù)據(jù)返回
}
void WRITE_DAT(u8 date)                //寫(xiě)數(shù)據(jù)函數(shù) ,入口參數(shù)為寫(xiě)入數(shù)據(jù)
{
        LCD_RS=1;
        LCD_WR=0;        
        P0=date;
        LCD_EN=0;
        delay(10);
        LCD_EN=1;
        delay(10);
        LCD_EN=0;
        LCD_WR=1;
}
bit LCD_BUSY()                        //1602液晶讀忙操作,忙則返回1,空閑則返回0
{
    return (bit)(READ_COM()&0x80);
}
void init()                                        //1602液晶初始化函數(shù)
{
        delay(15);
        WRITE_COM(0x38);
        delay(5);
        WRITE_COM(0x38);
        delay(5);
        WRITE_COM(0x38);                 //設(shè)置顯示模式
        while(LCD_BUSY());                 //讀忙
        WRITE_COM(0x08);                //關(guān)閉顯示        
        while(LCD_BUSY());                //讀忙
        WRITE_COM(0x06);                //指針加1模式
        while(LCD_BUSY());                //讀忙
        WRITE_COM(0x01);                //顯示清屏
        while(LCD_BUSY());                 //讀忙
        WRITE_COM(0x0f);                //開(kāi)顯示,顯示光標(biāo),光標(biāo)閃爍
}
void DISPLAY(u8 m)                            //顯示主程序
{
        u8 a;
    init();
        while(LCD_BUSY());                //讀忙
        WRITE_COM(0x80);                //設(shè)置初始操作地址
        for(a=0;a<16;a++)                //寫(xiě)入table1內(nèi)容
        {
                while(LCD_BUSY());
                WRITE_DAT(table[a]);
        }

        while(LCD_BUSY());                //讀忙
        WRITE_COM(0xc0);                 //設(shè)置初始操作地址
        for(a=0;a<16;a++)                //寫(xiě)入table2內(nèi)容
        {
                while(LCD_BUSY());
                switch(m)
                 {
                   case 0: WRITE_DAT(table0[a]);break;
                   case 1: WRITE_DAT(table1[a]);break;
                   case 2: WRITE_DAT(table2[a]);break;
                   case 3: WRITE_DAT(table3[a]);break;
                   case 4: WRITE_DAT(table4[a]);break;
                   case 5: WRITE_DAT(table5[a]);break;
                   case 10: WRITE_DAT(table10[a]);break;
                   case 11: WRITE_DAT(table11[a]);break;
                   case 12: WRITE_DAT(table12[a]);break;
                   case 13: WRITE_DAT(table13[a]);break;
                   case 14: WRITE_DAT(table14[a]);break;
                   case 15: WRITE_DAT(table15[a]);break;
             }                          
        }
}   

int zfan(s,j,d)
{
                  flag=~flag;        //按鍵后標(biāo)志取反
              if(flag) d=0;
              else     d=10;
              s=j+d;
              DISPLAY(s);
                  return(j);
}
int qting(s,j,d)
{         
            flag1=~flag1;        //按鍵后標(biāo)志取反
                if(flag1)   s=j;
                else        s=0;
                s=s+d;
                DISPLAY(s);
                        return j;
}
int jia(s,j,d)                                     //通用加速主程序
{
        if(j<5)  j++;
        else  j=5;
        s=j+d;       
        DISPLAY(s);
        return j;
}
int jian(s,j,d)
{
        if(j>1) j--;
        else j=1;
        s=j+d;       
    DISPLAY(s);
        return j;
}
void int1_isr() interrupt 0          //中斷處理程序
{
        u16 temp;
        u8 i,k;

        temp = Ir_Get_Low();
        if ((temp < 7833) || (temp > 8755))  //引導(dǎo)脈沖低電平8500~9500us
                return;
        temp = Ir_Get_High();
        if ((temp < 3686) || (temp > 4608))  //引導(dǎo)脈沖高電平4000~5000us
                return;

        for (i=0; i<4; i++) //4個(gè)字節(jié)
        {
                for (k=0; k<8; k++) //每個(gè)字節(jié)8位
                {
                        temp = Ir_Get_Low();
                        if ((temp < 184) || (temp > 737)) //200~800us
                                return;

                        temp = Ir_Get_High();
                        if ((temp < 184) || (temp > 1843)) //200~2000us
                                return;
                        Ir_Buf[i] >>= 1;
                        if (temp > 1032) //1120us
                                Ir_Buf[i] |= 0x80;
                }
        }
        beep();
        UART_Send_Byte(Ir_Buf[0]);
        UART_Send_Byte(Ir_Buf[1]);
        UART_Send_Byte(Ir_Buf[2]);
        UART_Send_Byte(Ir_Buf[3]);
              s=Ir_Buf[2]  ;
                        switch(s)
                 {
                   case 15: zfan(s,j,d);flag=~flag;j=zfan(s,j,d);break;
                   case 01: qting(s,j,d);flag1=~flag1;j=qting(s,j,d);break;
                   case 17: j=jia(s,j,d);break;
                   case 12: j=jian(s,j,d);break;
             }
}
void main(void)
{
        u8 i,k,s,d;
        s=0;
        d=0;
           DISPLAY(s);
        while(1)
  {   uart_init();          //波特率初始化
          int1_init();          //中斷初始化        
         if( flag1 )   
          {        for (i=0; i<8; i++)       //一個(gè)周期--八拍
                {
                        if(flag)        P1 = FFW[i];          //取數(shù)據(jù)       
                        else                P1 = REV[i];
                        k=SPD[j];
                        sdelay(k);            //節(jié)拍延時(shí),用于調(diào)節(jié)轉(zhuǎn)速
                }
                if(!key)
                {                                                         //正反轉(zhuǎn) //正反顯示控制
                        sdelay(10);
                    beep();
                        if(!key)   flag=~flag;        //按鍵后標(biāo)志取反
                        if(flag) d=0;
                        else     d=10;
                        s=j+d;
                        DISPLAY(s);
                        while(!key)        ;           //按鍵靈敏
                }
           }
          else   P2=0x00;
      sdelay(10);       
          if(!key1)
                {                                                         //啟停轉(zhuǎn)
                        sdelay(10);
                                beep();
                        if(!key1)   flag1=~flag1;        //按鍵后標(biāo)志取反
                        if(flag1)   s=j;
                        else        s=0;
                        s=s+d;
                        DISPLAY(s);
                        while(!key1)        ;           //按鍵靈敏
                }
                 if(!key2)                                         //加速按鍵
                {
                        sdelay(10);
                                  beep();
                        if(!key2)  
                         {
                            if(j<5)  j++;
                                else  j=5;
                         }
                         s=j+d;       
                         DISPLAY(s);
                        while(!key2)        ;          
                }
                if(!key3)                                 //減速按鍵         
                {
                        sdelay(10);
                                  beep();
                        if(!key3)
                         {
                            if(j>1) j--;
                                else j=1;
                         }
                         s=j+d;       
                         DISPLAY(s);
                        while(!key3)        ;           //按鍵靈敏
                }
        }
}



作者: Industrial    時(shí)間: 2014-7-19 22:22
u8 code SPD[6]={0x18,0x16,0x12,0x08,0x06,0x04};                //五個(gè)檔   
這里調(diào)速度的五個(gè)擋的時(shí)間數(shù),也就是電機(jī)運(yùn)行的八拍里的每一拍的間格時(shí)間,比如你可調(diào)快一倍SPD[6]={0x0c,0x0b,0x09,0x04,0x03,0x02};  注意太快容易丟步。
作者: shooting_stars    時(shí)間: 2014-7-21 09:51
Industrial 發(fā)表于 2014-7-19 22:22
u8 code SPD[6]={0x18,0x16,0x12,0x08,0x06,0x04};                //五個(gè)檔   
這里調(diào)速度的五個(gè)擋的時(shí)間 ...

我是要調(diào)慢阿。。。
作者: Industrial    時(shí)間: 2014-7-22 18:21
能不能變通下,調(diào)慢你就把時(shí)間都加大就是了。比如調(diào)慢一倍把所有參數(shù)乘以2,改為
u8 code SPD[6]={0x30,0x2c,0x24,0x10,0x0c,0x08};                   //五個(gè)檔  
作者: lngk    時(shí)間: 2014-7-23 09:08
愛(ài)德利才知道要調(diào)步進(jìn)電機(jī)的參數(shù)這么難??!




歡迎光臨 機(jī)械社區(qū) (http://www.ytsybjq.com/) Powered by Discuz! X3.5