1.用到的元器件
STM32F103C8T6
42步进电机
TB6600电机驱动器
2.步进电机相关知识
通用42步进电机:
步距角 1.8°
步距角精度 ±5%
相数 2相
励磁方式 混合式
转子齿数 50
拍制 双拍制
其他参数:无
由步距角=1.8°推算出转子齿数为50,拍制为双拍制
2.1.拨码开关:
根据驱动上的说明设置
S1~S3设置细分,电机步距角为1.8度,以4细分为例,4细分后步距角为1.8/4=0.45;意思就是说原来一步就能执行的现在分了四步执行,电机转动一圈就需要360/0.45=800次。细分越高它的精度也就越高,相对速度也会变慢。
驱动S4~S6设置电流,可根据实际需要设置。
注:电流设置尽量不要超过电机上标注的电流大小,否则电机会发烫。
2.2.信号输入端:
PUL+:脉冲信号输入正。( CP+ )
PUL-:脉冲信号输入负。( CP- )
DIR+:电机正、反转控制正。
DIR-:电机正、反转控制负。
EN+:电机脱机控制正。
EN-:电机脱机控制负。
共阳极接法:分别将PUL+,DIR+,EN+连接到控制系统的电源上, 如果此电源是+5V则可直接接入,如果此电源大于+5V,则须外部另加限流电阻R,保证给驱动器内部光藕提供8—15mA 的驱动电流。
共阴极接法:分别将 PUL-,DIR-,EN-连接到控制系统的地端;脉冲输入信号通过PUL+接入,方向信号通过DIR+接入,使能信号通过EN+接入。若需限流电阻,限流电阻R的接法取值与共阳极接法相同。
注:EN端可不接,EN有效时电机转子处于自由状态(脱机状态),这时可以手动转动电机转轴。
至于A+(-),B+(-)以及VCC跟GND我相信大家应该都知道如何去接。
3.单片机与驱动的连接
引脚连接
如本实验STM32F103C8接线如下:
DIR+ (驱动器) PA0(开发板)
PUL+ (驱动器) PB6(开发板)
DIR- PUL- 采用共阴极接线接入系统板
VCC跟GND接9-42V外接电源
接线功能
PB6------控制电机转速
PA0------控制电机正反转方向
定时器
1.本实验利用定时器TIM4控制电机的转速。
2.电机的转速和转角还与驱动器自身的细分数有关,但是驱动器细分数是通过影响电机的步距角来影响转速,而TIM4是控制步进电机的频率和脉冲数来控制转速。
3.电机的转速和角度与定时器的关系
这里说说我自己的理解并做了相应的实验,例如:
我将驱动器设置为32细分,看驱动上的注释可知道转一圈需要6400次,程序中定时器4分频系数设置为TIM4_PWM_Init(100,500);在这顺便说一下如何计算分频系数,系统时钟为72M,那么可以算出72000000/500/100=1440,即1440次/秒;所以在这就可以得到电机转动一圈需要的时间为6400/1440大约就是4.4秒。这样就能实现不同电机的转速转动。
4.程序实现:
#include "timer.h"
#include "led.h"
void DIR_Init(void) //DIR——PA0初始化
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void TIM4_PWM_Init(u16 arr,u16 psc)
{
//结构体
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
//使能时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
//设置该引脚为复用输出功能,输出TIM4 CH1的PWM脉冲波形 GPIOB.6
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
//设置定时器参数
TIM_TimeBaseStructure.TIM_Period = arr;
TIM_TimeBaseStructure.TIM_Prescaler =psc;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
//中断设置
TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE );
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//初始化TIM4 Channel1
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM4, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);
TIM_Cmd(TIM4, ENABLE); //使能TIM4
}
//定时器4中断服务程序
void TIM4_IRQHandler(void)
{
if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源
{
TIM_ClearITPendingBit(TIM4, TIM_IT_Update ); //清除TIMx的中断待处理位:TIM 中断源
}
}
现在的程序只是通过在程序中修改电机旋转方向以及分频系数来改变转速。后续会发布通过上位机控制电机的正反转以及转速。
对应程序链接地址。