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

 找回密碼
 注冊會員

QQ登錄

只需一步,快速開始

搜索
查看: 2998|回復: 4

步進電機這個c程序怎么改電機頻率阿?是改哪個參數頻率能降低

[復制鏈接]
1#
發表于 2014-7-19 17:42:26 | 只看該作者 |倒序瀏覽 |閱讀模式
#include<reg51.H>
#include <intrins.h>         //內部包含延時函數 _nop_();
typedef  unsigned char   u8;
typedef  unsigned int    u16;
sbit key =P1^0;   //正反轉
sbit key1=P1^1;          //啟動停止
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]; //用于保存解碼結果
u8 code table[]="Zhang and wh 0011 ";
u8 code table0[]="---- STOP 00R/M";   //初始 停止
u8 code table3[]="FOR SPEED 12R/M";   //啟動 3檔正轉
u8 code table2[]="FOR SPEED 05R/M";   //2檔正轉
u8 code table1[]="FOR SPEED 03R/M";   //1檔正轉
u8 code table4[]="FOR SPEED 20R/M";   //4檔正轉
u8 code table5[]="FOR SPEED 30R/M";   //5檔正轉
u8 code table10[]="---- STOP 00R/M";   // 停止
u8 code table13[]="BACK SPEED 12R/M";   //3檔反轉
u8 code table12[]="BACK SPEED 05R/M";   //2檔反轉
u8 code table11[]="BACK SPEED 03R/M";   //1檔反轉
u8 code table14[]="BACK SPEED 20R/M";   //4檔反轉
u8 code table15[]="BACK SPEED 30R/M";   //5檔反轉
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};                //五個檔
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發送一字節
*********************************************/
void UART_Send_Byte(u8 dat)
{
        SBUF = dat;
        while (TI == 0);
        TI = 0;
}
/*********************************************
* 獲取低電平時間
*********************************************/
u16 Ir_Get_Low()
{
        TL0 = 0;
        TH0 = 0;
        TR0 = 1;
        while (!Ir_Pin && (TH0&0x80)==0);  
        TR0 = 0;           
        return (TH0 * 256 + TL0);
}
/*********************************************
* 獲取高電平時間
*********************************************/
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;                      //關閉蜂鳴器
}
void sdelay(u8 n)                //延時程序
{
        u8 i,k;
        for(i=2*n;i>0;i--)
for(k=125;k>0;k--);
}
u8 READ_COM(void)                        //讀狀態(命令)函數
{
        u8 a;
        LCD_RS=0;                        //命令(狀態)字操作
        LCD_WR=1;                        //讀操作
        LCD_EN=1;                        //操作允許
        delay(1);                        //延時
        a=P0;                                //讀取狀態賦值到a
        LCD_EN=0;                        //操作禁止
        return a;                         //將讀取的命令(狀態)字返回
}
void WRITE_COM(u8 com)                        //寫狀態(命令)函數,入口參數為命令(狀態)字
{
        LCD_RS=0;                        //命令(狀態)字操作
        LCD_WR=0;                        //寫操作       
        P0=com;                                // 命令(狀態)字準備好
        LCD_EN=0;                        //操作使能位高脈沖
        delay(10);
        LCD_EN=1;
        delay(10);
        LCD_EN=0;
        LCD_WR=1;                        //寫禁止
}
u8 READ_DAT()                        //讀數據函數
{
        u8 a;
        P0=0xFF;
        LCD_RS=1;                        //數據操作
        LCD_WR=1;                        //讀操作
        LCD_EN=1;                        //操作允許
        delay(1);                        //延時
        a=P0;                                //數據讀取到a
        LCD_EN=0;                        //操作禁止
        return a;                         //將讀取數據返回
}
void WRITE_DAT(u8 date)                //寫數據函數 ,入口參數為寫入數據
{
        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液晶初始化函數
{
        delay(15);
        WRITE_COM(0x38);
        delay(5);
        WRITE_COM(0x38);
        delay(5);
        WRITE_COM(0x38);                 //設置顯示模式
        while(LCD_BUSY());                 //讀忙
        WRITE_COM(0x08);                //關閉顯示        
        while(LCD_BUSY());                //讀忙
        WRITE_COM(0x06);                //指針加1模式
        while(LCD_BUSY());                //讀忙
        WRITE_COM(0x01);                //顯示清屏
        while(LCD_BUSY());                 //讀忙
        WRITE_COM(0x0f);                //開顯示,顯示光標,光標閃爍
}
void DISPLAY(u8 m)                            //顯示主程序
{
        u8 a;
    init();
        while(LCD_BUSY());                //讀忙
        WRITE_COM(0x80);                //設置初始操作地址
        for(a=0;a<16;a++)                //寫入table1內容
        {
                while(LCD_BUSY());
                WRITE_DAT(table[a]);
        }

        while(LCD_BUSY());                //讀忙
        WRITE_COM(0xc0);                 //設置初始操作地址
        for(a=0;a<16;a++)                //寫入table2內容
        {
                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;        //按鍵后標志取反
              if(flag) d=0;
              else     d=10;
              s=j+d;
              DISPLAY(s);
                  return(j);
}
int qting(s,j,d)
{         
            flag1=~flag1;        //按鍵后標志取反
                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))  //引導脈沖低電平8500~9500us
                return;
        temp = Ir_Get_High();
        if ((temp < 3686) || (temp > 4608))  //引導脈沖高電平4000~5000us
                return;

        for (i=0; i<4; i++) //4個字節
        {
                for (k=0; k<8; k++) //每個字節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++)       //一個周期--八拍
                {
                        if(flag)        P1 = FFW[i];          //取數據       
                        else                P1 = REV[i];
                        k=SPD[j];
                        sdelay(k);            //節拍延時,用于調節轉速
                }
                if(!key)
                {                                                         //正反轉 //正反顯示控制
                        sdelay(10);
                    beep();
                        if(!key)   flag=~flag;        //按鍵后標志取反
                        if(flag) d=0;
                        else     d=10;
                        s=j+d;
                        DISPLAY(s);
                        while(!key)        ;           //按鍵靈敏
                }
           }
          else   P2=0x00;
      sdelay(10);       
          if(!key1)
                {                                                         //啟停轉
                        sdelay(10);
                                beep();
                        if(!key1)   flag1=~flag1;        //按鍵后標志取反
                        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)        ;           //按鍵靈敏
                }
        }
}


