tb6600驱动器_步进电机接tb6600步进电机专用驱动器 - CSDN
精华内容
参与话题
  • 一、硬件 1.硬件准备:57步进电机和驱动器 2.连线 驱动器右边分有两个区域 ... PUL接口:步进电机驱动器把控制器发出的脉冲信号转化为步进电机的角位移,驱动器每接受一个脉冲信号 PUL,就驱动步进.

    一、硬件

    1.硬件准备:57步进电机(型号57CM18),驱动器TB6600,开发板STM32F407ZGT6

     2.连线

    驱动器右边分有两个区域

    Signal:用于驱动器与开发板连接,进行电机的控制驱动。

    • ENA接口:当此信号有效时,驱动器将自动切断电机绕组电流,使电机处于自由状态(无保持转矩)。当此信号不连接时默认为无效状态,这时电机绕组通以电流,可正常工作。
    • DIR接口:控制电机旋转方向,信号有效时电机顺时针旋转,无效时逆时针旋转。
    • PUL接口:步进电机驱动器把控制器发出的脉冲信号转化为步进电机的角位移,驱动器每接受一个脉冲信号 PUL,就驱动步进电机旋转一个步距角,PUL 的频率和步进电机的转速成正比。对于最佳输入要求,此信号占空比最好 1:1,脉冲信号的频率不大于100KHz

    连接方式有两种方法:

    (1)共阳极连接

    将驱动器的ENA+,DIR+,PUL+接地, 阴极接电,也就是开发板的相对应的控制管脚。

    (2)共阴极连接

    如STM32F407接线如下:

    ENA+(驱动器)  PE6(开发板)
    DIR+(驱动器)  PE5(开发板)
    PUL+(驱动器)  PC7(开发板)
    ENA- DIR- PUL-(驱动器) GND(开发板)
     
    3. High Voltage区域
     
    该区域用于驱动器与步进电机连接。
    和下图类似:
     

     

    电机接法: 

     

    这里我采用的是驱动器接法是共阴极接法 

    对于电源,开发板使用3.3v,电机使用12v,1A,可根据实际情况调整。 

    4.细分

    根据需求,该驱动器最多支持32细分,根据指示的S1,S2,S3开关状态调整驱动器侧面的dip拨码进行细分选择,同样可以通过S4,S5,S6三个开关控制电流大小,最大支持3.5A,峰值电流为4.0A。

    我这里采用了4细分。具体如下图:

    5.故障问题

    PWR:绿灯,电源指示灯。
    ALARM:红灯,故障(过流、过热和欠压)时亮。红灯亮起时,表明驱动器出故障了,
    请立即切断驱动器电源,排除故障后再继续操作。
     

    二、代码

     主要用到了四个函数

    void Driver_Init(void);//驱动器初始化

    void TIM8_OPM_RCR_Init(u16 arr, u16 psc);//TIM8_CH2 初始化 单脉冲+重复计数模式
     
    void Locate_Rle(long num, u32 frequency, DIR_Type dir) //相对定位函数
     
    void Locate_Abs(long num, u32 frequency);/绝对定位函数
     
    1.驱动初始化
     
    由于ENA和DIR使用的引脚为PE6,PE5,因此在初始化中对它们进行相关的初始化即可。
     
    整体流程:
    定义GPIO结构体
    使能GPIOE时钟
    对结构体进行相关初始化,推挽输出,上拉等
    设置PE5,输出为高电平沿顺时针方向
    设置PE6,输出为低电平,使能输出
     
     
    void Driver_Init(void)
    {
    	GPIO_InitTypeDef  GPIO_InitStructure;
    
    	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
     
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6;
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    	GPIO_Init(GPIOE, &GPIO_InitStructure);
    	
    	GPIO_SetBits(GPIOE,GPIO_Pin_5);
    	GPIO_ResetBits(GPIOE,GPIO_Pin_6);
    }

    2.定时器

    定时器的时基单元主要有三个寄存器组成:16位计数器,自动重转载寄存器(包括一个影子寄存器),预分频器(控制计数器时钟),其中预分频计数器的时钟频率1——65535。

    16位向上、向下、向上/向下自动装载计数器
    ● 16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65536之间的任意
    数值
    ● 4个独立通道:
    ─ 输入捕获
    ─ 输出比较
    ─ PWM生成(边缘或中间对齐模式)
    ─ 单脉冲模式输出
    ● 使用外部信号控制定时器和定时器互连的同步电路
    ● 如下事件发生时产生中断/DMA: ─ 更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
    ─ 触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)
    ─ 输入捕获
    ─ 输出比较
    ● 支持针对定位的增量(正交)编码器和霍尔传感器电路
    ● 触发输入作为外部时钟或者按周期的电流管理

     

    因为用到TIME8与GPIOC(进行端口复用),所以使能对应的时钟。将GPIOC的Pin7复用为TIME8,对TIME8的结构体进行变量初始化,查开发手册可以知道,PC7复用功能为TIME8的CH2。

    整体流程 

    • 配置TIME8,GPIOC时钟。
    • 初始化TIM8,设置ARR(自动装填值即周期),PSC(时钟预分频系数)
    • 设置TIM8_CH2的PWM模式,使能TIM2_CH2输出

     

     使能TIM2

    /***********************************************
    //TIM8_CH2(PC7) 单脉冲输出+重复计数功能初始化
    //TIM8 时钟频率 84*2=168MHz
    //arr:自动重装值
    //psc:时钟预分频数
    ************************************************/
    void TIM8_OPM_RCR_Init(u16 arr,u16 psc)
    {		 					 
    	GPIO_InitTypeDef GPIO_InitStructure;
    	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    	TIM_OCInitTypeDef  TIM_OCInitStructure;
    	NVIC_InitTypeDef NVIC_InitStructure;
    
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8,ENABLE);  	//TIM8时钟使能    
    	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE); 	//使能PORTC时钟	                                                                     	
    
    	GPIO_PinAFConfig(GPIOC,GPIO_PinSource7,GPIO_AF_TIM8); //GPIOC7复用为定时器8
    	
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;           //GPIOC7
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;        //复用功能
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;	//速度100MHz
    	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;      //推挽复用输出
    	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;      //下拉
    	GPIO_Init(GPIOC,&GPIO_InitStructure);               //初始化PF9
    	
    	TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
    	
    	TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值	 
    	TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值   
    	TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
    	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
    	TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
    	TIM_ClearITPendingBit(TIM8,TIM_IT_Update);
    
    	TIM_UpdateRequestConfig(TIM8,TIM_UpdateSource_Regular); /********* 设置只有计数溢出作为更新中断 ********/
    	TIM_SelectOnePulseMode(TIM8,TIM_OPMode_Single);/******* 单脉冲模式 **********/
     
    	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
    	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出2使能
    	TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable; /****** 比较输出2N失能 *******/
    	TIM_OCInitStructure.TIM_Pulse = arr>>1; //设置待装入捕获比较寄存器的脉冲值,右移一位
    	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
    	TIM_OC2Init(TIM8, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
    
    	TIM_OC2PreloadConfig(TIM8, TIM_OCPreload_Enable);  //CH2预装载使能	 
    	TIM_ARRPreloadConfig(TIM8, ENABLE); //使能TIMx在ARR上的预装载寄存器
    	
    	TIM_ITConfig(TIM8, TIM_IT_Update ,ENABLE);  //TIM8   使能或者失能指定的TIM中断
     
    	NVIC_InitStructure.NVIC_IRQChannel = TIM8_UP_TIM13_IRQn;  //TIM8中断
    	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;  //先占优先级1级
    	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;  //从优先级1级
    	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
    	NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
    	
    	TIM_ClearITPendingBit(TIM8, TIM_IT_Update);  //清除TIMx的中断待处理位:TIM 中断源
    	TIM_Cmd(TIM8, ENABLE);  //使能TIM8											  
    }

    3.中断服务函数

    void TIM8_UP_TIM13_IRQHandler(void)
    {
    	if(TIM_GetITStatus(TIM8,TIM_FLAG_Update)!=RESET)//更新中断
    	{
    		TIM_ClearITPendingBit(TIM8,TIM_FLAG_Update);//清除更新中断标志位		
    		if(is_rcr_finish==0)//重复计数器未设置完成
    		{
    			if(rcr_integer!=0) //整数部分脉冲还未发送完成
    			{
    				TIM8->RCR=RCR_VAL;//设置重复计数值
    				rcr_integer--;//减少RCR_VAL+1个脉冲				
    			}else if(rcr_remainder!=0)//余数部分脉冲 不为0
    			{
    				TIM8->RCR=rcr_remainder-1;//设置余数部分
    				rcr_remainder=0;//清零
    				is_rcr_finish=1;//重复计数器设置完成				
    			}else goto out;   //rcr_remainder=0,直接退出			 
    			TIM_GenerateEvent(TIM8,TIM_EventSource_Update);//产生一个更新事件 重新初始化计数器
    			TIM_CtrlPWMOutputs(TIM8,ENABLE);	//MOE 主输出使能	
    			TIM_Cmd(TIM8, ENABLE);  //使能TIM8			
    			if(motor_dir==CW) //如果方向为顺时针   
    				current_pos+=(TIM8->RCR+1);//加上重复计数值
    			else          //否则方向为逆时针
    				current_pos-=(TIM8->RCR+1);//减去重复计数值			
    		}else
    		{
    out:		is_rcr_finish=1;//重复计数器设置完成
    			TIM_CtrlPWMOutputs(TIM8,DISABLE);	//MOE 主输出关闭
    			TIM_Cmd(TIM8, DISABLE);  //关闭TIM8				
    			printf("当前位置=%ld\r\n",current_pos);//打印输出
    		}	
    	}
    }

    4.相对定位函数

    首先判断脉冲如果小于0就停止运行。频率的取值在20-100000Hz之间,如果不在这个范围内就终止。

    通过传入的参数dir可以知道旋转方向,若为顺时针,就用当前位置加上一个脉冲对应的步距,如果是逆时针就减去。

    最后获取重复计数器的整数和余数部分,开启TIM8

    /********************************************
    //相对定位函数 
    //num 0~2147483647
    //frequency: 20Hz~100KHz
    //dir: CW(顺时针方向)  CCW(逆时针方向)
    *********************************************/
    void Locate_Rle(long num,u32 frequency,DIR_Type dir) //相对定位函数
    {
    	if(num<=0) //数值小等于0 则直接返回
    	{
    		printf("\r\nThe num should be greater than zero!!\r\n");
    		return;
    	}
    	if(TIM8->CR1&0x01)//上一次脉冲还未发送完成  直接返回
    	{
    		printf("\r\nThe last time pulses is not send finished,wait please!\r\n");
    		return;
    	}
    	if((frequency<20)||(frequency>100000))//脉冲频率不在范围内 直接返回
    	{
    		printf("\r\nThe frequency is out of range! please reset it!!(range:20Hz~100KHz)\r\n");
    		return;
    	}
    	motor_dir=dir;//得到方向	
    	DRIVER_DIR=motor_dir;//设置方向
    	
    	if(motor_dir==CW)//顺时针
    		target_pos=current_pos+num;//目标位置
    	else if(motor_dir==CCW)//逆时针
    		target_pos=current_pos-num;//目标位置
    	
    	rcr_integer=num/(RCR_VAL+1);//重复计数整数部分
    	rcr_remainder=num%(RCR_VAL+1);//重复计数余数部分
    	is_rcr_finish=0;//重复计数器设置完成
    	TIM8_Startup(frequency);//开启TIM8
    }

    5.绝对定位函数

    绝对定位函数很简单,也就是说给定一个位置,固定的让电机转到这个位置即可。

    当给定目标位置与当前位置不同时,先判断旋转方向然后复制给DIR,因为不确定给的位置是正值还是负值,所以最后求重复计数器的时候加了一个abs绝对值。

    /********************************************
    //绝对定位函数 
    //num   -2147483648~2147483647
    //frequency: 20Hz~100KHz
    *********************************************/
    void Locate_Abs(long num,u32 frequency)//绝对定位函数
    {
    	if(TIM8->CR1&0x01)//上一次脉冲还未发送完成 直接返回
    	{
    		printf("\r\nThe last time pulses is not send finished,wait please!\r\n");
    		return;
    	}
    	if((frequency<20)||(frequency>100000))//脉冲频率不在范围内 直接返回
    	{
    		printf("\r\nThe frequency is out of range! please reset it!!(range:20Hz~100KHz)\r\n");
    		return;
    	}
    	target_pos=num;//设置目标位置
    	if(target_pos!=current_pos)//目标和当前位置不同
    	{
    		if(target_pos>current_pos)
    			motor_dir=CW;//顺时针
    		else
    			motor_dir=CCW;//逆时针
    		DRIVER_DIR=motor_dir;//设置方向
    		
    		rcr_integer=abs(target_pos-current_pos)/(RCR_VAL+1);//重复计数整数部分
    		rcr_remainder=abs(target_pos-current_pos)%(RCR_VAL+1);//重复计数余数部分
    		is_rcr_finish=0;//重复计数器未设置完成
    		TIM8_Startup(frequency);//开启TIM8
    	}
    }

    6.main函数

    主函数也很简单,先进行相关初始化,通过按键操控电机,按下wkup就通过绝对定位函数回到零点,按下key0就以500hz的频率顺时针发送200脉冲,假如不设置细分,该操作就是顺时针旋转一圈,key1也是一样,逆时针发送500脉冲。这里设置了一个计数器i,工作了50次后led会有一个提示。

    int main(void)
    { 
    	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
    	delay_init(168);      //初始化延时函数
    	uart_init(115200);		//初始化串口波特率为115200
    	usmart_dev.init(84); 	//初始化USMART			
    	Driver_Init();			//驱动器初始化
    	TIM8_OPM_RCR_Init(999,168-1); //1MHz计数频率  单脉冲+重复计数模式  
    	while(1) 
    	{		 	  
    	Locate_Rle(800,400,CW);
    	delay_ms(10);
    	Locate_Rle(800,400,CCW);
    	delay_ms(10);	
    	}
    }
    

    7.结果

    最终运行程序,电机就会转动起来,同时驱动器下面的led灯会闪烁蓝色的灯光,通过脉冲加频率可以调整速度,也可以通过细分设定去调节。

     

     

    需要用到驱动可以下载我打包的驱动包,将其放置在HARDWARE目录下,使用时调用driver.h文件即可,在使用时,根据具体电路图或者开发手册,调整驱动器对应的引脚号,电平,定时器,通道等初始化设置即可。

     

    驱动源码包下载地址:https://download.csdn.net/download/qq_41573860/12605360

    完整项目(步进电机驱动+限位传感器)下载地址:https://download.csdn.net/download/qq_41573860/12657848

    42,57双电机+4传感器项目下载地址:

    csdn:https://download.csdn.net/download/qq_41573860/12679168

    github:https://github.com/boxbaba/STM32F407_Motor

    展开全文
  • TB6600升级版驱动器

    2020-07-30 23:31:58
    TB6600电机驱动器和升级版的使用资料,资料详细,带有芯片说明书
  • 51单片机控制TB6600驱动器驱动42步进电机

    万次阅读 多人点赞 2020-08-15 10:45:44
    51单片机控制TB6600驱动器驱动42步进电机功能实现目标硬件简介硬件连接程序代码功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个...

    51单片机控制TB6600驱动器驱动42步进电机

    第一次

    以前总是看别人写的博客,通过别人的博客解决了我很多问题,从中也学到了各种知识,虽然不是很系统,但也比较有针对性。所以本次我将我这两天做的东西写成了博客,毕竟水平有限还需学习,所以此文仅供参考,但倘若能帮助到别人解决某些问题,明白某些知识那我将甚感欣慰。
    这是我第一次写博客,难免有很多不足之处,如有意见敬请发表评论 甚是感谢!

    功能实现目标

    1. 控制电机停止与启动。
    2. 控制电机正反转。
    3. 控制电机旋转速度。
    4. 能按一定角度进行步进。

    硬件简介

    本次采用的就是最最最简单的51单片机(不要问我后面程序为什么是reg52.h,问一次打一次)没有外接任何外围器件(除了按键)。只是单纯的控制I/O口,关于单片机的硬件结构就不讲了(其实我也不懂,只会控制下I/O口)。
    TB6600驱动器怎么说呢,我觉的它最大的优势就是性价比吧,几十块钱就可以买一个,而且也能实现要求不是很高的实验,对于学生党来说再合适不过了。输出电流和细分都可以通过拨片按需选择,最高细分可达1/32。电源:要求9-42V直流开关电源。电流的话自己看你的电机功率选择就行。
    -------------此处省略一万字-------------其他的我就不讲了自行百度下使用手册就行了,相信读懂这种简单的使用手册就不在话下了。

    硬件连接

    ----先说说驱动器和电机的连接----
    上图为TB6600说明书给出的接线图
    我此次选用的是两相四线的步进电机,把它的4根线按照电机给的说明书分别接到驱动的的A+,A-,B+,B-即可,驱动器的电源接线就不用说了吧!
    接下来重点来了,因为控制器与驱动器有两种接法,如下图
    TB6600说明书上的共阳接法
    TB6600说明书上的共阴接法
    虽然我们可以每一种都试一下也不耽误时间,但我还是要在这里讲解下为什么我选择了共阳而不选共阴。看过TB6600驱动器说明书的童靴,应该知道它与控制器(就是本文的单片机)的连接有两种方式,即共阴或者共阳,此刻有没有想到数码管的共阴共阳哈哈。其实都是一样的概念。我一看说明书毫不犹豫的就按照共阴的接法接好电路,结果一试,电机它丝毫不动。后来我看了下驱动器的接口是光驱动的,而选择共阴接法的话,就意味着我们得靠单片机I/0口的电流来驱动里面的发光二极管,我们都知道单片机I/o口的驱动能力非常小,查看手册可知I/O口的拉电流只有几uA根本不足以驱动发光二极管,的而它的灌电流可达15mA,此时足以驱动发光二极管,这就是为什么要选择共阳接法。

    程序代码

    // An highlighted block
    /*******************程序功能*********************
       1.控制电机停止与启动
       2.控制电机正反转
       3.控制电机转速
       3.控制电机按一定角度步进
    ************************************************/
    #include<reg52.h>
    //电机控制引脚
    sbit CLK  = P1^0;
    sbit ENA  = P1^1; 
    sbit DIR  = P1^2;		   
    //按键控制端
    sbit P_TS  = P2^0;	       //正转控制端
    sbit N_TS  = P2^1;		   //反转控制端
    sbit P_ADJ = P2^2;         //调速+
    sbit N_ADJ = P2^3;         //调速-
    sbit StopStart  = P2^4;	   //停止与启动
    sbit P_Step = P2^5;
    sbit N_Step = P2^6;
    sbit SS_Step = P2^7;
    
    unsigned int Tspeed[3]={20,4000,10000};	       //调速等级表
    unsigned int StepAngle[4]={100,200,400,800};   //步进角度表--90度/180度/360度/720度
    bit Run_Status=0;
    bit CY_status=0;
    unsigned int CYCLE=20;
    unsigned int cy_count=0;
    unsigned PWM_count=0;
    
    void Init_time();
    void Key_scan();
    void Step(unsigned int step_count);
    /*void delay()				  //延时函数
    {
    	unsigned int i = 200;
    	while (i--);
    } */
    void main()
    {
    	ENA=1;
    	CLK=0;
    	DIR=0;		   //初始化电机
    	Init_time();   //初始化定时器	   
    	while(1)
    	{
    		Key_scan();
    	}	
    }
    void Init_time()				 //初始化定时器
    {
    	TMOD |= 0x01;
    	TH0=(65536-CYCLE)/256; 		 //给time0装初值
    	TL0=(65536-CYCLE)%256;
    	//TH1=(65536-2000)/256;		 //给time1装初值
    	//TL1=(65536-2000)%256;
        IE = 0x82;
    	//PT1=1;                       //使得time1的优先级高于time0
    	TR0=1;				         //打开两个中断
    	//TR1=1;
    }
    void Enter_Timer0() interrupt 1				//进入定时器中断
    {
    	TH0=(65536-CYCLE)/256; 
    	TL0=(65536-CYCLE)%256;
    	CLK=~CLK;
    	PWM_count++;
    	if(PWM_count==(2*cy_count)&&CY_status)
    	{
    		PWM_count=0;
    		TR0=0;
    		ENA=0;
    	}	
    }
    /*void Enter_timer1() interrupt 3
    {
    	TH1=(65536-2000)/256;		 //给time1装初值
    	TL1=(65536-2000)%256;
    	Key_scan();
    } */
    
    /************************按键扫描程序************************
       功能:读取各按键值,判断是否按下,再处理相应事件
       
       注:按键控制程序,由于按键中断优先级高,且每个按键都设计
           为弹起有效, 所以长时间按住不放会导致电机减速甚至停
    	   止直至放开按键		      
    *************************************************************/
    void Key_scan()				   	   
    {
    	static char i=0,j=0;
    	if(P_TS==0)					   //正反转切换
    	{
    		//delay();				   //按键消抖
    		if(P_TS==0)
    		{
    			while(!P_CW);			   //按键按下直到放开
    			DIR=1;
    		}
    	}
    	if(N_TS==0)					   //正反转切换
    	{
    		//delay();				   //按键消抖
    		if(N_TS==0)
    		{
    			while(!N_CW);			   //按键按下直到放开
    			DIR=0;
    		}
    	}
    	if(P_ADJ==0)				   //加速
    	{
    		//delay();			
    		if(P_ADJ==0)
    	    {
    			while(!P_ADJ);
    			i--;
    			if(i<1)
    			i=0;
    			CYCLE=Tspeed[i];		
    		}
    	}
    	if(N_ADJ==0)				   //减速
    	{
    		//delay();
    		if(N_ADJ==0)
    		{
    			while(!N_ADJ);
    			i++;
    			if(i>2)
    			i=2;
    			CYCLE=Tspeed[i];
    		}
    	}
    	if(StopStart==0)
    	{
    		//delay();
    		if(StopStart==0)
    		{
    			while(!StopStart);
    			Run_Status=~Run_Status;
    			if(Run_Status)
    			{
    				ENA=1;		  //启动电机
    				TR0=1;		  //开启中断产生脉冲信号
    			}
    			else
    			{
    				ENA=0;		  //关闭电机
    				TR0=0;		  //关闭中断停止脉冲信号
    				CY_status=0;  //刷新步进标志位
    			}
    		}
    	}
    	if(P_Step==0)
    	{
    		//delay();
    		if(P_Step==0)		  //步进角度+
    		{
    			while(!P_Step);
    			j++;
    			if(j>3)
    			j=3;
    			Step(StepAngle[j]);			
    		}
    	}
    	if(N_Step==0)			  //步进角度-
    	{
    	//	delay();
    		if(N_Step==0)
    		{
    			while(!N_Step);
    			j--;
    			if(j<1)
    			j=0;
    			Step(StepAngle[j]);			
    		}
    	}
    	if(SS_Step==0)   //按一定步进角度步进,每按下一次转动一定步进角后停止
    	{
    		//delay();
    		if(SS_Step==0)
    		{
    			while(!SS_Step);
    			Step(StepAngle[j]);
    		}
    	}
    }
    /***********************角度控制函数*************************/
    void Step(unsigned int step_count)
    {
    	PWM_count=0;
    	CY_status=1;
    	cy_count=step_count;
    	ENA=1;
    	TR0=1;
    }
    
    展开全文
  • TB6600驱动器调试42电机(stm32)

    千次阅读 2020-06-30 10:25:27
    TB6600驱动器调试42电机 耗材 1 TB6600驱动器 2 sl42sth34-1504a电机 3 J-LINK 4.24v电池 接线 一般是使用共阳极接法。其中ENA+,DIR+,PUL+连接STM32板子的5v电源,ENA-,DIR-,PUL-连接板子的相应控制线(我这里...

    TB6600驱动器调试42电机

    耗材

    1 TB6600驱动器
    2 sl42sth34-1504a电机
    3 J-LINK
    4.24v电池

    接线

    在这里插入图片描述

    1. 一般是使用共阳极接法。其中ENA+,DIR+,PUL+连接STM32板子的5v电源,ENA-,DIR-,PUL-连接板子的相应控制线(我这里用a6a4a2控制)。
    2. A+A-B+B-连接电机的4根线,我这里是2相(A.B相)4线42电机。注意不要串相!!!电机线任选2根用电压表测试,导通的是同相。
    3. 驱动VCC使用9—42v供电,这里使用24v电池。

    拨码开关

    TB6600上有拨码开关,对应驱动器上面印刷的表格使用,S1-3配置细分,S4-6配置给电机的电流。(42电机输入电流为1.5A,对应s4on s5on s6off,S1-3我是使用的是16细分,s1off s2off s3on)

    代码

    #define ENA GPIO_Pin_6 
    #define DIR GPIO_Pin_4 
    #define PUL GPIO_Pin_2 
    /*
    	42电机步距角为1.8°/脉冲    16细分
    	360/1.8*16=3200  个脉冲电机转一圈
    	一个脉冲周期设为1ms 
    	则3.2s转1圈
    */
    int main()
    {
    		Systick_Init(72);//设置系统时钟
    		start();3个控制引脚初始化 a4,a4,a2
    		PAout(6)=1;//EN 高电平
    		PAout(4)=0;//DIR 正传 低电平
        while(1)
        {
    			PAout(2)=1;
    			delay_us(500);//1ms 周期
    			PAout(2)=0;
    			delay_us(500);	
        }
    }
    

    接线图

    在这里插入图片描述在这里插入图片描述

    展开全文
  • TB6600升级版步进电机驱动器说明的PDF文档。步进电机驱动器说明书
  • 在本教程中,您将学习如何使用TB6600微步进驱动器和Arduino控制步进电机。该驱动器易于使用,可以控制大型步进电机,例如3 A NEMA 23。 我提供了接线图和3个示例代码。 在第一个示例中,我将向您展示如何在没有...

    在本教程中,您将学习如何使用TB6600微步进驱动器和Arduino控制步进电机。该驱动器易于使用,可以控制大型步进电机,例如3 A NEMA 23。

    我提供了接线图和3个示例代码。 在第一个示例中,我将向您展示如何在没有Arduino库的情况下使用此步进电机驱动器。 该示例可用于使电动机连续旋转。 在第二个示例中,我们将研究如何控制步进电机的速度,转数和旋转方向。 最后,我们将看一下加速库。 该库非常易于使用,并允许您在步进电机的运动中添加加速和减速。

    在每个示例之后,我都会分解并解释代码的工作原理,因此您可以毫无问题地修改代码以适合您的需求。

    硬件

    工具

    软件

    驱动器

    TB6600微步进驱动器围绕东芝TB6600HG IC构建,可用于驱动两相双极步进电机。

    TB6600驱动器的最大连续电流为3.5 A,可用于控制相当大的步进电机,例如NEMA23。请确保不要将额定电流超过3.5 A的步进电机连接到驱动器。

    该驱动器具有多种内置的安全功能,例如过流,欠压停机和过热保护。

    您可以在下表中找到更多规格。请注意,确切的规格和尺寸在制造商之间可能会略有不同。连接电源之前,请务必先查看特定驱动器的数据表。

    TB6600规格

    Operating voltage 9 – 42 V

    Max output current 4.5 A per phase, 5.0 A peak1

    Microstep resolution full, 1/2, 1/4, 1/8 and 1/162

    Protection Low-voltage shutdown, overheating and over-current protection

    Dimensions 96 x 72 x 28/36 mm

    Hole spacing 88, ⌀ 5 mm

    伪造或“升级”的TB6600驱动程序

    最近,我拆解了订购的TB6600驱动程序之一,发现它实际上并未使用TB6600HG芯片。 取而代之的是,它使用的是东芝制造的体积更小的TB67S109AFTG芯片。 这些芯片的性能和规格相似,但是TB6600HG确实具有更高的峰值电流额定值(高达5 A),并且它只是更大的芯片,整体上具有更好的散热性能。

    有一种非常简单的方法来检查您的驱动程序是否使用TB6600HG芯片或TB67S109AFTG芯片,TB6600HG仅支持多达1/16微步(请参见数据表),而TB67S109AFTG则高达1/32。 制造商转而使用其他芯片的主要原因可能是价格。

    备择方案

    请注意,TB6600是模拟驱动器。 近年来,诸如DM556或DM542之类的数字驱动器变得更加便宜。 数字驱动器通常可以提供更好的性能和更安静的操作。 它们的连接和控制方式与TB6600相同,因此您以后可以轻松升级系统。

    我已将DM556驱动程序用于DIY CNC路由器,并且它们已经运行了好几年。

    TB6600对比TB6560

    当购买TB6600步进电机驱动器时,您可能还会遇到便宜得多的TB6560驱动器。可以使用相同的代码/接线来控制此驱动程序,但是有一些主要区别。

                            TB6560	                                               TB6600
    

    Operating voltage 10 – 35 VDC, 24 VDC recommended 9 – 42 VDC, 36 VDC recommended

    Max output current 3 A per phase, 3.5 A peak 3.5 A per phase, 4 A peak

    Current settings 14 8

    Microstep resolution full, 1/2, 1/8 and 1/16 full, 1/2, 1/4, 1/8, 1/16 and 1/32*

    Clock frequency 15 kHz 200 kHz

    因此,主要区别在于更高的最大电压,更高的最大电流以及高达1/32的微步进。 TB6600还具有更好的散热器和更好的整体尺寸。 如果要控制更大的步进电机或需要更高的分辨率,建议使用TB6600。

    接线–将TB6600连接到步进电机和Arduino

    TB6600连接

    如何确定正确的步进电机接线?

    TB6600微步设置

    微步表

    TB6600电流设置

    使用Arduino的TB6000的示例代码

    代码解释
    

    控制旋转,速度和方向的示例代码

    代码如何工作

    控制旋转方向

    控制步数或转数

    控制速度

    安装库

    库示例代码

    代码解释
    

    参阅http://viadean.com/tb6600_stepper_arduino.html

    展开全文
  • 步进电机控制(arduino+TB6600驱动器

    万次阅读 2018-05-19 17:35:50
    //本次实验电机驱动采用共阴极接线方式 //将步进电机的参数写到一个子函数中,并加入限位开关,触动限位开关可实现步进电机停转 //20180519 by xcx const int ENAPin = 5; //define Enable Pin const in...
  • 原文档地址:https://wenku.baidu.com/view/cca3bd2ae009581b6ad9eba0.html  
  • 实验目的:利用Arduino+TB6600驱动模块控制两相四线42减速步进电机 ...TB6600驱动器 *1 42减速步进电机*1 面包板 *1 12V电源适配器*1 导线 若干 接线: 12V电源适配器正负极分别接驱动器VCC和GND 步进电机黑绿红蓝线
  • #机械臂2--树莓派Python 步进电机驱动TB6600 控制步进电机步进电机驱动和步进电机的连线一、端口说明(1)、信号输入端(2)、电机绕组连接(3)、电源电压连接(4)、输入端接线说明(5)、连接完成后如图所示: ...
  • STM32F767+TB6600+57步进电机

    千次阅读 2017-07-20 20:57:10
    1.TB6600 使用说明 其中,六个拨码开关分别为OFF/OFF/ON/OFF/OFF/ON 共阴极接法:ENA默认不接一直使能(0使能),PUL-和DIR-接在stm32的GND,然后方向先可以不用管,直接PUL+接上stm32的PB0。 2.57步进电机 红...
  • TB6612FNG电机驱动使用说明

    万次阅读 多人点赞 2018-12-09 23:49:20
    TB6612是双驱动,也就是可以驱动两个电机 下面分别是控制两个电机的IO口 STBY口接单片机的IO口清零电机全部停止, 置1通过AIN1 AIN2,BIN1,BIN2 来控制正反转 VM 接12V以内电源 VCC 接5V电源 GND 接电源负极 ...
  • 步进电机的控制 (驱动板为TB6560)

    万次阅读 2014-05-24 16:35:43
    本文主要讲述了利用单片机对42步进电机进行
  • 步进电机驱动器TB6600与DRV8825的比较

    千次阅读 2019-06-10 18:26:15
    TB6600 DRV8825 输入电压 DC9-42V 8.2V-45V 输入电流 5A 2 输出电流 0.5-4.0A 最大2.5A 最大功率 160W 234 细分 1,2/A,2/B,4,8,16,32 2,4,8,16,32 工作温度 -10~45℃ 电机使用常见问题解答(FAQ...
  • TB6612FNG电机驱动模块使用说明

    千次阅读 2019-09-24 22:33:21
    TB6612FNG电机驱动模块 TB6612的的用法: TB6612是双驱动,也就是可以驱动两个电机 下面分别是控制两个电机的IO口 STBY口接单片机的IO口清零电机全部停止,置1通过AIN1 AIN2,BIN1,BIN2 来控制正反转 VM ...
  • 步进电机 HD6600驱动器 附arduino教程

    千次阅读 2017-12-02 10:26:51
    不过有时可能也会发一点解题的心得,现在主要精力放在学业和嵌入式上面,废话不多说,下面分享一下关于步进电机以及驱动器的调试方法。 首先我们要了解一下什么叫步进电机,网上大家可以查阅相关的资料 附上一个...
  • 玩平衡小车系列—TB6612FNG与直流电机控制教程

    万次阅读 多人点赞 2018-10-27 17:25:57
    (基于平衡车之家做的标准版小车) 1.直流电机原理 下面是分析直流电机的物理模型图。其中,固定部分有磁铁,这里称作主磁极;固定部分还有电刷。转动部分有环形铁心和绕在环形铁心上的绕组。...
  • 编码电机及其驱动模块tb6612的使用及其排错经验(硬件方面)图一图二首先明白电机的原理及其应用:接着是驱动模块对应引脚的说明: 图一 图二 首先明白电机的原理及其应用: 该电机的最左和最右分别是电机...
  • 单片机控制步进电机-电路连接

    千次阅读 多人点赞 2019-02-22 21:26:14
    单片机控制步进电机-线路连接 说明:如何利用单片机去控制步进电机?本案例讲解的内容是硬件连接部分,采用常用的电子器件去实现单片机...4、步进电机驱动器TB6600) 整体连接图: 原理图: 控制原...
  • 直流电机驱动芯片

    万次阅读 多人点赞 2019-03-03 18:41:27
    因此电机的驱动就显得尤为重要。本文汇总了自己用过的几个电机驱动芯片及其注意事项等等,以后有机会还会继续修正增加等。大家有其他的方案也欢迎交流。 芯片种类BTN7960/BTN7971A4950TBS1260MOS桥 BTN7960/BTN7971 ...
1 2 3 4 5 ... 20
收藏数 21,837
精华内容 8,734
关键字:

tb6600驱动器