最近需要用到TB6600驱动57步进电机,在网上找了一些资源后,决定把自己编程中遇到的问题和一些经验分享出来,让新学的朋友少走弯路;
TB6600和57步进电机具体就不介绍了,话不多说,下面开始
首先是硬件连接: VCC接电源VCC GND接电源与单片机GND(单片机与电源和驱动器要共地)
ENA- DIR- PUL-接TB6600驱动器GND
ENA+接单片机3.3V或5V
DIR+接单片机PC0
PUL+接单片机PB0
电机A+ A- B+ B-与驱动器A+ A- B+ B-相连接
定时器PWM,电机初始化代码如下:
//////////////////////////////////////////////////////////////////////////////////
电机初始化
void Drive_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//普通输出模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//50M
GPIO_Init(GPIOC, &GPIO_InitStructure);
// GPIO_ResetBits(GPIOC,GPIO_Pin_0);
}
//定时器初始化
//定时器3通道3PB0
void TIM3_Int_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //GPIOB时钟使能
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //tim3 时钟使能
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//推挽复用输出模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//50M
GPIO_Init(GPIOB, &GPIO_InitStructure);
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 计数到5000为500ms
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 10Khz的计数频率
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性低
TIM_OC3Init(TIM3, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM1 4OC1
TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIM2在CCR1上的预装载寄存器
TIM_ARRPreloadConfig(TIM3,ENABLE);//ARPE使能
TIM_Cmd(TIM3, ENABLE); //使能TIMx外设
}
//主程序如下
int main(void)
{
delay_init(); //延时函数初始化
Drive_Init();
TIM3_Int_Init(1000-1,72-1);//10Khz的计数频率,计数到5000为500ms
while(1)
{
GPIO_SetBits(GPIOC,GPIO_Pin_0);
TIM_SetCompare3(TIM3,400);
delay_ms(1000); //注意:正点原子官方延时函数delay_ms(),对72M条件下,nms<=1864 ,所以这里延时超过1864的话延时就会不准
delay_ms(1000);
delay_ms(1000);
GPIO_ResetBits(GPIOC,GPIO_Pin_0);
TIM_SetCompare3(TIM3,400);
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
}
}
Keil代码下载:
Keil代码.7z
(184.25 KB, 下载次数: 115)
|