TB6560驅動42步進電機例程
- #include "reg51.h"
- #include "stdio.h"
- #include < intrins.h >
- #include<math.h>
- #define uchar unsigned char
- #define uint unsigned int
- //************************管腳定義************************************/
- sbit A_key = P0^2;//前
- sbit B_key = P0^0;//右
- sbit C_key = P0^3;//左
- sbit D_key = P0^1;//后
- sbit en_left = P1^0;//左電機使能控制位
- sbit cw_left= P1^1;//左電機方向控制位
- sbit clk_left= P1^2;//左電機脈沖控制位
- sbit en_right = P1^3;//右電機使能控制位
- sbit cw_right= P1^4;//右電機方向控制位
- sbit clk_right= P1^5;//右電機脈沖控制位
- /////////////////////////函數聲明////////////////////////////////////////
- void timer1_init(); //定時器1初始化函數
- void move_left(uint speed_l,uchar cw,uchar en);//左電機運動函數
- void move_right(uint speed_r,uchar cw,uchar en);//右電機運動函數
- void clk(uint speed,uint step);
- void delay(uint speed);
- //////////////////變量定義////////////////////////////////////////////////
- uint n;//進定時器1中斷次數計數
- uint speed;//電機速度控制變量
- /**************函數體******************************************/
- /*******************************/
- void timer1_init()
- {
- TMOD=0X10;
- ET1=1;
- EA=1;
- TH1=(65536-100)/256;
- TL1=(65536-100)%256;
- TR1=1;//定時器啟動后 運動控制脈沖將一直產生 小車的運動方式受 cw 和en控制
- }
- void main (void)
- {
- delay(10);
- timer1_init();
- while(1)
- {
- if(A_key==1&&B_key==0&&C_key==0&&D_key==0)
- {
- EA=1;
- move_left(20,0,1);
- move_right(20,1,1);
-
- }
- else if(A_key==0&&B_key==1&&C_key==0&&D_key==0)
- {
- EA=1;
- move_left(20,0,1);
- move_right(20,0,1);
-
- }
- else if(A_key==0&&B_key==0&&C_key==1&&D_key==0)
- {
- EA=1;
- move_left(20,1,1);
- move_right(20,1,1);
-
- }
- else if(A_key==0&&B_key==0&&C_key==0&&D_key==1)
- {
- EA=1;
- move_left(20,1,1);
- move_right(20,0,1);
-
- }
- else
- {
- EA=0;
- }
-
- }
-
- }
- void delay(uint speed)
- {
- while(speed--)
- {
- ;
- }
- }
- void timer1_serve() interrupt 3
- {
- TH1=(65536-100)/256;
- TL1=(65536-100)%256;
- n=n+1;
- if(n==speed)
- {
- clk_left=~clk_left;
- clk_right=~clk_right;
- n=0;
- }
-
-
- }
- void move_right(uint speed_r,uchar cw,uchar en)
- { //speed_r速度控制變量 cw方向控制變量 en使能控制變量
- speed=speed_r; //speed數值與速度成反比 請結合實際情況進行調節,
- if(cw==1) //但速度不能無限加快因為步進電機有速度上限
- { //而且速度加快是力矩會下降,容易導致丟步現象
- cw_right=1; //所以實際應用當中應調節到速度可力矩比較合適的數值
- } //應考慮到電池電壓,輪胎直徑等因素
- else
- {
- cw_right=0; //cw 控制電機正反轉,1與0各代表一個方向
- }
- if(en==1)
- { //en 為使能位 1:能 0:不能
- en_right=1;
- }
- else
- {
- en_right=0;
- }
-
- }
- void move_left(uint speed_l,uchar cw,uchar en)
- { //speed_l速度控制變量 cw方向控制變量 en使能控制變量
- speed=speed_l;
- if(cw==1)
- {
- cw_left=1;
- }
- else
- {
- cw_left=0;
- }
- if(en==1)
- {
- en_left=1;
- }
- else
- {
- en_left=0;
- }
-
- }
復制代碼 |