久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2819|回復: 10
收起左側(cè)

STC單片機15W1K16S驅(qū)動伺服電機 幾個小時后突然速度變慢

[復制鏈接]
回帖獎勵 5 黑幣 回復本帖可獲得 5 黑幣獎勵! 每人限 1 次
ID:140644 發(fā)表于 2022-1-17 21:06 | 顯示全部樓層 |閱讀模式
從來木有遇到過的麻煩事。

  感覺整個單片機頻率變慢了,凡是延時的動作都慢了。電機指令如下。
delay的變量都是固定的都沒有用。
本來電機的速度我是要設置的。
簡單的四個子程序,兩個原點歸零,外部中斷0觸發(fā).
兩個自動左移右移子程序,一個運行設定長度.
一個外中斷停止,開機伺服電機速度600左右,
運行幾個小時后有可能會一半速度,350左右.
莫名其妙.

/*************手動電機左移歸零****/
               void Zero_Left()                   //
               {
                DOWN=0;      //頂退開啟
              delay100ms(val3);      //頂退時間
               DOWN=1;      //頂退關閉
               DIR1=0;
               MOTORRUN=1;
                while(MOTORRUN) //外部中斷關閉標志位
                {
                CP1=0;
               delay(2);
               CP1=1;
               delay(2);
               if(ZERO_FLAG==0)
              MOTORRUN=0;
              }
            }
/*************手動電機右移歸零****/
              void Zero_Right()                   //
               {
              DOWN=0;      //頂退開啟
             delay100ms(val3);      //頂退時間
             DOWN=1;      //頂退關閉
                DIR1=1;
                MOTORRUN=1;
                while(MOTORRUN)              //回原點釋放按鍵電機停止
                {
                 CP1=0;
                delay(2); //
                CP1=1;
                 delay(2); //
                 if(ZERO_FLAG==0)
                MOTORRUN=0;
                }
              DIR1=1; //
               }   
/*************手動電機左移****/
               void Motor_Left()                   //
               {
                DIR1=0;
              MOTORRUN=1;
                while(MOTORRUN)
                {
                for(k=0;k<ScaleFactor;k++) //運行一個比例系數(shù)周期
               {
                 CP1=0;
                delay(2);
                CP1=1;
                delay(2);
               }
                 val6=val6+1;
                if(val6==val1) //等于0 限位
                MOTORRUN=0; //關電機循環(huán)標志
                }
                printf("n1.val=%d\xff\xff\xff",val6);//實際位置
              OUT9=1;
               }
/*************手動電機右移****************/
/*************外部中斷0使能停止***********/
              void Motor_Right()                  //
               {
                DIR1=1;
                while(ZERO_FLAG) //零點標志
                {
                  CP1=0;
                  delay(2);
                 CP1=1;
                 delay(2);
                }
               val6=0;
              printf("n1.val=%d\xff\xff\xff",val6);//實際位置
              DIR1=1; //
              OUT9=1;
               }
回復

使用道具 舉報

ID:96682 發(fā)表于 2022-1-18 04:30 來自手機 | 顯示全部樓層
得看情況,如果用電池供電出現(xiàn)變慢很正常無關程序
回復

使用道具 舉報

ID:140644 發(fā)表于 2022-1-18 06:17 | 顯示全部樓層
用的雙組開關電源啊,一組5V,一組24V,一個淘晶馳串口觸摸屏。
控制板也換了,電源也換了,伺服電機改成了步進電機。
變慢的時候速度剛好差不多正常時候的一半速度。
正常伺服電機700轉(zhuǎn)左右,變慢的時候速度350轉(zhuǎn)左右,
重新開機又正常。每天不定時發(fā)生,偶爾一天好的。
咨詢STC梁工說程序的問題,一共有四臺機器。
另外三臺正常,這一臺有問題的多了兩個繼電器。
其他程序都



/***機械手自動調(diào)試L716  CODE 3614  2021 12 25********/
/***原點進料,右移回原點 進料檢測8次消抖動 ***********/       
              #include     <REG52.H>                      //開自動先頂退
              #include     <intrins.h>                    //保壓時間
                          #include     <string.h>
                          #include     "stdio.h"
                          #include     <stdlib.h>
              #define      uint unsigned int
              #define      uchar unsigned char
                          bit          Up_XData=0;                         //原點更新標志,X發(fā)生中斷置一,回主程序更新X軸位置
                          sbit         Led=P5^4;                     //EEPROM寫指示
                          sbit         Auto_Led=P5^5;                 //自動運行指示
                          sbit         CP1=P2^6;             //
                          sbit         DIR1=P2^7;            //
                          sbit         UP=P1^0;                                 /****頂進輸出信號****/
                          sbit         DOWN=P1^1;                         /****頂退輸出信號****/
                          sbit         Valve=P1^2;                         /****料閘****/
                          sbit         OUT5=P1^3;                     //
                          sbit         OUT6=P1^4;                     //
                          sbit         OUT7=P1^5;                      //
                          sbit         OUT8=P1^6;                     //
                          sbit         OUT9=P1^7;                     //
                          sbit               S1=P3^2;                                 /***伺服電機零點賦值****/
                          sbit               S2=P3^3;                                 /***伺服電機右限位****/
                          sbit               INTPUTA=P3^4;                 /***工位A進料檢測****/
                          sbit               INTPUTB=P3^5;                 /***工位B進料檢測****/
                          sbit               INTPUTA1=P3^6;                 /***工位A1空位檢測****/
                          sbit               INTPUTB1=P3^7;                 /***工位B1空位檢測****/
                          sbit               INTPUT1=P2^0;                 /***按鈕開自動****/
                          bit          ZERO_FLAG;            /*零點標志01*/
                          uchar        i,k;                  //循環(huán)總變量i
                          #define      CMD_IDLE    0         //空閑模式
              #define      CMD_READ    1         //IAP字節(jié)讀命令
              #define      CMD_PROGRAM 2         //IAP字節(jié)編程命令
              #define      CMD_ERASE   3         //IAP扇區(qū)擦除命令
              #define      ENABLE_IAP  0x82      //if SYSCLK<20MHz
              #define      IAP_ADDRESS 0x0400    //時間 EEPROM首地址
                          bit                    manu;                                 /****手動標志位 0 1****/
                          bit                   MOTORRUN=0;                         //電機運行標志
                          bit                    Signauto;                     //*檢測接近開關自動運行標志*/
                          typedef      unsigned char BYTE;
              typedef      unsigned int WORD;
                          uint         FLAG_S;
                          static       uint         ScaleFactor; //比例系數(shù)
                          static       uint         vala;        //歸零位置
              static       uint         val0,val1,val2,val3,val4;  /*0產(chǎn)量計數(shù)器1設定間距2頂進時間3頂退時間4電機速度*/
                          static       uint         val5,val7;  /*5開閘時間7緩沖*/
                          static       uint         val6;                //6實際位置
                          static       uint         val8;                //開閘延時,推進輪子進模具
                          bit                   Receive_Flag;
                          uchar        kcounter,kstatus;     //按鍵計數(shù)標志 按鍵狀態(tài)標志
                          uint         a[10];                //定義數(shù)組a 存儲串口數(shù)據(jù)串
/*------------------------------------------*/
              void delay(uint t)
              {
              uint i,j;
              for(i=0;i<t;i++)
              for(j=0;j<2;j++);
              }
/*------------------延時子程序------------------------*/
               void delay10ms(uint x)
               {
               uint i, j;
               for (i=0;i<x;i++)
               for (j=0;j<500;j++);
               }
/*------------------延時子程序------------------------*/
               void delay100ms(uint x)
               {
               uint i, j;
               for (i=0;i<x;i++)
               for (j=0;j<11000;j++);
               }
/*----關閉IAP----------------------------*/
              void IapIdle()
              {
              IAP_CONTR = 0;                  //關閉IAP功能
              IAP_CMD = 0;                    //清除命令寄存器
              IAP_TRIG = 0;                   //清除觸發(fā)寄存器
              IAP_ADDRH = 0x80;               //將地址設置到非IAP區(qū)域
              IAP_ADDRL = 0;
              }
/*-從ISP/IAP/EEPROM區(qū)域讀取一字節(jié)-*/
              BYTE IapReadByte(WORD addr)
              {
              BYTE dat;                       //數(shù)據(jù)緩沖區(qū)
              IAP_CONTR = ENABLE_IAP;         //使能IAP
              IAP_CMD = CMD_READ;             //設置IAP命令
              IAP_ADDRL = addr;               //設置IAP低地址
              IAP_ADDRH = addr >> 8;          //設置IAP高地址
              IAP_TRIG = 0x5a;                //寫觸發(fā)命令(0x5a)
              IAP_TRIG = 0xa5;                //寫觸發(fā)命令(0xa5)
              _nop_();                        //等待ISP/IAP/EEPROM操作完成
              dat = IAP_DATA;                 //讀ISP/IAP/EEPROM數(shù)據(jù)
              IapIdle();                      //關閉IAP功能
              return dat;                     //返回
              }
/*-寫一字節(jié)數(shù)據(jù)到ISP/IAP/EEPROM區(qū)域-*/
              void IapProgramByte(WORD addr, BYTE dat)
              {
              IAP_CONTR = ENABLE_IAP;         //使能IAP
              IAP_CMD = CMD_PROGRAM;          //設置IAP命令
              IAP_ADDRL = addr;               //設置IAP低地址
              IAP_ADDRH = addr >> 8;          //設置IAP高地址
              IAP_DATA = dat;                 //寫ISP/IAP/EEPROM數(shù)據(jù)
              IAP_TRIG = 0x5a;                //寫觸發(fā)命令(0x5a)
              IAP_TRIG = 0xa5;                //寫觸發(fā)命令(0xa5)
              _nop_();                        //等待ISP/IAP/EEPROM操作完成
              IapIdle();
              }
/*---扇區(qū)擦除---------------*/
              void IapEraseSector(WORD addr)
              {
              IAP_CONTR = ENABLE_IAP;         //使能IAP val=IapReadByte(IAP_ADDRESS+1);
              IAP_CMD = CMD_ERASE;            //設置IAP命令
              IAP_ADDRL = addr;               //設置IAP低地址
              IAP_ADDRH = addr >> 8;          //設置IAP高地址
              IAP_TRIG = 0x5a;                //寫觸發(fā)命令(0x5a)
              IAP_TRIG = 0xa5;                //寫觸發(fā)命令(0xa5)
              _nop_();                        //等待ISP/IAP/EEPROM操作完成
              IapIdle();
              }
