前言:最近在做公司的项目有需要使用到步进电机带动丝杆控制设备的需求,将开发过程中的一些设备介绍及电机控制等记录一下
效果演示
步进电机控制
一、步进电机及其驱动器简介
步进电机是一种将电脉冲信号转换成相应角位移或线位移的电动机,电机转动的距离被分为每一步多少角度,每收到一个脉冲信号就转动一步,其转速与脉冲信号频率成正比
驱动器是用于将脉冲信号转换成角位移并反馈给电机的设备,其可以通过拨码设置电机的细分步数来控制步进电机进行更精准的操作,还可以控制电机的转向及使能失能,使开发者可以只关注驱动器代码开发即可
二、DM542驱动器控制介绍
驱动控制
PUL+、PUL-是驱动器的脉冲信号接收端,DIR+、DIR-用于用于控制电机转向,其DIR+的高低电平各代表一个方向(PS:实际转向要根据接线方式来定,A相正负调换也可改变电机方向),ENA+、ENA-用于控制驱动器是否对电机使能,ENA+为高电平时驱动器亮红灯,使能对电机的控制
电流·管理及步数细分
驱动器上总共有sw1-sw88个拨码,sw1-sw3用于控制驱动器的最大电流,sw4是驱动器的待机电流开关,打开是全流关闭是半流,默认关闭,sw5-sw8拨码用于控制步进电机的细分步数,所谓细分步数就是讲步进电机一步的角度再细分为更小的角度,细分步数越高精度越高
电源与电机接口
V+与GND是驱动器的电源接口,驱动器本身支持20-50v直流电,A+
、A-、B+、B-为电机的相位,此驱动器用于驱动两相电机所以只有AB两相,将AB相的正负与电机标识的AB相正负连接即可,切换A相正负可改变电机转向
三、代码实现
1、驱动器所需的脉冲可使用定时器输出PWM波来实现,不想用外设的话也可手动翻转引脚电平来输出脉冲使能驱动器与电机
2、配置GPIO
此处选用定时器3,复用引脚为PA6/7、PB0/1
static void TIMx_GPIO_Config(void)
{
/*定义一个GPIO_InitTypeDef类型的结构体*/
GPIO_InitTypeDef GPIO_InitStructure;
/*开启相关的GPIO外设时钟*/
RCC_AHB1PeriphClockCmd (RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOA, ENABLE);
/* 定时器通道引脚复用 */
GPIO_PinAFConfig(GPIOB,GPIO_PinSource0,GENERAL_OCPWM_AF);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource1,GENERAL_OCPWM_AF);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource6,GENERAL_OCPWM_AF);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource7,GENERAL_OCPWM_AF);
/* 定时器通道引脚配置 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
//普通输出模式
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
//推挽输出
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
//100MHz
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
//引脚浮空
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
//初始化
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* 定时器通道引脚配置 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
//初始化
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
3、配置定时器
static void TIM_PWMOUTPUT_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
// 开启TIM3时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
/* 累计 TIM_Period个后产生一个更新或者中断*/
//当定时器从0计数到500,即为500次,为一个定时周期
TIM_TimeBaseStructure.TIM_Period = 500-1;
// 通用控制定时器时钟源TIMxCLK = HCLK/2=84MHz
// 设定定时器频率为=TIMxCLK/(TIM_Prescaler+1)=100KHz
TIM_TimeBaseStructure.TIM_Prescaler = 84-1;
// 采样时钟分频
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
// 计数方式为向上计数
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
// 初始化定时器TIM3
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure)