標(biāo)題:
STC12C5A60S2單片機(jī)+控制步進(jìn)電機(jī)和舵機(jī)實(shí)現(xiàn)物料搬運(yùn)程序
[打印本頁(yè)]
作者:
羅大韓
時(shí)間:
2021-4-15 16:15
標(biāo)題:
STC12C5A60S2單片機(jī)+控制步進(jìn)電機(jī)和舵機(jī)實(shí)現(xiàn)物料搬運(yùn)程序
#include <STC12C5A60S2.h>
/*
使用元件:42兩向步進(jìn)電機(jī) 1個(gè)
TB6600盒式步進(jìn)電機(jī)驅(qū)動(dòng)器 1個(gè)
SG90舵機(jī) 2個(gè)
限位開(kāi)關(guān) 1個(gè)
STC12C5A60S2最小系統(tǒng) 1個(gè)
42電機(jī)接線:無(wú)論從哪邊開(kāi)始數(shù),我們只接1 34 6這四個(gè)相位
TB6600接線:共陽(yáng)極接法,PUL-》P1^0 ENA-》P1^1 DIR-》P1^2
SG90接線:爪子》P1^3 上下舵機(jī)》P1^4
限位開(kāi)關(guān):
*/
/*調(diào)速等級(jí)表,5個(gè)檔位。1細(xì)分, 200脈沖一圈。 一個(gè)脈沖是1.8度。
計(jì)算:
4000,8ms一個(gè)脈沖(高電平4MS,低電平4MS,共是8MS)。 200個(gè)脈沖就是:1.6秒, 即1.6秒步進(jìn)電機(jī)走一圈。37.5圈/分
4000 起步會(huì)失步在1細(xì)分的情況下。
3000 6ms 1.2 50圈/分
2000, 4ms一個(gè)脈沖(高電平2MS,低電平2MS,共是4MS)。 200個(gè)脈沖就是:0.8秒, 即0.8秒步進(jìn)電機(jī)走一圈。75圈/分
1000,就是0.4秒/圈, 150圈/分。
500 0.2秒/圈, 300圈/分
250 0.1秒/圈 600圈/分。 500US一個(gè)脈沖。1S就是2000個(gè)脈沖,IO輸出就是2MHZ.在STC89C52的范圍內(nèi)。
再細(xì)分下去,超出C52的范圍。
我這步進(jìn)最佳最快有效是600轉(zhuǎn)/分。最快1000圈/分*/
//電機(jī)控制引腳
sbit CLK = P1^0; //PUL-
sbit ENA = P1^1; //ENA-
sbit DIR = P1^2; //DIR-
//限位控制端
sbit StopStart = P1^5; //限位開(kāi)關(guān)
sbit SG_PWM=P1^3;
sbit SG_PWM1=P1^4;
unsigned char USARTbuf[10]; //設(shè)置8位的unsigend char型寄存器用來(lái)暫存串口接收內(nèi)容
unsigned int counttemp=0; //暫存停止前的COUNT計(jì)數(shù)
unsigned int count=0,flag=0,flag1=0,flag2=0,flag3=0;
unsigned int SPEED=0;
bit Run_Status=1; //默認(rèn)是電機(jī)啟動(dòng)狀態(tài)
unsigned int Tspeed[5]={250,500,1000,2500,3000};
unsigned int setspeed=6,cespeed; // 2 4 6 10 12
unsigned char count1=0;
unsigned char PWM_count;//1--0度,2--45度,3--90度,4--135度,5--180度
unsigned char PWM_count1;
unsigned char a=0;
void delay(unsigned int n);
void bujin(int fanxiang,int bushu);
void Timer_Init()
{
TMOD&=0x0F; //把TMOD高4位清0
TMOD=0X21;//T0定時(shí)方式1
TH1=0xFD; //設(shè)置波特率為9600 22m為fa
TL1=0xFD; //設(shè)置波特率為9600
TR1=1;
SCON=0x50;
TH0=(65536-250)/256; //2500=2.5ms
TL0=(65536-250)%256;
ET0=1;//打開(kāi)定時(shí)器0的中斷
TR0=1;//打開(kāi)定時(shí)器0
EA=1;//開(kāi)總中斷
}
void Timer() interrupt 1//特別注意此處,0--外部中斷0,1--定時(shí)器中斷0,2--外部中斷1,3--定時(shí)器中斷1,4--串行口中斷1
{
TR0=0;
TH0=(65536-250)/256; //250=0.25ms
TL0=(65536-250)%256;
count1++;
if(count1>=40)
{
count1=0;
}
if(count1<=PWM_count*2){SG_PWM=1;}
else{SG_PWM=0;}
if(count1<=PWM_count1*2){SG_PWM1=1;}
else{SG_PWM1=0;}
count++;
if(count==setspeed){CLK=~CLK;count=0;cespeed++;} //發(fā)送脈沖……
if(RI==1) //如果接收標(biāo)志位為1,說(shuō)明有數(shù)據(jù)接收完畢
{
USARTbuf[0]=SBUF; //將發(fā)送區(qū)數(shù)據(jù)保存
if(USARTbuf[0]=='r'&&flag1==0){ENA=1;delay(200);flag1=1;}
if(USARTbuf[0]=='r'&&flag1==2){ENA=1;delay(200);flag1=3;}
if(USARTbuf[0]=='B'){flag3=1;ENA=1;DIR=0;} //ENA=1;DIR=0;delay(200);
if(USARTbuf[0]=='e'&&flag2==0){flag2=1;}
if(USARTbuf[0]==0x31&&flag2==1){setspeed=2;flag2=11;}
if(USARTbuf[0]==0x32&&flag2==1){setspeed=4;flag2=12;}
if(USARTbuf[0]==0x33&&flag2==1){setspeed=6;flag2=13;}
if(USARTbuf[0]==0x34&&flag2==1){setspeed=10;flag2=14;}
if(USARTbuf[0]==0x35&&flag2==1){setspeed=12;flag2=15;}
RI=0; //清除接收標(biāo)志位
}
TR0=1;
}
void main()
{
CLK=0;
ENA=0; //ENA-接的控制口,但一樣的,如果ENA=0,步進(jìn)電機(jī)卡起
DIR=0; //DIR-接的控制口。初始化電機(jī) 低電平有效,測(cè)試,DIR=1,是正轉(zhuǎn), DIR=0反轉(zhuǎn)。
Timer_Init();
PWM_count=3;
PWM_count1=3;
while(1)
{
if(StopStart==0&&flag1==1)//A到B
{
flag1=0;
delay(10);
if(StopStart==0)
{
while(1)
{
if(setspeed==2)bujin(1,100);
else if(setspeed==4)bujin(1,50);
else if(setspeed==6)bujin(1,50);
else if(setspeed==10)bujin(1,100);
else if(setspeed==12)bujin(1,100);
if(flag3==1)break; //到達(dá)指定A點(diǎn)行程時(shí)間 1000步 b13000步
ENA=0; //步進(jìn)電機(jī)停止
PWM_count1=1;delay(300);if(flag3==1)break; //到達(dá)A點(diǎn)下降
PWM_count=1;delay(300);if(flag3==1)break; //到達(dá)A點(diǎn)抓取
PWM_count1=3; //舵機(jī)2抬起
ENA=1;
if(setspeed==2)bujin(1,1080);
else if(setspeed==4)bujin(1,1150);
else if(setspeed==6)bujin(1,1200);
else if(setspeed==10)bujin(1,1150);
else if(setspeed==12)bujin(1,1150);
ENA=0; if(flag3==1)break; //到達(dá)B點(diǎn)
PWM_count1=1;delay(300);if(flag3==1)break;PWM_count=3;delay(300);if(flag3==1)break;
ENA=1; DIR=~DIR; //回原點(diǎn)
while(1){if(StopStart==0){ENA=0;TI=0;SBUF='B';while(!TI);TI=0;SBUF='a';while(!TI);TI=0;SBUF='c';while(!TI);TI=0;SBUF='k';while(!TI);TI=0;SBUF='O';while(!TI);TI=0;SBUF='K';while(!TI);break;}}
break; //結(jié)束行程
}
}
}
if(StopStart==0&&flag3==1)//B到A
{
flag3=0;
ENA=0;
PWM_count=3;
TI=0;SBUF='B';while(!TI);TI=0;SBUF='a';while(!TI);TI=0;SBUF='c';while(!TI);TI=0;SBUF='k';while(!TI);TI=0;SBUF='O';while(!TI);TI=0;SBUF='P';while(!TI);TI=0;SBUF=':';while(!TI);TI=0;SBUF='O';while(!TI);TI=0;SBUF='K';while(!TI);
}
if(flag2==11){flag2=0;TI=0;SBUF='S';while(!TI);TI=0;SBUF='e';while(!TI);TI=0;SBUF='t';while(!TI);TI=0;SBUF=' ';while(!TI);TI=0;SBUF='S';while(!TI);TI=0;SBUF='P';while(!TI);TI=0;SBUF='1';while(!TI);TI=0;SBUF='O';while(!TI);TI=0;SBUF='K';while(!TI);}
else if(flag2==12){flag2=0;TI=0;SBUF='S';while(!TI);TI=0;SBUF='e';while(!TI);TI=0;SBUF='t';while(!TI);TI=0;SBUF=' ';while(!TI);TI=0;SBUF='S';while(!TI);TI=0;SBUF='P';while(!TI);TI=0;SBUF='2';while(!TI);TI=0;SBUF='O';while(!TI);TI=0;SBUF='K';while(!TI);}
else if(flag2==13){flag2=0;TI=0;SBUF='S';while(!TI);TI=0;SBUF='e';while(!TI);TI=0;SBUF='t';while(!TI);TI=0;SBUF=' ';while(!TI);TI=0;SBUF='S';while(!TI);TI=0;SBUF='P';while(!TI);TI=0;SBUF='3';while(!TI);TI=0;SBUF='O';while(!TI);TI=0;SBUF='K';while(!TI);}
else if(flag2==14){flag2=0;TI=0;SBUF='S';while(!TI);TI=0;SBUF='e';while(!TI);TI=0;SBUF='t';while(!TI);TI=0;SBUF=' ';while(!TI);TI=0;SBUF='S';while(!TI);TI=0;SBUF='P';while(!TI);TI=0;SBUF='4';while(!TI);TI=0;SBUF='O';while(!TI);TI=0;SBUF='K';while(!TI);}
else if(flag2==15){flag2=0;TI=0;SBUF='S';while(!TI);TI=0;SBUF='e';while(!TI);TI=0;SBUF='t';while(!TI);TI=0;SBUF=' ';while(!TI);TI=0;SBUF='S';while(!TI);TI=0;SBUF='P';while(!TI);TI=0;SBUF='5';while(!TI);TI=0;SBUF='O';while(!TI);TI=0;SBUF='K';while(!TI);}
}
}
void delay(unsigned int n) //delay幾個(gè)毫秒,入口參數(shù)為幾個(gè)毫秒 //正反轉(zhuǎn)切換時(shí)速度太快了。延時(shí)保護(hù)電機(jī)
{
unsigned int i,y;
for(i=n;i>0;i--)
{
for(y=1140;y>0;y--){if(flag3==1)break;}
if(flag3==1)break;
}
}
void bujin(int fanxiang,int bushu)
{
ENA=1;
DIR=fanxiang;
cespeed=0;
while(1)
{
if(bushu==cespeed){break;}
if(flag3==1)break;
}
ENA=0;
if(flag3==1)ENA=1;
}
作者:
birdzhyli
時(shí)間:
2021-4-28 20:55
很有性格的程序,真想看看學(xué)習(xí)一下了,后面實(shí)在是看不下去了。
還困惑在于,用定時(shí)器0初值裝給定時(shí)器1,暈了
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1