/***********************************/
                          void red_eeprom(void)
              {
                          uint m,n;                 
                          m=IapReadByte(IAP_ADDRESS+0);  //設定間距高八位
                          n=IapReadByte(IAP_ADDRESS+1);  //設定間距低八位
                          val1=m*256+n;                                 //設定間距
                          m=IapReadByte(IAP_ADDRESS+2);  //電機速度高八位
                          n=IapReadByte(IAP_ADDRESS+3);  //電機速度低八位
                          val4=m*256+n;                                 //電機速度
                          m=IapReadByte(IAP_ADDRESS+4);  //比例系數(shù)高八位
                          n=IapReadByte(IAP_ADDRESS+5);  //比例系數(shù)低八位
                          ScaleFactor=m*256+n;                         //比例系數(shù)
              m=IapReadByte(IAP_ADDRESS+6);  //頂進時間高八位
                          n=IapReadByte(IAP_ADDRESS+7);  //頂進時間低八位
                          val2=m*256+n;                                 //頂進時間
                          m=IapReadByte(IAP_ADDRESS+8);  //頂退時間高八位
                          n=IapReadByte(IAP_ADDRESS+9);  //頂退時間低八位
                          val3=m*256+n;                                         //頂退時間
                          m=IapReadByte(IAP_ADDRESS+10); //開閘時間高八位
                          n=IapReadByte(IAP_ADDRESS+11); //開閘時間低八位
                          val5=m*256+n;                                         //開閘時間
                          m=IapReadByte(IAP_ADDRESS+12); //歸零位置高八位
                          n=IapReadByte(IAP_ADDRESS+13); //歸零位置低八位
              vala=m*256+n;       
                          val8=IapReadByte(IAP_ADDRESS+14); //
                          Led=1;
              }
/*************寫參數(shù)到EEPROM*******************************/
                          void Write_EepromTime()
                          {
                           IapEraseSector(IAP_ADDRESS); //扇區(qū)擦除
                           IapProgramByte(IAP_ADDRESS+0,val1/256);       /*設定間距高八位*/       
                           IapProgramByte(IAP_ADDRESS+1,val1%256);       /*設定間距低八位*/

                           IapProgramByte(IAP_ADDRESS+2,val4/256);       /*電機速度高八位*/  
                           IapProgramByte(IAP_ADDRESS+3,val4%256);       /*電機速度低八位*/

                           IapProgramByte(IAP_ADDRESS+4,ScaleFactor/256);/*比例系數(shù)高八位*/
                           IapProgramByte(IAP_ADDRESS+5,ScaleFactor%256);/*比例系數(shù)低八位*/

                           IapProgramByte(IAP_ADDRESS+6,val2/256);       /*頂進時間高八位*/       
                           IapProgramByte(IAP_ADDRESS+7,val2%256);       /*頂進時間低八位*/

                           IapProgramByte(IAP_ADDRESS+8,val3/256);       /*頂退時間高八位*/  
                           IapProgramByte(IAP_ADDRESS+9,val3%256);       /*頂退時間低八位*/

                           IapProgramByte(IAP_ADDRESS+10,val5/256);      /*開閘時間高八位*/  
                           IapProgramByte(IAP_ADDRESS+11,val5%256);      /*開閘時間低八位*/

                           IapProgramByte(IAP_ADDRESS+12,vala/256);      /*歸零位置高八位*/  
                           IapProgramByte(IAP_ADDRESS+13,vala%256);      /*歸零位置低八位*/          

                           IapProgramByte(IAP_ADDRESS+14,val8%256);      /*開閘延時低八位*/
                           Led=1;
                           }
/*************關所有輸出*******************************/            
                           void reset_io()
                           {
                           P1M0=0X00;
                           P1M1=0X00;
                           P2M0=0X00;
                           P2M1=0X00;
                           P3M0=0X00;
                           P3M1=0X00;
                           P5M0=0X00;
                           P5M1=0X00;
                           CP1=1;                            //
                           DIR1=1;                           //
               UP=1;                                             /****頂進輸出信號****/
                           DOWN=1;                                             /****頂退輸出信號****/
                           S1=1;                                             /***伺服電機限位*2016 5 14 5.5改1.7****/
                           S2=1;
                           INTPUT1=1;                                                 //
                           }
/****************按鍵計數(shù)器狀態(tài)寄存器歸零*************/
               void RstKey()
               {
               kcounter=0;                       //按鍵計數(shù)器歸零
               kstatus=0;                        //狀態(tài)寄存器歸零
               }
/*****************按鍵低電平檢測函數(shù)*****************/
               void   LowVoltKey(void)           //按鍵計數(shù)器狀態(tài)標志加一
               {
               kcounter++;                       
               kstatus++;     
               _nop_();                         //延時                  
               }
/*****************按鍵高電平檢測函數(shù)*****************/
               void    HighVoltKey(void)         //按鍵計數(shù)器加一 狀態(tài)標志歸零
               {
               kcounter++;                       //按鍵計數(shù)器加一
               kstatus=0;                        //按鍵狀態(tài)標志歸零
               _nop_();                          //延時
               }