回復

使用道具 舉報

2#
發表于 2014-7-19 22:22:52 | 只看該作者
u8 code SPD[6]={0x18,0x16,0x12,0x08,0x06,0x04};                //五個檔   
這里調速度的五個擋的時間數,也就是電機運行的八拍里的每一拍的間格時間,比如你可調快一倍SPD[6]={0x0c,0x0b,0x09,0x04,0x03,0x02};  注意太快容易丟步。
3#
 樓主| 發表于 2014-7-21 09:51:12 | 只看該作者
Industrial 發表于 2014-7-19 22:22
u8 code SPD[6]={0x18,0x16,0x12,0x08,0x06,0x04};                //五個檔   
這里調速度的五個擋的時間 ...

我是要調慢阿。。。
4#
發表于 2014-7-22 18:21:53 | 只看該作者
能不能變通下,調慢你就把時間都加大就是了。比如調慢一倍把所有參數乘以2,改為
u8 code SPD[6]={0x30,0x2c,0x24,0x10,0x0c,0x08};                   //五個檔  
5#
發表于 2014-7-23 09:08:17 | 只看該作者
愛德利才知道要調步進電機的參數這么難啊!
您需要登錄后才可以回帖 登錄 | 注冊會員

本版積分規則

Archiver|手機版|小黑屋|機械社區 ( 京ICP備10217105號-1,京ICP證050210號,浙公網安備33038202004372號 )

GMT+8, 2025-7-28 11:20 , Processed in 0.068962 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

快速回復 返回頂部 返回列表