找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

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

STC單片機(jī)15W1K16S驅(qū)動(dòng)伺服電機(jī) 幾個(gè)小時(shí)后突然速度變慢

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

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

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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



/***機(jī)械手自動(dòng)調(diào)試L716  CODE 3614  2021 12 25********/
/***原點(diǎn)進(jìn)料,右移回原點(diǎn) 進(jìn)料檢測(cè)8次消抖動(dòng) ***********/       
              #include     <REG52.H>                      //開自動(dòng)先頂退
              #include     <intrins.h>                    //保壓時(shí)間
                          #include     <string.h>
                          #include     "stdio.h"
                          #include     <stdlib.h>
              #define      uint unsigned int
              #define      uchar unsigned char
                          bit          Up_XData=0;                         //原點(diǎn)更新標(biāo)志,X發(fā)生中斷置一,回主程序更新X軸位置
                          sbit         Led=P5^4;                     //EEPROM寫指示
                          sbit         Auto_Led=P5^5;                 //自動(dòng)運(yùn)行指示
                          sbit         CP1=P2^6;             //
                          sbit         DIR1=P2^7;            //
                          sbit         UP=P1^0;                                 /****頂進(jìn)輸出信號(hào)****/
                          sbit         DOWN=P1^1;                         /****頂退輸出信號(hào)****/
                          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;                                 /***伺服電機(jī)零點(diǎn)賦值****/
                          sbit               S2=P3^3;                                 /***伺服電機(jī)右限位****/
                          sbit               INTPUTA=P3^4;                 /***工位A進(jìn)料檢測(cè)****/
                          sbit               INTPUTB=P3^5;                 /***工位B進(jìn)料檢測(cè)****/
                          sbit               INTPUTA1=P3^6;                 /***工位A1空位檢測(cè)****/
                          sbit               INTPUTB1=P3^7;                 /***工位B1空位檢測(cè)****/
                          sbit               INTPUT1=P2^0;                 /***按鈕開自動(dòng)****/
                          bit          ZERO_FLAG;            /*零點(diǎn)標(biāo)志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    //時(shí)間 EEPROM首地址
                          bit                    manu;                                 /****手動(dòng)標(biāo)志位 0 1****/
                          bit                   MOTORRUN=0;                         //電機(jī)運(yùn)行標(biāo)志
                          bit                    Signauto;                     //*檢測(cè)接近開關(guān)自動(dòng)運(yùn)行標(biāo)志*/
                          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)量計(jì)數(shù)器1設(shè)定間距2頂進(jìn)時(shí)間3頂退時(shí)間4電機(jī)速度*/
                          static       uint         val5,val7;  /*5開閘時(shí)間7緩沖*/
                          static       uint         val6;                //6實(shí)際位置
                          static       uint         val8;                //開閘延時(shí),推進(jìn)輪子進(jìn)模具
                          bit                   Receive_Flag;
                          uchar        kcounter,kstatus;     //按鍵計(jì)數(shù)標(biāo)志 按鍵狀態(tài)標(biāo)志
                          uint         a[10];                //定義數(shù)組a 存儲(chǔ)串口數(shù)據(jù)串
/*------------------------------------------*/
              void delay(uint t)
              {
              uint i,j;
              for(i=0;i<t;i++)
              for(j=0;j<2;j++);
              }
/*------------------延時(shí)子程序------------------------*/
               void delay10ms(uint x)
               {
               uint i, j;
               for (i=0;i<x;i++)
               for (j=0;j<500;j++);
               }
/*------------------延時(shí)子程序------------------------*/
               void delay100ms(uint x)
               {
               uint i, j;
               for (i=0;i<x;i++)
               for (j=0;j<11000;j++);
               }
/*----關(guān)閉IAP----------------------------*/
              void IapIdle()
              {
              IAP_CONTR = 0;                  //關(guān)閉IAP功能
              IAP_CMD = 0;                    //清除命令寄存器
              IAP_TRIG = 0;                   //清除觸發(fā)寄存器
              IAP_ADDRH = 0x80;               //將地址設(shè)置到非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;             //設(shè)置IAP命令
              IAP_ADDRL = addr;               //設(shè)置IAP低地址
              IAP_ADDRH = addr >> 8;          //設(shè)置IAP高地址
              IAP_TRIG = 0x5a;                //寫觸發(fā)命令(0x5a)
              IAP_TRIG = 0xa5;                //寫觸發(fā)命令(0xa5)
              _nop_();                        //等待ISP/IAP/EEPROM操作完成
              dat = IAP_DATA;                 //讀ISP/IAP/EEPROM數(shù)據(jù)
              IapIdle();                      //關(guān)閉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;          //設(shè)置IAP命令
              IAP_ADDRL = addr;               //設(shè)置IAP低地址
              IAP_ADDRH = addr >> 8;          //設(shè)置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;            //設(shè)置IAP命令
              IAP_ADDRL = addr;               //設(shè)置IAP低地址
              IAP_ADDRH = addr >> 8;          //設(shè)置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);  //設(shè)定間距高八位
                          n=IapReadByte(IAP_ADDRESS+1);  //設(shè)定間距低八位
                          val1=m*256+n;                                 //設(shè)定間距
                          m=IapReadByte(IAP_ADDRESS+2);  //電機(jī)速度高八位
                          n=IapReadByte(IAP_ADDRESS+3);  //電機(jī)速度低八位
                          val4=m*256+n;                                 //電機(jī)速度
                          m=IapReadByte(IAP_ADDRESS+4);  //比例系數(shù)高八位
                          n=IapReadByte(IAP_ADDRESS+5);  //比例系數(shù)低八位
                          ScaleFactor=m*256+n;                         //比例系數(shù)
              m=IapReadByte(IAP_ADDRESS+6);  //頂進(jìn)時(shí)間高八位
                          n=IapReadByte(IAP_ADDRESS+7);  //頂進(jìn)時(shí)間低八位
                          val2=m*256+n;                                 //頂進(jìn)時(shí)間
                          m=IapReadByte(IAP_ADDRESS+8);  //頂退時(shí)間高八位
                          n=IapReadByte(IAP_ADDRESS+9);  //頂退時(shí)間低八位
                          val3=m*256+n;                                         //頂退時(shí)間
                          m=IapReadByte(IAP_ADDRESS+10); //開閘時(shí)間高八位
                          n=IapReadByte(IAP_ADDRESS+11); //開閘時(shí)間低八位
                          val5=m*256+n;                                         //開閘時(shí)間
                          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);       /*設(shè)定間距高八位*/       
                           IapProgramByte(IAP_ADDRESS+1,val1%256);       /*設(shè)定間距低八位*/

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

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

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

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

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

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

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

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

回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

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

評(píng)分

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

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

ID:230742 發(fā)表于 2022-1-19 03:01 | 顯示全部樓層
樓上說得對(duì),應(yīng)該是有干擾;蛘叽谒俾实忘c(diǎn)。
也可以用PLC,或者一個(gè)叫多軸控制器的。
工業(yè)上還是PLC用得多一點(diǎn)。就是穩(wěn)定。不影響生產(chǎn)。畢竟機(jī)器運(yùn)行運(yùn)行停一下,有損失的。
回復(fù)

使用道具 舉報(bào)

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

葫蘆僧亂判葫蘆案
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

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

快速回復(fù) 返回頂部 返回列表