請問步進馬達失步的問題 |
|
peter777
一般會員 發表:1 回覆:0 積分:0 註冊:2005-07-16 發送簡訊給我 |
各位大大好~
我使用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 發送簡訊給我 |
|
阿信
版主 發表:111 回覆:983 積分:813 註冊:2005-03-10 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |