全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3008
推到 Plurk!
推到 Facebook!

請問步進馬達失步的問題

 
peter777
一般會員


發表:1
回覆:0
積分:0
註冊:2005-07-16

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-09-28 12:59:16 IP:163.23.xxx.xxx 未訂閱
各位大大好~ 我使用TMS320VC33的DSP CPU 及所附的Code Composer 編輯器(C語言) 寫出的程式來控制兩相步進馬達 全步驅動時正反轉、轉速及所轉步數。 可是會有失步問題。 頻率設100以下失步約三到五步, 100以上失步問題愈嚴重。 想請問各位大大, 我的寫法有沒有問題, 或是有比較好的寫法。謝謝! 並請問如果用c++Build 寫rs232的傳輸字串介面, 當傳送字串到CPU時, 如果把字串轉成數值(使用c語言)。 謝謝! PS.馬達規格 1.8Deg. 12V 0.2A  程式如下: /**************************************/ /* Data:2005/09/23                     */ /* Name:VC33 Motor Control  program   */ /**************************************/ #include "stdlib.h" #include "stdio.h" #include "ctype.h" #include "math.h" #include "string.h"     #define  MAXQ   64   void stc_vc33_init( void ); float x=0; float y=0; void delay(int time); void string(void); void rs232_flush( void ); char rs232_in( void ); int  rs232_out( char ); void string2PC( char *str ); int  rear_i = -1, front_i = -1; int  rear_o = -1, front_o = -1;  int i; char queue_i[ MAXQ ]; char queue_o[ MAXQ ];   char cmd;     int  ccw=0;      volatile unsigned int *DATA_BUF  = (unsigned int*) 0xC03000; volatile unsigned int *INT_EN    = (unsigned int*) 0xC03001; volatile unsigned int *INT_FIFO  = (unsigned int*) 0xC03002; volatile unsigned int *COM_CTRL  = (unsigned int*) 0xC03003; volatile unsigned int *COM_STATE = (unsigned int*) 0xC03005; // volatile unsigned int *RS232_RST = (unsigned int*) 0xC04040;                                                                          void delay(int time); int i=0,j=0; int ledstatus=0; volatile unsigned int freq=20; volatile unsigned int *AD_CS=(unsigned int*)0xc00000; volatile unsigned int *CMD_LD=(unsigned int*)0xc06000; volatile unsigned int *LATCH_OE=(unsigned int*)0xc07000; volatile unsigned int *DA0_CS= (unsigned int*) 0xc01000; volatile unsigned int *DA1_CS= (unsigned int*) 0xc01001; volatile unsigned int *DA2_CS= (unsigned int*) 0xc01002; volatile unsigned int *DA3_CS= (unsigned int*) 0xc01003; volatile unsigned int *LED= (unsigned int*) 0xc02000; volatile unsigned int *strb=(unsigned int*)0x808064; volatile long *TMR0_CTRL   = (long*) 0x808020; volatile long *TMR0_CNT    = (long*) 0x808024; volatile long *TMR0_PERIOD = (long*) 0x808028;  volatile long *TMR1_CTRL   = (long*) 0x808030; volatile long *TMR1_CNT    = (long*) 0x808034; volatile long *TMR1_PERIOD = (long*) 0x808038; int count=0;   void c_int99(void) {          }         void c_int09(void) {       if(ccw==0)   {x++;     if (x>=y)    { string2PC(" fuck ");       delay(1000000);      main();    }         if(ledstatus==0)      {       *DA0_CS=16384+32768;       *DA1_CS=32768 ;        *DA2_CS=32768 ;        *DA3_CS=32768 ;      /*1.25V=16384 1V=13107 */       *LED=0;                 /*0.625V=8192 output=2.5V*/       ledstatus=1;       }     else            {      if(ledstatus==1)        {       *DA0_CS=32768;       *DA1_CS=16384+32768 ;        *DA2_CS=32768 ;        *DA3_CS=32768 ;      /*1.25V=16384 1V=13107 */       *LED=0;                 /*0.625V=8192 output=2.5V*/       ledstatus=2;          }     else     {      if(ledstatus==2)             {       *DA0_CS=32768;       *DA1_CS=32768 ;        *DA2_CS=16384+32768 ;        *DA3_CS=32768 ;      /*1.25V=16384 1V=13107 */       *LED=0;                 /*0.625V=8192 output=2.5V*/       ledstatus=3;        }       else         if(ledstatus==3)             {       *DA0_CS=32768;       *DA1_CS=32768 ;        *DA2_CS=32768 ;        *DA3_CS=16384+32768 ;      /*1.25V=16384 1V=13107 */       *LED=0;                 /*0.625V=8192 output=2.5V*/       ledstatus=0;        }        }         }      }     else         if(ccw==1)   { x++;     if (x>=y)    { string2PC(" fuck ");       delay(1000000);      main();    }        if(ledstatus==0)      {       *DA3_CS=16384+32768;       *DA2_CS=32768 ;        *DA1_CS=32768 ;        *DA0_CS=32768 ;      /*1.25V=16384 1V=13107 */       *LED=0;                 /*0.625V=8192 output=2.5V*/       ledstatus=1;      }     else            {      if(ledstatus==1)        {       *DA3_CS=32768;       *DA2_CS=16384+32768 ;        *DA1_CS=32768 ;        *DA0_CS=32768 ;      /*1.25V=16384 1V=13107 */       *LED=0;                 /*0.625V=8192 output=2.5V*/       ledstatus=2;       }     else     {      if(ledstatus==2)             {       *DA3_CS=32768;       *DA2_CS=32768 ;        *DA1_CS=16384+32768 ;        *DA0_CS=32768 ;      /*1.25V=16384 1V=13107 */       *LED=0;                 /*0.625V=8192 output=2.5V*/       ledstatus=3;       }       else         if(ledstatus==3)             {       *DA3_CS=32768;       *DA2_CS=32768 ;        *DA1_CS=32768 ;        *DA0_CS=16384+32768 ;      /*1.25V=16384 1V=13107 */       *LED=0;                 /*0.625V=8192 output=2.5V*/       ledstatus=0;       }        }         }      }     }    asm(" NOP");    asm(" NOP");            main() {          int i=0,j=0;    y=200;     *strb=0xf10b8;      stc_vc33_init();       string2PC("c>pos d>neg p,w,m,k,l>Freq\n ");       while (1)       {x=0;                                cmd=rs232_in();          rs232_out(cmd);          delay(200000);               switch(cmd){          case 'c':          case 'C':                   ccw=0;                   break;          case 'd':          case 'D':                   ccw=1;                   break;          case 'p':          case 'P':                   freq=200;                   break;          case 'w':          case 'W':                   freq=400;                    break;          case 'm':          case 'M':                   freq=600;                   break;           case 'k':          case 'K':                   freq=800;                   break;            case 'l':          case 'L':                   freq=1000;                   break;              case '1':                   y=200;                   break;          case '2':                   y=400;                   break;          case '3':                   y=600;                   break;          case '4':                   y=800;                   break;          case '5':                   y=1000;                   break;          case '6':                   y=2000;                   break;                            case 's':          case 'S':                    goto start;             }                            } start:;                             while (1)       {                                cmd=rs232_in();          rs232_out(cmd);          delay(200000);               switch(cmd){          case 'c':          case 'C':                   ccw=0;                   break;          case 'd':          case 'D':                   ccw=1;                   break;          case 'p':          case 'P':                   freq=200;                   break;          case 'w':          case 'W':                   freq=400;                    break;          case 'm':          case 'M':                   freq=600;                   break;           case 'k':          case 'K':                   freq=800;                   break;            case 'l':          case 'L':                   freq=1000;                   break;                              case 'x':          case 'X':                    goto stop;                               }                   asm(" LDI 0h,IF");   asm(" LDI 0h,IE");           *TMR0_PERIOD=30000000/freq;     *TMR0_CTRL =0x2c1;   delay(20);   asm("\tor 2000h,ST");    asm("\tor 100h,IE");   delay(20);                 }                stop:;   }            void delay(int time ) {  int a;  for(a=0;a 發表人 -

版主


發表:261
回覆:2302
積分:1667
註冊:2005-01-04

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-09-28 13:11:57 IP:211.22.xxx.xxx 未訂閱
Po 程式碼請做好縮排. 不知如何做請參考版規. 煩請修改配合,謝謝!
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
阿信
版主


發表:111
回覆:983
積分:813
註冊:2005-03-10

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-09-28 14:47:49 IP:211.21.xxx.xxx 未訂閱
馬達要有加速曲線 稱為S曲線(S-CURVE) 如果要高速 要先跑一小段低速 再加速到中速 再加到高速 快到定位時 也要減到中速 再減到低速 直接要跑高速 給馬達的力矩 不足以瞬間加速
系統時間:2024-06-03 9:16:07
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!