/*------------page 0頁面顯示---------------------*/          //page0  n0設定間距 n3電機速度
                           void disdata_a()//
                           {
                            red_eeprom();
                                printf("n0.val=%d\xff\xff\xff",val1);        //設定間距
                                printf("n0.val=%d\xff\xff\xff",val1);        //設定間距
                                printf("n2.val=%d\xff\xff\xff",val0);        //產(chǎn)量
                                printf("n3.val=%d\xff\xff\xff",val4);        //電機速度
                                if(ZERO_FLAG==1)
                                {
                                 val6=9999;
                                }
                                printf("n1.val=%d\xff\xff\xff",val6);        //實際位置
               }
/*------------page 1頁面顯示---------------------*/
                           void disdata_b()//                                                    
                           {
                            red_eeprom();
                                printf("n0.val=%d\xff\xff\xff",ScaleFactor);        //比例系數(shù)
                            printf("n0.val=%d\xff\xff\xff",ScaleFactor);        //比例系數(shù)
                                printf("n1.val=%d\xff\xff\xff",val2);                //頂進時間
                                printf("n2.val=%d\xff\xff\xff",val3);                //頂退時間         
                                printf("n3.val=%d\xff\xff\xff",val5);                //開閘時間       
                                printf("n5.val=%d\xff\xff\xff",vala);                //歸零位置         
                           }
/*------------page 2頁面顯示---------------------*/
                           void disdata_c()//                                                    
                           {
                            printf("n1.val=%d\xff\xff\xff",val6);               //實際位置
                            printf("n1.val=%d\xff\xff\xff",val6);               //實際位置         
                                printf("n0.val=%d\xff\xff\xff",val8);               //開閘延時時間
                           }
/*************手動電機左移歸零****/
              void Zero_Left()                  //
              {
                           DOWN=0;                                                     //頂退開啟
                           delay100ms(val3);                             //頂退時間
                           DOWN=1;                                                     //頂退關閉
               DIR1=0;
                           MOTORRUN=1;
               while(MOTORRUN)                                         //外部中斷關閉標志位
               {
                            CP1=0;
                                delay(2);
                                CP1=1;
                delay(2);
                                if(ZERO_FLAG==0)
                                MOTORRUN=0;
                           }
                          }
/*************手動電機右移歸零****/
                          void Zero_Right()                  //
              {
                           DOWN=0;                                                     //頂退開啟
                           delay100ms(val3);                             //頂退時間
                           DOWN=1;                                                     //頂退關閉
               DIR1=1;
               MOTORRUN=1;
               while(MOTORRUN)                             //回原點釋放按鍵電機停止
               {
                            CP1=0;
                            delay(2);                                         //
                            CP1=1;
                delay(2);                                         //
                                if(ZERO_FLAG==0)
                                MOTORRUN=0;
                           }
                           DIR1=1;                                                         //
              }                          
/*************手動電機左移****/
              void Motor_Left()                  //
              {
               DIR1=0;
                           MOTORRUN=1;
               while(MOTORRUN)
               {
                            for(k=0;k<ScaleFactor;k++)                 //運行一個比例系數(shù)周期
                                {
                CP1=0;
                                delay(2);
                                CP1=1;
                delay(2);
                                }
                val6=val6+1;
                                if(val6==val1)                                                 //等于0 限位
                                MOTORRUN=0;                                                 //關電機循環(huán)標志
               }
                           printf("n1.val=%d\xff\xff\xff",val6);        //實際位置
                           OUT9=1;
              }
/*************手動電機右移****************/
/*************外部中斷0使能停止***********/

void Motor_Right()                 //
              {
               DIR1=1;
               while(ZERO_FLAG)                                         //零點標志
               {
                            CP1=0;
                            delay(2);
                            CP1=1;
                delay(2);
                           }
                           val6=0;
                           printf("n1.val=%d\xff\xff\xff",val6);        //實際位置
                           DIR1=1;                                                         //
                           OUT9=1;
              }
/*----------產(chǎn)量加一-----------------*/                                                                                           
                           void  totaladd( )
                           {
                                val0=val0+1;
                                if(val0>9999)                         /*大于999*/
                                {
                                val0=0;                                 /*歸零*/
                                }  
                           }
