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;
- }
-
- }
复制代码 |