Báo Cáo TT.Vi Xử Lý
BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN MOTOR BƯỚC
Bài 1: điều khiển motor bước quay thuận nữa bước với tốc độ 1 vòng/phút.
câu 3:
#include "msp430fg4618.h"
#include "intrinsics.h"
//------------------------
void main ( void )
{ WDTCTL = WDTPW + WDTHOLD;
//bang ma dieu khien nua buoc
unsigned char
CODE[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; unsigned char i;
P4DIR=0xff; while(1)
{
for(i=0;i<8;i++)
{ P4OUT=CODE[i]; //quay nua buoc
__delay_cycles(1250000); //delay 1.25s
}
}
}
13 trang |
Chia sẻ: thuychi11 | Lượt xem: 834 | Lượt tải: 0
Bạn đang xem nội dung tài liệu Báo cáo TT vi xử lý - Bài 7: Lập trình điều khiển motor bước, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
Báo Cáo TT.Vi Xử Lý
BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN MOTOR BƯỚC
Bài 1: điều khiển motor bước quay thuận nữa bước với tốc độ 1 vòng/phút.
câu 3:
#include "msp430fg4618.h"
#include "intrinsics.h"
//------------------------
void main ( void )
{ WDTCTL = WDTPW + WDTHOLD;
//bang ma dieu khien nua buoc
unsigned char
CODE[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; unsigned char i;
P4DIR=0xff; while(1)
{
for(i=0;i<8;i++)
{ P4OUT=CODE[i]; //quay nua buoc
__delay_cycles(1250000); //delay 1.25s
}
}
}
Câu 4: Sửa lại chương trình để thay đổi tốc độ quay cho motor
Tăng thời gian delay tốc độ động cơ sẽ giảm và ngược lại.
Ví dụ để tăng tốc độ động cơ
#include "msp430fg4618.h"
#include "intrinsics.h"
//------------------------
void main( void )
{ WDTCTL = WDTPW + WDTHOLD;
//bang ma dieu khien
unsigned char
CODE[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};
unsigned char i;
P4DIR=0xff; while(1)
{
for(i=0;i<8;i++)
{ P4OUT=CODE[i]; //quay nua buoc
__delay_cycles(300000); // }
}
}
Câu 5: Sửa lại chương trình để điều khiển motor bước quay thuận theo kiểu Wave Stepping.
#include "msp430fg4618.h"
#include "intrinsics.h"
//------------------------
void main( void )
{ WDTCTL = WDTPW + WDTHOLD;
//bang ma dieu khien
unsigned char
CODE[]={0x01, 0x02, 0x04,0x08};
unsigned char i;
P4DIR=0xff;
while(1)
{
for(i=0;i<4;i++)
{ P4OUT=CODE[i];
__delay_cycles(625000); }
}
}
6. Sửa lại chương trình để điều khiển motor bước quay thuận theo kiểu Full Stepping.
#include "msp430fg4618.h"
#include "intrinsics.h"
//------------------------
void main( void )
{ WDTCTL = WDTPW + WDTHOLD;
unsigned char
CODE[]={0x03, 0x06, 0x0c,0x09};
unsigned char i;
P4DIR=0xff;
while(1)
{
for(i=0;i<4;i++)
{ P4OUT=CODE[i]; //quay nua buoc
__delay_cycles(625000);}
}
}
7. Sửa lại chương trình để điều khiển motor bước quay thuận 100 bước theo kiểu Full Stepping, sau đó quay ngược 100 bước theo kiểu Wave stepping rồi dừng hẳn.
#include "msp430fg4618.h"
#include "intrinsics.h"
//------------------------
void main( void )
{ WDTCTL = WDTPW + WDTHOLD;
unsigned char
CODE[]={0x03, 0x06, 0x0c,0x09};// kieu full
CODE1[]={0x01, 0x02, 0x04,0x08};//kieu wave
unsigned char i;
P4DIR=0xff;
for (int t=0;t<25;t++) // lặp 25 lần
{
for(i=0;i<4;i++) // mỗi lần của 25 lần thì quay 4 bước
{ P4OUT=CODE[i]; //quay full
__delay_cycles(625000);
}}
for (int t=0;t<25;t++)
{
for(i=4;i>0;i--)
{ P4OUT=CODE1[i]; //quay wave
__delay_cycles(625000); //
}}
P4OUT=0x00;//dừng
}
8/ Sửa lại đoạn chương trình trên để điều khiển motor sao cho thời gian trì
hoãn giữa các bước là 1s.
#include "msp430fg4618.h"
#include "intrinsics.h"
//------------------------
void main( void )
{ WDTCTL = WDTPW + WDTHOLD;
//bang ma dieu khien nua buoc
unsigned char CODE[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};
unsigned char i;
P4DIR=0xff;
while(1)
{
for(i=0;i<8;i++)
{ P4OUT=CODE[i]; //quay nua buoc
__delay_cycles(1000000);
} } }
9/ Sửa đoạn chương trình trên để motor quay thuận 4 bước, sau đó dừng 0.25s và rồi quay nghịch 4 bước
#include "msp430fg4618.h"
#include "intrinsics.h"
//------------------------
void main( void )
{ WDTCTL = WDTPW + WDTHOLD;
insigned char CODE[]={0x01,0x02,0x04, 0x08 };
unsigned char i;
P4DIR=0xff;
while(1)
{
//quay thuan 4 buoc
for(i=0;i<4;i++)
{ P4OUT=CODE[i]; //quay nua buoc
__delay_cycles(50000);
}
//dung 0.25 s
P4OUT= 0x00;
__delay_cycles(250000);
//quay nghich 4 buoc
for(i=4;i>0;i--)
{ P4OUT=CODE[i]; //quay nua buoc
__delay_cycles(50000);
} } }
10/ Viết chương trình điều khiển motor bước quay theo chiều thuận với số bước quay thuận được nhập từ bàn phím HEX.
#include "msp430fg4618.h"
#include "intrinsics.h"
void Dkmotor (unsigned char key)
{
unsigned char CODE[]={0x01,0x02,0x04,0x08};
unsigned char i,j=0;
for(i=key;i>0;i--) //quay so buoc bang gia tri cua key
{
if(j==4) //neu het chy ky thi
j=0; //nap lai giá tri 0x01
P4OUT=CODE[j];
__delay_cycles(500000);//delay 0.5s
j++;
}
P4OUT=0x00; //dung motor
}
void main( void )
{
WDTCTL = WDTPW + WDTHOLD;
unsigned char key;
P4DIR=0xFF; //motor buoc
P7DIR=0x0F; //phim hex
while(1)
{
// kiem tra cac phim o cot 1
P7OUT =0xfe;
if(!(P7IN & BIT4)) //phim 1
{key =1;
Dkmotor(key);}
else if(!(P7IN & BIT5)) //phim 4
{key=4;
Dkmotor(key);}
else if(!(P7IN & BIT6)) //phim 7
{key=7;
Dkmotor(key);}
else if(!(P7IN & BIT7)) //phim 10
{key=10;
Dkmotor(key);}
// kiem tra cac phim o cot 2
P7OUT = 0xfd;
if(!(P7IN & BIT4)) //phim 2
{key =2;
Dkmotor(key);}
else if(!(P7IN & BIT5)) //phim 5
{key=5;
Dkmotor(key);}
else if(!(P7IN & BIT6)) //phim 8
{key=8;
Dkmotor(key);}
else if(!(P7IN & BIT7)) //phim 0
{key=0;
Dkmotor(key);}
// kiem tra cac phim o cot 3
P7OUT =0xfb;
if(!(P7IN & BIT4)) //phim 3
{key =3;
Dkmotor(key);}
else if(!(P7IN & BIT5)) //phim 6
{key=6;
Dkmotor(key);}
else if(!(P7IN & BIT6)) //phim 9
{key=9;
Dkmotor(key);}
else if(!(P7IN & BIT7)) //phim 11
{key=11;
Dkmotor(key);}}}
11/ Viết chương trình điều khiển motor bước quay theo chiều thuận 4 bước, chiều ngược 4 bước rồi lặp lại với số lần lặp được nhập từ bàn phím số HEX.
#include "msp430fg4618.h"
#include "intrinsics.h"
void Dkmotor (unsigned char key)
{
unsigned char CODE[]={0x01,0x02,0x04,0x08};
unsigned char i,j=0;
for(i=key;i>0;i--) //quay so lan bang gia tri cua key
{
//quay thuan 4 buoc
for (j=0;j<4;j++)
{
P4OUT=CODE[j];
__delay_cycles(500000);//delay 0.5s
}
//quay nghich 4 buoc
for (j=4;j>0;j--)
{
P4OUT=CODE[j];
__delay_cycles(500000);//delay 0.5s
}
P4OUT=0x00; //dung motor
}
void main( void )
{
WDTCTL = WDTPW + WDTHOLD;
unsigned char key;
P4DIR=0xFF; //motor buoc
P7DIR=0x0F; //phim hex
while(1)
{
// kiem tra cac phim o cot 1
P7OUT =0xfe;
if(!(P7IN & BIT4)) //phim 1
{key =1;
Dkmotor(key);}
else if(!(P7IN & BIT5)) //phim 4
{key=4;
Dkmotor(key);}
else if(!(P7IN & BIT6)) //phim 7
{key=7;
Dkmotor(key);}
else if(!(P7IN & BIT7)) //phim 10
{key=10;
Dkmotor(key);}
// kiem tra cac phim o cot 2
P7OUT = 0xfd;
if(!(P7IN & BIT4)) //phim 2
{key =2;
Dkmotor(key);}
else if(!(P7IN & BIT5)) //phim 5
{key=5;
Dkmotor(key);}
else if(!(P7IN & BIT6)) //phim 8
{key=8;
Dkmotor(key);}
else if(!(P7IN & BIT7)) //phim 0
{key=0;
Dkmotor(key);}
// kiem tra cac phim o cot 3
P7OUT =0xfb;
if(!(P7IN & BIT4)) //phim 3
{key =3;
Dkmotor(key);}
else if(!(P7IN & BIT5)) //phim 6
{key=6;
Dkmotor(key);}
else if(!(P7IN & BIT6)) //phim 9
{key=9;
Dkmotor(key);}
else if(!(P7IN & BIT7)) //phim 11
{key=11;
Dkmotor(key);}}}
Bài 2: Chương trình điều khiển motor bước, với số bước nhập từ phím ma trận
2/ Sửa lại chương trình để motor có thể quay với số bước lớn hơn 11
#include "msp430f249.h"
#include "intrinsics.h"
//------------khai bao chuong trinh con------------------
void dkmoto (unsigned char key);
//---------------chuongtrinh chinh-----------------------
void main( void )
{
WDTCTL = WDTPW + WDTHOLD;
unsigned char key;
P1DIR=0xFF; //motor buoc
P5DIR=0x0F; //phim hex
while(1)
{
// kiem tra cac phim o cot 1
P5OUT =0xfe;
if(!(P5IN & BIT4)) //phim 1
{key =1;
goto dkmotor;}
else if(!(P5IN & BIT5)) //phim 4
{key=4;
goto dkmotor;}
else if(!(P5IN & BIT6)) //phim 7
{key=7;
goto dkmotor;}
else if(!(P5IN & BIT7)) //phim 10
{key=10;
goto dkmotor;}
// kiem tra cac phim o cot 2
P5OUT = 0xfd;
if(!(P5IN & BIT4)) //phim 2
{key =2;
goto dkmotor;}
else if(!(P5IN & BIT5)) //phim 5
{key=5;
goto dkmotor;}
else if(!(P5IN & BIT6)) //phim 8
{key=8;
goto dkmotor;}
else if(!(P5IN & BIT7)) //phim 0
{key=0;
goto dkmotor;}
// kiem tra cac phim o cot 3
P5OUT =0xfb;
if(!(P5IN & BIT4)) //phim 3
{key =3;
goto dkmotor;}
else if(!(P5IN & BIT5)) //phim 6
{key=6;
goto dkmotor;}
else if(!(P5IN & BIT6)) //phim 9
{key=9;
goto dkmotor;}
else if(!(P5IN & BIT7)) //phim 11
{key=11;
goto dkmotor;}
dkmotor:
switch (key)
{//neu key=x-->quay x buoc sau do gan key=0 de dung motor
case 0: break;//neu key=0, khong quay
case 1: {dkmoto(key); key=0; break;}
case 2: {dkmoto(key); key=0; break;}
case 3: {dkmoto(key); key=0; break;}
case 4: {dkmoto(key); key=0; break;}
case 5: {dkmoto(key); key=0; break;}
case 6: {dkmoto(key); key=0;break;}
case 7: {dkmoto(key); key=0;break;}
case 8: {dkmoto(key); key=0;break;}
case 9: {dkmoto(key); key=0;break;}
case 10: {dkmoto(key); key=0;break;}
case 11: {dkmoto(key); key=0;break;}
}
}
}
//-------------cai dat chuong trinh con------------
void dkmoto (unsigned char key)
{
unsigned char CODE[]={0x01,0x02,0x04,0x08};
unsigned char i,j=0;
for(i=key+10;i>0;i--) //quay so buoc bang gia tri cua key +10
{
if(j==4) //neu het chy ky thi
j=0; //nap lai giá tri 0x01
P1OUT=CODE[j];
__delay_cycles(500000);//delay 0.5s
j++;
}
P1OUT=0x00; //dung motor
}
3/ Sửa lại chương trình để motor quay với số bước tương ứng với số lần nhấn phím đơn.
SW1 quay thuận SW2 quay nghịch
#include "msp430fg4618.h"
#include "intrinsics.h"
#define SW1 BIT2
#define SW2 BIT3
unsigned char CODE[]={0x01,0x02,0x04,0x08};
unsigned char CODE1[]={0x08,0x04,0x02,0x01};
int i=0,j=0;
void main( void )
{
WDTCTL = WDTPW + WDTHOLD;
unsigned char key;
P4DIR=0x0f; //motor buoc
P3DIR=0x00; //phim don
while(1)
{
while(!(P3IN&SW1))//SW1 dc an
{ key+=1;
for(i=key;i>0;i--) //quay so buoc bang gia tri cua key
{
if(j==4) //neu het chy ky thi
j=0; //nap lai giá tri 0x01
P4OUT=CODE[j];
__delay_cycles(500000);//delay 0.5s
j++;}
}
P4OUT=0x00;
key=0; //reset lại số bước nếu ko có nó sẽ cộng dồn sau mỗi lần ấn
while(!(P3IN&SW2))//SW1 dc an
{ key+=1;
for(i=key;i>0;i--) //quay so buoc bang gia tri cua key
{
if(j==4) //neu het chy ky thi
j=0; //nap lai giá tri 0x01
P4OUT=CODE1[j];
__delay_cycles(500000);//delay 0.5s
j++;}
}
P4OUT=0x00;
key=0;
}}