/*----------------自動運行程序----------------*/
//1:原點歸零,賦值中斷位置參數(shù),機器回A點
//2:自動,檢測A點軸承到位,未到位開氣針,關氣針
//3:移動臺板到B點,開氣針,檢測B點軸承到位,未到位開氣針,關氣針。
//4:待機 檢測兩個軸承接近開關,都失電開始第二步動作
//5:檢測B點軸承到位,未到位開氣針,關氣針。
//6:移動臺板到A點,開氣針,檢測A點軸承到位,未到位開氣針,關氣針。
//7:待機 檢測兩個軸承接近開關,都失電開始循環(huán)
                           void autorun()
                           {
                                DOWN=0;                                                     //頂退開啟
                                delay100ms(val3);                             //頂退時間
                                DOWN=1;                                                     //頂退關閉
                                while(manu)                                                 //自動循環(huán),檢測到手動中斷退出循環(huán)
                                {
                                 Signauto=1;                     /*工位A進料低電平檢測無輸入為1,永久循環(huán)*/
                                 FLAG_S=5;                    //1 左 移 2右 移 3頂 進 4頂 退 5開 閘 6關 閘 7待 機
                 printf("va0.val=%d\xff\xff\xff",FLAG_S); //
                 while(Signauto)                 /*工位一檢測標志無輸入為1,永久循環(huán)*/
                  {
//工位A進料檢測
                  Valve=0;                                             //開氣閥
                                  RstKey();
                  for(;kcounter<8;)              //按鍵循環(huán)8次
                  {
                   if(!INTPUTA)                  //工位A進料低電平檢測
                   {
                   LowVoltKey();                                 //低電平檢測到物料
                                   delay(2);
                   }
                   else if(~!INTPUTA)            //工位B進料高電平檢測
                   {
                   HighVoltKey();
                                   delay(2);
                                   }
                  }
                  if(kstatus>=3) /*按鍵狀態(tài)標志大于等于3為有效值*/
                  {                                                                 //檢測到低電平,工位料滿
                              delay100ms(val8);                //延時等輸送帶推進到位
                  Signauto=0; /*行程輸入信號連續(xù)檢測到3次Signauto=0退出循環(huán)*/
                  }
                                 }
                 OUT5=0;                                                         //輸送帶反轉(zhuǎn)
                                 delay100ms(val8);                //輸送帶反轉(zhuǎn)延時
                                 OUT5=1;
                                 FLAG_S=6;                      //1 左 移 2右 移 3頂 進 4頂 退 5開 閘 6關 閘 7待 機
                 printf("va0.val=%d\xff\xff\xff",FLAG_S); //
                                 Valve=1;                                                  //關氣閥
                                 FLAG_S=1;                        //1 左 移 2右 移 3頂 進 4頂 退 5開 閘 6關 閘 7待 機
                 printf("va0.val=%d\xff\xff\xff",FLAG_S); //
//工位A進料檢測結束
                                 Motor_Left();                                   //左 移          DIR1=1;
//工位B進料檢測開始
                 Valve=0;                                                 //開氣閥
                                 RstKey();                       //按鍵復位
                                 Signauto=1;                     /*行程輸入信號檢測標志無輸入為1,永久循環(huán)*/
                                 FLAG_S=6;                        //1 左 移 2右 移 3頂 進 4頂 退 5開 閘 6關 閘 7待 機
                 printf("va0.val=%d\xff\xff\xff",FLAG_S); //
                 while(Signauto)                 /*工位B檢測標志無輸入為1,永久循環(huán)*/
                  {
                  RstKey();
                  for(;kcounter<8;)              //按鍵循環(huán)8次
                  {
                   if(!INTPUTB)                  //工位B進料低電平檢測
                   {
                   LowVoltKey();                                 //低電平kcounter大于5退出循環(huán)
                                   delay(2);
                   }
                   else if(~!INTPUTB)            //工位B進料高電平檢測
                   {
                                        HighVoltKey();
                                        delay(2);
                                   }
                  }
                  if(kstatus>=3) /*按鍵狀態(tài)標志大于等于3為有效值*/
                  {
                                  delay100ms(val8);                //延時等輸送帶推進到位
                              Signauto=0; /*行程輸入信號連續(xù)檢測到3次Signauto=0退出循環(huán)*/
                  }
                                 }
                             OUT5=0;                                                         //輸送帶反轉(zhuǎn)
                                 delay100ms(val8);                //輸送帶反轉(zhuǎn)延時
                                 OUT5=1;
                                 Valve=1;                                                 //關氣閥
                                 FLAG_S=2;                        //1 左 移 2右 移 3頂 進 4頂 退 5開 閘 6關 閘 7待 機
                 printf("va0.val=%d\xff\xff\xff",FLAG_S); //
//右 移 使用外中斷
EX0=1;                          //開外部中斷0
ZERO_FLAG=1;                                         //
                                 FLAG_S=2;                        //1 左 移 2右 移 3頂 進 4頂 退 5開 閘 6關 閘 7待 機
                 printf("va0.val=%d\xff\xff\xff",FLAG_S); //
                 Motor_Right();
                                 FLAG_S=3;                        //1 左 移 2右 移 3頂 進 4頂 退 5開 閘 6關 閘 7待 機
                 printf("va0.val=%d\xff\xff\xff",FLAG_S); //
                                 delay100ms(val2);                             //頂出時間
                                 UP=0;                                                         //頂出軸承
                                 DOWN=1;                                                 //
                                 delay100ms(val2);                             //頂出時間
//工位AB軸承取出檢測,都是低電平物料取出,頂退左移  常閉開關
                                 RstKey();                                                 //
                                 for(;kcounter<8;)               //按鍵循環(huán)8                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                次
                                 {
                                  if(!INTPUTA1&&!INTPUTB1)           //工位AB頂出軸承信號檢測
                                  {                                                                 //常閉開關
                   LowVoltKey();
                   }
                                  else
                                  kcounter=0;                    //無限循環(huán)
                                 }
                                 FLAG_S=4;                        //1 左 移 2右 移 3頂 進 4頂 退 5開 閘 6關 閘 7待 機
                 printf("va0.val=%d\xff\xff\xff",FLAG_S); //
                                 UP=1;                                                         //頂出關閉
                                 DOWN=0;                                                 //頂退開啟
                                 delay100ms(val3);                             //頂退時間
                                 DOWN=1;                                                 //頂退關閉
                 totaladd();
                                 printf("n2.val=%d\xff\xff\xff",val0/2);        //產(chǎn)量
                     }
                           }
/*------------初始化串口---------------------*/
              void InitUart()
              {
              SCON=0X50;                  
      //8位數(shù)據(jù),可變波特率
              AUXR|=0x01;                        //串口1選擇定時器2為波特率發(fā)生器
              AUXR|=0X04;                        //定時器2時鐘為Fosc,即1T
              T2L=0XE0;                          //設置定時器處置  110592》9600
              T2H=0XFE;                          //設置定時器處置  110592》9600
              AUXR|=0X10;                        //啟動定時器2
              TI=1;                                                                 //
                          ES=1;                                                         //
              EA=1;                                                                 //
              }
/*×--------UART 中斷服務程序-------------------**/
/**×**把接收到的數(shù)據(jù)存進數(shù)組a[i]**i開機初始化****/
/***×*接收到觸摸屏結束碼Receive_Flag標志位置1****/
/****×主程序檢測到標志碼=1判斷指令功能***********/
              void Uart() interrupt 4 using 1
              {
               if(RI)
               {
                            if(SBUF==0XFA||SBUF==0XFF)                 //觸摸屏結束碼
                                {
                                Receive_Flag=1;                             //接收數(shù)據(jù)標志置一
                                RI=0;                                             //
                            i=0;                                         //數(shù)組計數(shù)器歸零
                                }
                            else
                            {
                            a[i]=SBUF;                       //數(shù)組下標位置的數(shù)據(jù)等于SBUF
                RI=0;                                             //
                                i++;
                            }
               }
                           if(Receive_Flag==1)                                 //關手動伺服電機工作
                            {
                             if(a[0]==0XE0)                         //觸摸屏放開左移右移歸零鍵
                             {
                              if(a[1]==0XA8)                     //
                                   {
                              Receive_Flag=0;                                 //串口中斷接收標志置零
                                  i=0;                                         //數(shù)組計數(shù)器歸零
                                  MOTORRUN=0;                                         //關伺服電機
                                  OUT9=0;                        //運行標志manu 置0
                  }
                                 }
                                 else if(a[0]==0XA0&&a[1]==0X00)         //觸摸屏發(fā)手動信號
                                 {
                                 manu=0;
                                 }
                            }
                          }
/**************原點歸零**************************/
              void exint0() interrupt 0          //INT0中斷入口
              {
               RstKey();                         //按鍵復位
               if(ZERO_FLAG==1)
               {
                if(!S1)                          //中斷入口
                {
                 for(;kcounter<5;)               //按鍵循環(huán)5次
                 {
                  if(!S1)                        //中斷入口低電平
                  {
                  LowVoltKey();                                         //按鍵低電平 計數(shù)器加一狀態(tài)標志加一
                  }
                  else if(~!S1)                  //中斷入口高電平
                  {
                  HighVoltKey();                 //按鍵計數(shù)器加一        狀態(tài)標志歸零
                  }
                 }
                 if(kstatus>=3)                  /*按鍵狀態(tài)標志大于等于3為有效值*/
                 {     
                 EX0=0;                          //關外部中斷0
                 ZERO_FLAG=0;
                 val6=vala;                      //伺服電機零點        實際位置
                 delay(200);
                                 Up_XData=1;                                         //原點更新標志
                 }
                }
                RstKey();                        //按鍵復位
               }
              }
