历史上的今天
返回首页

历史上的今天

今天是:2025年03月18日(星期二)

正在发生

2019年03月18日 | STM32驱动步进电机

2019-03-18 来源:eefocus

步进电机是将电脉冲信号转变为角位移或线位移,可以通过控制脉冲来控制,因此比一般的电机更精准。这篇文章将会讲述我对四线两项步进电机的调试经验。


1.步进电机以及THB7128的接线

THB7128步进电机驱动有两个接线口,J4口与stm32的IO口相接,J2口与步进电机和电源相接。


J2口有6个端子,从两个端口旁的接口定义可以看出,接口分别为B-,B+,A-,A+,V-,V+。其中V+与9~32V的电源相接,V-接电源地,其余的接口B+,B-一组,A+,A-一组与步进电机的两组同相线相接(注:想要判断步进电机哪两根线同相,只需用万用表测量,短接的即为同相)。


J4口同样可以从端口定义看出,分别有CP+,CP-,DIR+,DIR-,EN+,EN-6个端子。CP为脉冲信号输入端,DIR为电机正反转控制端,EN为电机脱机控制端。在J4端口有共阳极和共阴极两种接线方法。 


共阳极接法:分别将CP+,DIR+,EN+连接到STM32板子的输出电压上,脉冲输入信号通过CP-接入;此时,DIR,EN-在低电平有效。 


共阴极接法:分别将CP-,DIR-,EN-连接到控制系统的地端(与电源地隔离);此时脉冲输入信号通过CP+加入,U/D+,EN+在高电平有效。 


(注:我采用的是共阴极接法,所以之后只介绍共阴极的程序) 


J4端口共阴极接线


2. THB7128设置

TBH7128有6个拨盘开关(S1~S6),前3个开关控制细分设置,即控制电机每一步转动多少度,步距角=电机固有步距角/细分数。后三个S3~S6设置电流大小,设置的电流不要超过电机的额定电流。具体如何设置根据自己实际情况参考驱动芯片背后的说明表进行调节。说明表所示: 


Microstep-Set 
Current-Set


3.程序设计

(1)使步进电机稳定转动 

驱动接收到一个脉冲步进电机就动一步,所以我们可以用定时器中断将脉冲按一定的频率从STM32的IO口输入到驱动中,这样就可以使步进电机稳定转动起来 

(2)步进电机的开启、截止以及变向 

当THB7128使能端EN+接收到高电平时步进电机停止运转,接收到低电平时正常运转。因此改变与EN+相接的IO口的电平高低就可以控制电机的开启与截止。 

当正反控制端DIR+接收到高电平时步进电机改变转动方向,改变相应的IO口电平即可让步进电机变向。 

(3)步进电机变速 

我用的定时器中断来驱动电机转动,所以只要想办法改变定时器中断的参数就可以让电机改变速度


具体程序如下:


①定时器设置及IO口初始化


#include "dianji.h"

#include "led.h"


void TIM3_Int_Init(u16 arr,u16 psc)

{

  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

    NVIC_InitTypeDef NVIC_InitStructure;


    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能


    //定时器TIM3初始化

    TIM_TimeBaseStructure.TIM_Period = arr;//自动重装载寄存器周期的值

    TIM_TimeBaseStructure.TIM_Prescaler = psc;//预分频值

    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//设置时钟分割

    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数模式

    TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);


    TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //使能指定的TIM3中断,允许更新中断


    //中断优先级NVIC设置

    NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;//TIM3中断

    NVIC_InitStructure.NVIC_IRQChannelCmd =ENABLE; 

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;//响应优先级

    NVIC_Init(&NVIC_InitStructure);


    TIM_Cmd(TIM3,ENABLE);//使能TIMx

}


void TIM3_IRQHandler(void)//TIM3中断函数

{

    if(TIM_GetITStatus(TIM3,TIM_IT_Update) != RESET)//检查TIM3更新中断发生与否

    {

        TIM_ClearITPendingBit(TIM3,TIM_IT_Update);//清除TIMx更新中断标志

        LED0=!LED0;

    }

}



void DJ_Init(void)

