赞
踩
目录
步进电机是一种将电脉冲信号转换成相应角位移或线位移的电动机。每输入一个脉冲信号,转子就转动一个角度或前进一步,其输出的角位移或线位移与输入的脉冲数成正比,转速与脉冲频率成正比。因此,步进电机又称脉冲步进电机。
今天主要讲诉一下使用STM32驱动步进电机(文中采用的是STM32F103VET6)、步进电机的驱动方法,普通步进电机驱动器的使用方法,STM32相关引脚和定时器的配置,如何进行调速。
STM32, 步进电机, 步进电机驱动器, 调频;
STM32F103VET6系统板、57HS7630A4D8步进电机1个、两相混合步进电机驱动器1个,开关电源(调至24V)、导线(A/B两相4根,电源2根,信号线4根“含一根脉冲信号线和一根换向线”)
拿到一个步进电机驱动器,首先要知道每个区域的功能,如图,共有8个拨动开关,对应的组合表示对应的功能:
先上接线图!!!!
鉴相:
对于两相步进电机,AB两相总共四条线,怎么才能区分那两条对应的是同一相呢,有两种常用方法:
鉴相完毕!下面开始接线:
对应的相线接到驱动板上,DC+和DC-接到电源的正负两极,注意电压要求以及正负极不要接反了,接下来开始接信号线。
步进电机驱动器EN是和控制器之间连接的使能信号接口,大部分情况下不需要使用使能信号,如果使用,就是让步进电机完全悬空,这里我们悬空EN端,DIR是方向线,不接也是可以的,不过不能改变旋转方向,只需要在对应的端输入相反的电位就能改变电机旋转的方向。
我们注意到DIR和PUL都有两根,分别是正和负,我们统一接正或者负然后引出来即可。这里将PUL+和DIR+并联引出接到STM32的+5V引脚,这样的话我们只需要在PUL对应的另一个端口PUL-输入脉冲即可驱动,最终驱动板收到的脉冲信号是PUL+和PUL-之间的脉宽,因为我们已经将PUL+接好,这样的话PUL-端输入的脉冲就是驱动板收到的脉冲,同理DIR-上面给不同的电平就会改变方向;接线完成,我们开始写控制程序;
首先将SW开关拨动到对应的位置,这里Peak为3.32,SW4为OFF,Pulse为6400;通过前面的介绍,此时细分为32细分,所以有公式
这里对应有N=1.8,X=32,
如果想要转速n=1rad/s,即每秒转1圈,则有 f=32*360/1.8=6400,仔细看会发现,选择的细分数下对应的驱动器上面的Peak值就是对应的脉冲频率。
使用定时器8的通道一,产生PWM波形 详情可以看之前的博客内容,驱动舵机的那一篇,驱动步进电机与舵机用到的都是同一个定时器的配置
对于STM32F103VET6,主频为72MHZ,使用定时器产生脉冲,f=6400,对应的周期就是1/6400=0.00015625,所以此时ARR与PSC的乘积应该为0.00015625*72000000=11250,设置
TIMx->PSC寄存器设置为72-1,则TIMx->ARR寄存器值为156,这样定时器的频率就是6400HZ。定时器初始化函数如下:(注解很详细!)
- void Init_Configuration1(u16 per,u16 psc) //步进电机初始化参数配置
- {
- GPIO_InitTypeDef GPIO_InitStructrue; //GPIO结构体定义
- TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructrue; //时钟结构体定义
- TIM_OCInitTypeDef TIM_OCInitStructrue; //中断通道结构体定义
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //开启GPIO端口时钟
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8 , ENABLE); //开启定时器时钟
-
- GPIO_InitStructrue.GPIO_Mode=GPIO_Mode_AF_PP; //引脚定义设置
- GPIO_InitStructrue.GPIO_Pin =GPIO_Pin_6; //引脚定义设置
- GPIO_InitStructrue.GPIO_Speed = GPIO_Speed_50MHz; //引脚定义设置
- GPIO_Init(GPIOC, &GPIO_InitStructrue); //引脚定义设置
-
- TIM_TimeBaseInitStructrue.TIM_ClockDivision=0; //定时器初始化设置
- TIM_TimeBaseInitStructrue.TIM_CounterMode=TIM_CounterMode_Up;//定时器初始化设置
- TIM_TimeBaseInitStructrue.TIM_Period=per; //定时器初始化设置
- TIM_TimeBaseInitStructrue.TIM_Prescaler=psc; //定时器初始化设置
- TIM_TimeBaseInit(TIM8,&TIM_TimeBaseInitStructrue); //定时器初始化设置
-
- TIM_OCInitStructrue.TIM_OCMode=TIM_OCMode_PWM1; //PWM1模式
- TIM_OCInitStructrue.TIM_OCPolarity=TIM_OCPolarity_High; //设置PWM输出极性high
- TIM_OCInitStructrue.TIM_OutputState=TIM_OutputState_Enable; //PWM比较输出使能
- TIM_OCInitStructrue.TIM_Pulse=0; //初始化脉宽为0
- TIM_OC1Init(TIM8,&TIM_OCInitStructrue); //初始化通道一
-
- TIM_OC1PreloadConfig(TIM8,TIM_OCPreload_ENable); //使能TIM8在CCR1上的预装载寄存器
-
- TIM_CtrlPWMOutputs(TIM8,ENABLE); //高级定时器输出PWM必须MOE主输出使能
- TIM_ARRPreloadConfig(TIM8,ENABLE); //使能TIM8在ARR上的预装载寄存器
- TIM_Cmd(TIM8,ENABLE); //开启定时器
-
- }
PWM模式1下,只需要TIM8->CCR1寄存器的值取TIM8->ARR值的二分之一,就可以产生一个标准的方波,这里TIM8->ARR为156,TIM8->PSC为72-1,脉冲频率为6400HZ,这样通过映射到PC6管脚输出,因为STM32的标准输出电压为3.3V,所以要利用外部电路放大产生幅值为5V的脉冲,这样就可以驱动步进电机每秒旋转一圈了,如果要更改速度,只需要改变脉冲频率,也就是TIM8->ARR的值,比如此时TIM8->ARR=156,如果TIM8->ARR=100,则电机旋转速度增加,TIM8->ARR=200电机转速减小,TIM8->ARR的值越大对应的脉冲频率越小,速度就降低,反之则会速度越快。
- extern int pul =156; //默认32细分下每秒一圈,对应TIM8->ARR的值
- //按键更改脉冲频率调速
- //button_num为按键
- //pul为脉冲宽度
- void change_pulse() //更改脉冲频率函数
- {
- if (button_num == 4) //减
- {
- if(Show_Send_Tag==1)
- {
- pul+=10;
- TIM8->ARR=pul; //TIM8->ARR的值决定脉冲频率
- }
- }
- else if (button_num == 3) //加
- {
- if(Show_Send_Tag==1)
- {
- pul-=10;
- if(pul<=5)
- pul=5;
- TIM8->ARR=pul; //TIM8->ARR的值决定脉冲频率
- }
- }
- pulse(pul/2); //脉冲宽度为0.5,输出标准方波
-
- button_num = 0;
- }
- //设置脉冲宽度
- void pulse(int angle)
- {
- TIM8->CCR1=angle;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。