/*************************************************/
                          void   main( )                      /*主程序開始*/
              {
                           reset_io();
                           IT0=1;                            //設置INT0的中斷類型 (1:僅下降沿 0:上升沿和下降沿)
               EX0=1;                            //使能INT0中斷
                           Led=0;
                           OUT7=0;                                      //
                           delay10ms(3000);                  //延時(30)等觸摸屏先啟動
                           AUXR=0X80;                        //STC系列的1T 設置
               TMOD=0X01;
                           P_SW1=0x00;                       //RXD/P3.0, TXD/P3.1
                           Receive_Flag=0;       
               InitUart();                       //初始化串口
                           printf("0XFF,0XFF,0XFF");
                           delay10ms(30);                   //延時
                           disdata_a();
                           delay10ms(30);                   //延時
                           disdata_a();
                           i=0;                              //數(shù)據(jù)接收計數(shù)器等于0
                           OUT7=1;                                      //
                           val6=9999;                                                  //未回原點,禁止自動
                           printf("n1.val=%d\xff\xff\xff",val6);
                           ZERO_FLAG=1;
                           while(1)                        //INTPUT1
                           {
                           if(Up_XData==1)                             //X軸原點更新標志為1,刷新X軸位置
                                {
                                 Up_XData=0;
                                 printf("n1.val=%d\xff\xff\xff",val6);          //伺服電機零點        實際位置
                            }
/***********************************************/
                           if(Receive_Flag==1)
                           {
                            Receive_Flag=0;                                 //重新接收
                 if(a[0]==0XE0)                
                             {
                                  if(a[1]==0XA1)                         //給單片機發(fā)頂 進信號
                                  {
                                   UP=0;                                         //頂 進
                                  }
                                  else if(a[1]==0XA2)                     //給單片機發(fā)頂 退信號
                                  {
                                   DOWN=0;  
                                  }
                                  else  if(a[1]==0XA3)                     //開 閘
                                  {
                                   Valve=0;
                                  }
                                   else if(a[1]==0XA4)                     //關 閘
                                  {
                                   Valve=1;
                                  }
                                  else if(a[1]==0XA5)                     //右移
                                  {
                                   OUT9=0;
                                   Motor_Right();
                                  }
                                  else if(a[1]==0XA6)                     //左移
                                  {
                                   OUT9=0;
                                   Motor_Left();
                                  }
                                  else if(a[1]==0XA7)                     //關頂進頂退
                                  {
                                   UP=1;                                         //頂 進
                                   DOWN=1;
                                  }                                                                 //
                                  else if(a[1]==0XBA)                     //右移歸零
                                  {
                                   Zero_Right();
                                  }                                                                 //
                                  else if(a[1]==0XBB)                     //左移歸零
                                  {
                                   Zero_Left();
                  }
                                 }
                                 else if(a[0]==0XE1)                 //出廠數(shù)據(jù)恢復
                             {
                                  if(a[1]==0XA1)                         //
                                  {
                                   delay10ms(1);
                                   disdata_a();                                     //page0  n0設定間距 n3電機速度
                                  }
                                  else if(a[1]==0XA2)                     //
                                  {
                                   delay10ms(1);
                                   disdata_b();                                     //page1 n0比例系數(shù) n1頂進時間 n2頂退時間 n3開閘時間
                                  }
                                  else if(a[1]==0XA3)                     //
                                  {
                                   delay10ms(1);
                                   disdata_c();                                     //page2 n0           實際位置
                                  }
                                 }
                                else if(a[0]==0XC0)                     //
                            {
                                 if(a[1]==0X01)                             //
                                 {
                                 val1=a[3]*256+a[2];                 //設定間距
                                 printf("n4.val=%d\xff\xff\xff",val1);        //返回數(shù)據(jù)核對
                                 }
                                 else  if(a[1]==0X02)                     //
                                 {
                                 val4=a[3]*256+a[2];                 //電機速度
                                 printf("n4.val=%d\xff\xff\xff",val4);        //返回數(shù)據(jù)核對
                                 }
                                 else  if(a[1]==0X03)                     //
                                 {
                                 ScaleFactor=a[3]*256+a[2];             //比例系數(shù)
                                 printf("n4.val=%d\xff\xff\xff",ScaleFactor);        //返回數(shù)據(jù)核對
                 }
                                 else  if(a[1]==0X04)                     //
                                 {
                                 val2=a[3]*256+a[2];                 //頂進時間
                                 printf("n4.val=%d\xff\xff\xff",val2);        //返回數(shù)據(jù)核對
                 }
                                 else  if(a[1]==0X05)                     //
                                 {
                                 val3=a[3]*256+a[2];                 //頂退時間
                                 printf("n4.val=%d\xff\xff\xff",val3);        //返回數(shù)據(jù)核對
                 }
                                 else  if(a[1]==0X06)                     //
                                 {
                                 val5=a[3]*256+a[2];                 //頂出距離
                                 printf("n4.val=%d\xff\xff\xff",val5);        //返回數(shù)據(jù)核對
                 }
                                 else  if(a[1]==0X07)                     //
                                 {
                                 vala=a[3]*256+a[2];                 //歸零位置
                                 printf("n4.val=%d\xff\xff\xff",vala);        //返回數(shù)據(jù)核對
                 }
                                 else  if(a[1]==0X08)                     //
                                 {
                                 val8=a[3]*256+a[2];                 //開閘延時         觸摸屏page2
                                 printf("n2.val=%d\xff\xff\xff",val8);        //返回數(shù)據(jù)核對
                 }
                                 Led=0;
                                 Write_EepromTime();
                                 delay10ms(500);                  //
                                }
                            else  if(a[0]==0XB0)                 //手動半自動全自動
                                 {
                                 if(a[1]==0XA1)                             //手動
                                 {
                                 Auto_Led=1;                                         //
                                 manu=0;                                         //       
                                 }
                                else  if(a[1]==0XA2)                     //半自動
                                {
                                 if(ZERO_FLAG==0)                                 //
                                 {
                                 Auto_Led=1;                                         //
                                 manu=1;                                 //
                                 autorun();                                             //半自動自動運行
                                 }
                                }
                           }
              }
///////////////////////////
                           RstKey();                                                 //按鍵自動
                           for(;kcounter<5;)                 //按鍵循環(huán)5次
                {
                 if(!INTPUT1)                    //按鍵低電平
                 {
                 LowVoltKey();                   //按鍵低電平 計數(shù)器加一狀態(tài)標志加一
                 }
                 else if(~!INTPUT1)              //按鍵高電平
                 {
                 HighVoltKey();                  //按鍵計數(shù)器加一    狀態(tài)標志歸零
                 }
                }
                if(kstatus>=3)                   /*按鍵狀態(tài)標志大于等于3為有效值*/
                {
                                Auto_Led=0;                                             //
                                manu=1;                                             //自動循環(huán)        運行標志置1
                autorun();
                }
                          }     
                        }                                    //L716  CODE 3614  2021 12 25               

回復

使用道具 舉報

ID:807591 發(fā)表于 2022-1-18 09:34 | 顯示全部樓層
多半是干擾問題,且程序不能恢復,不能說程序完全沒問題,各打50大板,退堂
回復

使用道具 舉報

ID:161164 發(fā)表于 2022-1-18 11:39 | 顯示全部樓層
如果變慢之后觸摸屏的顯示和控制都沒有問題代表了內(nèi)部定時器沒受到影響
可以把脈沖輸出代碼改作用定時器控制
示范代碼如下
void Timer0Init(void)                //7微秒@11.0592MHz
{
        AUXR |= 0x80;                //定時器時鐘1T模式
        TMOD &= 0xF0;                //設置定時器模式
        TL0 = 0xB1;                //設置定時初始值
        TH0 = 0xFF;                //設置定時初始值
        TF0 = 0;                //清除TF0標志
        TR0 = 0;                //定時器0停止計時
}

void Zero_Left()                  //
{
    DOWN = 0;                                                   //頂退開啟
    delay100ms(val3);                             //頂退時間
    DOWN = 1;                                                   //頂退關閉
    DIR1 = 0;
    MOTORRUN = 1;
        CP = 0;
        TR0 = 1;                //定時器0開始計時
    while(MOTORRUN)                                         //外部中斷關閉標志位
    {
                if(TF0)//定時器0溢出
                {
                        CP ^= 1;
                        TF0 = 0;//清除TF0標志
                }               
        if(ZERO_FLAG == 0)
            MOTORRUN = 0;
    }
        CP = 1;
        TR0 = 0;                //定時器0停止計時
}
/*************手動電機左移****/
void Motor_Left()                  //
{
    DIR1 = 0;
    MOTORRUN = 1;
        CP = 1;
        TR0 = 1;                //定時器0開始計時
        k = 0;
    while(MOTORRUN)
    {
                if(TF0)//定時器0溢出
                {
                        CP ^= 1;
                        TF0 = 0;//清除TF0標志
                        if(k < ScaleFactor * 2)           //運行一個比例系數(shù)周期
                        {
                                k++;                       
                        }else(
                                val6 = val6 + 1;
                                k = 0;                               
                        )
                }               
        if(val6 == val1)                                               //等于0 限位
            MOTORRUN = 0;                                               //關電機循環(huán)標志
    }
        CP = 1;
        TR0 = 0;                //定時器0停止計時
    printf("n1.val=%d\xff\xff\xff", val6);       //實際位置
    OUT9 = 1;
}
最好就是改CP 為定時器0輸出腳

評分

參與人數(shù) 1黑幣 +10 收起 理由
czhaii + 10 贊一個!

查看全部評分

回復

使用道具 舉報

ID:844772 發(fā)表于 2022-1-18 15:40 | 顯示全部樓層
是不是串口通信受到干擾導致延遲時間長了,降點通訊速度和處理一下串口線(比如弄短點)?其實你也不管電機轉(zhuǎn)多少圈,也不管速度,何必用步進電機呢,就普通電機算了,把行程開關前移一點也不用加剎車。
回復

使用道具 舉報

ID:230742 發(fā)表于 2022-1-19 03:01 | 顯示全部樓層
樓上說得對,應該是有干擾。或者串口速率低點。
也可以用PLC,或者一個叫多軸控制器的。
工業(yè)上還是PLC用得多一點。就是穩(wěn)定。不影響生產(chǎn)。畢竟機器運行運行停一下,有損失的。
回復

使用道具 舉報

ID:140644 發(fā)表于 2022-1-19 18:22 | 顯示全部樓層
szb314 發(fā)表于 2022-1-18 09:34
多半是干擾問題,且程序不能恢復,不能說程序完全沒問題,各打50大板,退堂

葫蘆僧亂判葫蘆案
回復

使用道具 舉報

ID:140644 發(fā)表于 2022-3-15 07:29 | 顯示全部樓層
繼電器改固態(tài)繼電器,故障解決
回復

使用道具 舉報

ID:584814 發(fā)表于 2022-3-15 08:25 | 顯示全部樓層
czhaii 發(fā)表于 2022-3-15 07:29
繼電器改固態(tài)繼電器,故障解決

STC說程序問題呵呵,有問題沒可能前期運行正常,多半是抗干擾不行但又不認帳。
回復

使用道具 舉報

ID:140644 發(fā)表于 2022-3-15 08:57 | 顯示全部樓層
前面三條機器沒有用繼電器,這次要拖動幾個調(diào)速電機。
所以并了兩個繼電器,過了春節(jié)去把繼電器換了,當天就好了,二十多天沒有出現(xiàn)故障
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 在线视频一区二区 | 日韩视频a| 本道综合精品 | 中文字幕视频免费 | 国产精久久久久久久 | 中文字幕日韩欧美一区二区三区 | 精品欧美乱码久久久久久 | 日韩欧美在线观看视频 | 国产精品久久 | 国产精品毛片 | 在线观看日本高清二区 | 亚洲乱码一区二区三区在线观看 | 欧美日韩理论 | 日本久久www成人免 成人久久久久 | 亚洲国产一区二区三区 | 国产成人在线播放 | 国产精品视频一二三区 | 国产在线观 | 成人在线中文字幕 | 国产中文字幕网 | 国产黄色一级片 | 99久久精品国产麻豆演员表 | a级免费黄色片 | 国产精品自产拍在线观看蜜 | www.日韩 | 欧美国产日韩精品 | 日韩黄色小视频 | 就操在线 | 精品在线一区二区 | 91pron在线 | 毛片免费看 | av免费看在线 | 免费国产一区 | 成人av网站在线观看 | 国产成人啪免费观看软件 | 日韩精品在线播放 | 亚洲精久 | 国产高清精品一区二区三区 | 99免费视频| 黄网免费看 | 一级一级一级毛片 |