{

    GPIO_InitTypeDef GPIO_InitStruct;


    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能GPIOB

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG,ENABLE);//使能GPIOG


    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出 

    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_4;

    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOB,&GPIO_InitStruct);

    GPIO_SetBits(GPIOB,GPIO_Pin_6);


    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出 

    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;

    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOG,&GPIO_InitStruct);

    GPIO_SetBits(GPIOG,GPIO_Pin_9); 

}


②主函数(具体操作控制)


#include "stm32f10x.h"

#include "usart.h"

#include "led.h"

#include "delay.h"

#include "sys.h"

#include "timer.h"

#include "key.h"

#include "dianji.h"


#define up 1 

#define down 0



int main(void)

{

    vu8 key = 0;

    vu8 key1 = 0;

    vu8 num0 = 0;

    vu8 num1 = 0;

    vu8 num2 = 0;

    vu8 speed = 1;

    vu16 arrLowest = 189;

    vu16  arrMax= 409;

    vu16 arr =299;

    vu16 psc = 359;

    LED_Init();

    delay_init();

    KEY_Init();

    DJ_Init();

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

    uart_init(115200);   //串口初始化为115200


    TIM3_Int_Init(arr,psc);//10Khz的计数频率,计数到100为10ms (arr+1)*(psc+1)/72  

    while(1)

    {   

        key = KEY_Scan(0);

        if(key == KEY0_PRES)

        {

            if(num0 == 0)

            {

                num0 = 1;

                LED1=0;

                GPIO_ResetBits(GPIOB,GPIO_Pin_6);

            }

            else

            {

                num0 = 0;

                LED1=1;

                GPIO_SetBits(GPIOB,GPIO_Pin_6);

            }

        }           

        if(key == KEY1_PRES)

        {

            if(num2 == 0)

            {

                GPIO_SetBits(GPIOG,GPIO_Pin_9);

                num2 = 1;

            }

            else

            {

                GPIO_ResetBits(GPIOG,GPIO_Pin_9);

                num2 = 0;

            }

        }

        while(key == WKUP_PRES)

        {                       

            if(speed == down)

            {               

                arr+=2;

                TIM3_Int_Init(arr,psc);                 

                delay_ms(50);

                key1 = KEY_Scan(0);

                if(arr > arrMax)

                {

                    speed = up;

                }

                if(key1 == WKUP_PRES)//关闭变速

                {

                    LED1 = 0;

                    key = 0;

                }

            }

            if(speed == up)

            {                   

                arr-=2;             

                TIM3_Int_Init(arr,psc);                 

                delay_ms(50);

                if(arr < arrLowest)

                {   

                    speed = down;

                }

                key1 = KEY_Scan(0);

                if(key1 == WKUP_PRES)

                {

                    LED1 = 0;

                    key = 0;

                }   

            }

        }       

    }

}


4.总结

通过以上过程的调试,我实现了用按键控制步进电机的启动、截止、变向以及加减速这些功能。 

可能我的电机驱动和大家的不一样, 希望能让读者起到参考作用。

推荐阅读

史海拾趣

Glorious Sources Co Ltd公司的发展小趣事
确保电路具有稳定的电源供应,以满足各元件的正常工作需求。
ENOCEAN公司的发展小趣事

为了进一步推动其技术在建筑行业的应用,EnOcean发起并建立了EnOcean联盟。该联盟由来自建筑行业的400多家公司组成,致力于推广基于EnOcean无线标准的免维护无线解决方案。通过与联盟成员的合作,EnOcean不断拓展其市场份额,并为智慧楼宇及能源管理提供更稳定的硬件解决方案。

Digitron公司的发展小趣事

Digitron公司成立于XXXX年,由一群热衷于电子技术的工程师和科学家创立。在成立初期,公司专注于开发高精度、高可靠性的温度数据记录器。这些设备在医药、冷链物流等领域得到了广泛应用,为Digitron公司赢得了良好的声誉。随着技术的不断进步,Digitron公司逐渐扩大了产品线,推出了更多适用于不同行业的数据记录器和传感器。

CITIZEN公司的发展小趣事

西铁城公司的历史可以追溯到1881年,由日本商人户田清创立。最初,公司名为“户田时计商店”,主要从事时计的维修和销售业务。然而,随着时间的推移,户田清意识到仅仅依靠维修和销售并不能满足市场的需求,于是公司开始致力于制造自己的钟表产品。这一转变不仅扩大了公司的业务范围,也为西铁城日后在电子行业中的崛起奠定了基础。

