步进电机是将电脉冲信号转变为角位移或线位移的开环控制元步进电机件。在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度,称为“步距角”,它的旋转是以固定的角度一步一步运行的。可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。 89C51的最小系统: 因为步进电机的控制是通过脉冲信号来控制的,将电脉冲信号转变为角位移或线位移的开环控制元件。所以怎样产生这个脉冲信号和产生怎样的信号是电机控制的关键。用单片机来产生这个脉冲信号,通过单片机的P1口输出脉冲信号。 TB6600原理图:
附录:程序实例
*********************************************** * 测试说明 *1、MCU:STC89C52RC *2、测试频率:12Mhz *2、编程语言:C51 *2、编译环境:Keil C *2、功能:全速正转、全速反转、停止、调速运行 *************************************************************** <reg52.h> //TB6560输入控制端定义 sbit CLK = P1^0; sbit ENA = P1^1; sbit DIR = P1^2; sbit CW = P3^0; //正转运行按键 sbit STOP = P3^1; //停止运行按键 sbit CCW = P3^2; //反转运行按键 sbit ADJ1 = P3^3; //调速运行按键 sbit ADJ2 = P3^4; //调速运行按键 bit Run_Status; //运行状态位标志, //=0表示电机在停止状态,可以按键正转、反转均可 //=1表示电机在运行状态,不支持正反转按键,只有先停止。防止强行换向 带来的电流过大。 unsigned char Run_Dir; //电机运行方向 #define F_DIR 0 //正转 #define B_DIR 1 //反转 unsigned int CYCLE; //周期变量 /************************************************************** ********************************** ** 函数名称: void Delay(unsigned int cnt) ** 功能描述: 简单的延时函数 ** 输 入: cnt:0-65535之间的任意整数 ** 输 出: 无 *************************************************************** **********************************/ void Delay(unsigned int cnt) { while(--cnt); } /************************************************************** ********************************** ** 函数名称: void main(void) ** 功能描述: 主函数 ** 输 入: 无 ** 输 出: 无 *************************************************************** **********************************/ void main(void) { Run_Status=0; //=0表示电机在停止状态,可以按键正转、反转均可 CLK = 0; ENA = 0; while(1) { if(!STOP) //任何时候按停止键,电机停止运行 { Delay(1000); //延时去抖动 if(!STOP) { Run_Status=0; //电机正在停止的状态标志 CLK = 0; ENA = 0; TR0=0; } } if(!CW&&!Run_Status) //按正转键同时电机不是正在运行时,电机正转运 行 { Delay(1000); //按下延时去抖动 if(!CW&&!Run_Status) { Run_Status=1; //电机正在运行的状态标志 DIR = 0; //正转 ENA = 1; CYCLE=2500; //脉冲频率 定时器设置 10ms in 12M crystal 即100Hz TMOD |=0x01; TH0=(65536-CYCLE)/256; TL0=(65536-CYCLE)%256; IE= 0x82; //打开中断 TR0=1; Run_Dir=F_DIR; //电机运行方向正转 } } if(!CCW&&!Run_Status) //按反转键同时电机不是正在运行时,电机反转 运行 { Delay(1000); //延时去抖动 if(!CCW&&!Run_Status) { Run_Status=1; //电机正在运行的状态标志 DIR = 1; //反转 ENA = 1; CYCLE=2500; //脉冲频率 定时器设置 10ms in 12M crystal 即100Hz TMOD |=0x01; TH0=(65536-CYCLE)/256; TL0=(65536-CYCLE)%256; IE= 0x82; //打开中断 TR0=1; Run_Dir=B_DIR; //电机运行方向反转 } } if(!ADJ1) { Delay(5000); //延时去抖动 if(!ADJ1) { if(CYCLE<20000) CYCLE+=2000; else CYCLE=1000; Run_Status=1; TR0=1; } } // if(!ADJ2) // { // Delay(5000); //延时去抖动 // if(!ADJ2) // { // if(CYCLE>2000) CYCLE-=2000; // Run_Status=1; // TR0=1; // } // } } } /************************************************************* ********************************** ** 函数名称: Timer0_ISR ** 功能描述: 定时器0中断处理函数 ** 输 入: 无 ** 输 出: 无 *************************************************************** **********************************/ void Timer0_ISR(void) interrupt 1 using 1 { TH0=(65536-CYCLE)/256; TL0=(65536-CYCLE)%256; CLK = ~CLK; }
有需要 LV8731 、 LV8728 、 LV8729 、 LV8727 、 LV8726 、STK682、 TB67S109 、TB6600 、TB6560 步进电机驱动器 芯片的 可以找我 、 技术 问题随时可以交流 联系电话:陈工 18010107259 15311412871 Q:2539844470
|