CALMIRCO公司的发展小趣事

CALMIRCO公司深知合作共赢的重要性,因此积极与上下游企业建立紧密的合作伙伴关系。公司与多家知名芯片制造商、电子设备生产商等建立了长期稳定的合作关系,共同推动产业链的发展。通过资源共享、技术互补等方式,CALMIRCO公司与合作伙伴实现了共赢发展,共同提升了行业竞争力。

Deutsch公司的发展小趣事

随着全球环保意识的不断提高,电子行业的环保要求也日益严格。Deutsch公司积极响应环保号召,将环保和可持续发展作为公司的重要战略之一。公司投入大量资源研发环保型产品和技术,减少生产过程中的能源消耗和污染排放。同时,公司还积极参与环保公益活动,推动整个行业的绿色发展。这些努力不仅提升了公司的社会形象,也为公司的可持续发展奠定了坚实基础。

问答坊 | AI 解惑

诚聘欲在桂林工作的嵌入式软件开发、测试工程师 待遇好

2007年秋桂林市核子软件有限公司招聘信息 2007年桂林市核子软件开发有限公司招聘信息公司简介: 桂林市核子软件开发有限公司主要从事于嵌入式软件及网络新技术的研究和开发,主要由深圳市双赢伟业科技有限公司投资兴办。公司主要客户是双赢伟 ...…

查看全部问答>

电子技术新手资料

电子技术新手资料,适合入门者…

查看全部问答>

AVR入门必读《实战AVR单片机C语言》

自学AVR单片机少不了动手实践!…

查看全部问答>

红外可视距离与红外距离之间的区别

红外距离指的是红外光所达到的距离,从几米到几百米,甚至是数公里。而夜间可视距离是通过监视器所能够看到的清晰有效最大距离,是由红外灯的发光距离、摄像机的感红外程度、现场反射红外情况、供电电源的质量及镜头的匹配情况来决定的。它们之间相 ...…

查看全部问答>

向你请教 WINCE + 2410 + I2C + AT24C02 的问题!

我想用 2410 开发板,WinCE 4.2 操作系统,I2C 总线读写 AT24C02 EEPROM。 我已经看懂了 2410 的 I2C 寄存器和 AT24C02 的读写方法;也看懂了 ADS 下的纯 C 语言程序。 因为我以前一直做桌面的程序,底子比较差;就是对 WINCE 下的 I2C 流驱动没 ...…

查看全部问答>

cypress的gpif波形问题,求教。

如题,我用cypress的芯片控制nand flash,型号是k9f1g08u0a,gpif波形图如下,现在我换了一个flash,时序上不一样,没弄过这些,不知道这些图形都代表什么,盼高手指点。 d:\\flash\\gpif\\1.jpg d:\\flash\\gpif\\2.jpg d:\\flash\\gpif\\3.jpg ...…

查看全部问答>

电路里三极管怎么分析他们的作用

本信息来自合作QQ群:arm linux HTTP://WWW.1YQ.COM (49900581) 群管理员在坛子里的ID:wangkj…

查看全部问答>

大家觉得今年的控制题目会怎么出?

本帖最后由 paulhyde 于 2014-9-15 09:46 编辑 自由谈论,希望大家发挥想象各抒己见  …

查看全部问答>

正负5V电源输出

今天,我用L7805CV和L7905CV做了个正负5V电源,正端输出是5.01V,负端输出是负6.26V,不是负5V左右,开始的时候,我以为可能是L7905CV芯片的问题,就换了一块L7905CV芯片,结果负端还是负5.89V,另外,我测试了下L7805CV和L7905CV的输入端分别是正 ...…

查看全部问答>

求一份低频信号分析仪设计 急!!!求教高手!!!

本帖最后由 paulhyde 于 2014-9-15 03:51 编辑 做一个低频信号分析仪要求 基本要求 在输入交流信号电压峰峰值Vpp为500m V~5V,频率范围为50Hz~50kHz条件下,完成以下参数测试; 正弦波,三角波和方波频率测试,测量误差小于1%; 正弦波 ...…

查看全部问答>