精华内容
下载资源
问答
  • 步进电机驱动

    2018-12-31 15:30:16
    步进电机驱动
  • 步进电机驱动步进电机驱动步进电机驱动步进电机驱动步进电机驱动步进电机驱动
  • 步进电机驱动方法,步进电机设计参数资料,步进电机细分
  • 如何使用步进电机驱动板实现位置控制与步进电机驱动,怎样实现位置跟随控制?本课程将从驱动板介绍、软件实现方法、硬件实现方法三个角度,为你讲解双极步进电机驱动控制的相关内容。主讲内容:1、驱动板介绍:可...
    3b5174ed85a3fd6eb0cf8a73a878e308.png

    如何使用步进电机驱动板实现位置控制与步进电机驱动,怎样实现位置跟随控制?

    本课程将从驱动板介绍、软件实现方法、硬件实现方法三个角度,为你讲解双极步进电机驱动控制的相关内容。

    主讲内容:

    1、 驱动板介绍:可同时驱动两个双极步进电机,带霍尔和编码器接口,实现位置控制。使用TI的DRV8841,2.5A双路H桥电机驱动器,使用较少的外围元件即可驱动两个直流电机或一个双极步进电机。驱动器自带恒流电路,避免电机过流而损坏。宽电压输入8.2V~45V。利用PWM可以实现高细分驱动,达到更高精度的控制,同时内部电路已经实现死区控制,软件实现较为简单。

    2、 硬件实现:使用ST Nucleo F411RE做为主控芯片+步进电机驱动板,定时器输出4路PWM信号实现步进电机高细分驱动,并通过简单的加减速控制算法实现位置跟随控制。

    3、 软件实现:开发环境为MKDK5.24A,HAL库。

    d94ba714ddc8af3b04c0240f1eb9095a.gif

    加入群聊

    传感器技术交流2群:954070515

    射频/无线交流2群:725064756

    电机控制研发交流2群:619795552

    电源开发交流2群:457910972

    EDA/PCB设计交流2群:743876836

    物联网技术交流2群:992318230

    汽车电子交流1群:238034110

    嵌入式交流1群:852018713

    电路城官方交流群,期待你的加入。

    247dd0fe91893dc031d985bcca70d60c.gif

    点击“

    展开全文
  • 1.步进电机为什么要配步进电机驱动器才能工作? 步进电机作为一种控制精密位移及大范围调速专用的电机, 它的旋转是以自身固有的步距角角(转子与定子的机械结构所决定)一步一步运行的, 其特点是每旋转一步,步距角...

    1.步进电机为什么要配步进电机驱动器才能工作?
    步进电机作为一种控制精密位移及大范围调速专用的电机, 它的旋转是以自身固有的步距角角(转子与定子的机械结构所决定)一步一步运行的, 其特点是每旋转一步,步距角始终不变,能够保持精密准确的位置。所以无论旋转多少次,始终没有积累误差。由于控制方法简单,成本低廉,广泛应用于各种开环控制。步进电机的运行需要有脉冲分配的功率型电子装置进行驱动, 这就是步进电机驱动器。它接收控制系统发出的脉冲信号,按照步进电机的结构特点,顺序分配脉冲,实现控制角位移、旋转速度、旋转方向、制动加载状态、自由状态。控制系统每发一个脉冲信号, 通过驱动器就能够驱动步进电机旋转一个步距角。步进电机的转速与脉冲信号的频率成正比。角位移量与脉冲个数相关。步进电机停止旋转时,能够产生两种状态:制动加载能够产生最大或部分保持转矩(通常称为刹车保持,无需电磁制动或机械制动)及转子处于自由状态(能够被外部推力带动轻松旋转)。步进电机驱动器,必须与步进电机的型号相匹配。否则,将会损坏步进电机及驱动器。

    2.什么是驱动器的细分?运行拍数与步距角是什么关系?
    “细分”是针对“步距角”而言的。没有细分状态,控制系统每发一个步进脉冲信号,步进电机就按照整步旋转一个特定的角度。步进电机的参数,都会给出一个步距角的值。如110BYG250A型电机给出的值为0.9°/1.8°(表示半步工作时为0.9°、整步工作时为1.8°),这是步进电机固有步距角。通过步进电机驱动器设置的细分状态,步进电机将会按照细分的步距角旋转位移角度,从而实现更为精密的定位。以110BYG250A电机为例,列表说明:
    电机固有步距角 运行拍数 细分数 电机运行时的真正步距角
    0.9°/1.8° 8 2细分,即半步状态 0.9°
    0.9°/1.8° 20 5细分状态 0.36°
    0.9°/1.8° 40 10细分状态 0.18°
    0.9°/1.8° 80 20细分状态 0.09°
    0.9°/1.8° 160 40细分状态 0.045°

    可用看出,细分数就是指电机运行时的真正步距角是固有步距角(整步)的几分指一。例如,驱动器工作在10细分状态时,其步距角只有步进电机固有步距角的十分之一。当驱动器工作在不细分的整步状态时,控制系统每发一个步进脉冲,步进电机旋转1.8°;而用细分驱动器工作在10细分状态时,电机只转动了0.18° 。其实,细分就是步进电机按照微小的步距角旋转,也就是常说的微步距控制。当然,不同的场合,有不同的控制要求。并不是说,驱动步进电机必须要求细分。有些步进电机的步距角设计为3.6°、7.5°、15°、36°、180°,就是为了加大步距角,以适应特殊的工况条件。细分功能,只是是由驱动器采用精确控制步进电机的相电流方法,与步进电机的步距角无关,而与步进电机实际工作状态相关。
    运行拍数与驱动器细分的关系是:运行拍数指步进电机运行时每转一个齿距所需的脉冲数。例如:110BYG250A电机有50个齿,如果运行拍数设置为160,那么步进电机旋转一圈总共需要50×160=8000步;对应步距角为360°÷8000=0.045°。这就是驱动器设置为40细分状态。对于用户来说,没有必要去计算几步几拍,这是生产厂家配套的事情。用户只要知道:控制系统所发出的脉冲率数,除以细分数,就是步进电机整步运行的脉冲数。例如:步进电机的步距角为1.8°时,每秒钟200个脉冲,步进电机就能够在一秒钟内旋转一圈;当驱动器设置为40细分状态,步进电机每秒钟旋转一圈的脉冲数,就要给到8000个。

    3.驱动器细分有什么好处?
    步进电机驱动器采用细分功能,能够消除步进电机的低频共振(震荡)现象,减少振动,降低工作噪音。随着驱动器技术的不断提高,当今,步进电机在低速工作时的噪音已经与直流电机相差无几。低频共振是步进电机(尤其是反应式电机)的固有特性,只有采用驱动器细分的办法,才能减轻或消除。
    利用细分方法,又能够提高步进电机的输出转矩。驱动器在细分状态下,提供给步进电机的电流显得“持续、强劲”,极大地减少步进电机旋转时的反向电动势。
    驱动器的细分功能,改善了步进电机工作的旋转位移分辨率。因此,步进电机的步距角,就没有必要做得更小。选择现有的常规标准步距角的步进电机,配置40细分以下的驱动器,就能够完成精密控制任务。由于步进电机步距角的原因,驱动器的细分数再加大,已经没有实际意义。通常,选择5、8、10、16、20细分,就能够适应各种工控要求。

    4.步进电机的运行方向有几种方法调整?
    平时,采用三种方法来该变步进电机的旋转方向。
    一、 改变控制系统的方向信号,即高电平或低电平。
    二、 对于有两路脉冲输入的驱动器,改变脉冲的顺序。
    三、 调整步进电机其中一组线圈的两个线头位置,重新接入驱动器。 具体方法见下表:
    电机接线方式 原来接线序列 换向后接线序列
    两相四线 A,A',B,B' A',A,B,B'或者A,A',B',B
    三相三线 A,B,C B,A,C或者A,C,B
    三相六线 A,A',B,B',C,C' B,B',A,A',C,C'或者A,A',C,C',B,B'
    五相五线 A,B,C,D,E E,D,C,B,A

     
    5.四相六根和八根线的,如何使用两相四线驱动器?
    四相混合式步进电机,可以认为是二相混合式步进电机。多组线圈多个抽头,是为了适应不同工况条件而设计的。由于步进电机的线圈,与转速、转矩有着密切的关系。高速与低速工作的步进电机参数有所不同。通常,高速步进电机的电感要求小一点,低速工作时要求大一点的电感量。但是,这也不是绝对的。更多的实际应用,还考虑权衡其它众多相关因素。下面就几种步进电机的线圈绕组及出线,采用双极性驱动器,说明接线方法:
    两相四线电机:1 和2为一相,分别接A和/A;3和4为一相,分别接B和/B。参考下图:

    四相六线电机,两种方法接线:
    一、1和2为一相,分别接A和/A;5和6为一相,分别接B和/B。
    3和4不用,分别悬空(不要相连)。
    二、1、3为一相,定义A、/A;4、6为一相,定义为B、/B。2和5分别悬空不用(不要相连)。
    参考下图:

    四相八线电机, 有两种接法。
    并联接法:1和3相连=A,2和4相连=/A;5和7相连=B,6和8相连=/B。
    联接法:1和4为一相,分别接A和/A;2、3连接好不用;5、8为一相,分别接B、/B,6、7连接好不用。
    参考下图:

    6.四相五线步进电机如何接驱动器?
    上述四相六线、八线步进电机,都可在生产过程中,接为五线制,适应特殊需要。驱动器就要选择单极性驱动方式,例如HSM8672单极性步进电机驱动器。如上图:四相六线步进电机的2、5并联为一条线接公共电源;四相八线步进电机的2、3、6、7并联为一条线接公共电源。其它四条线分别接:A、/A、B、/B。

    7.电机在低速运行时正常,为何稍高一点的频率略就会堵转?
    步进电机跑高速需要高电压支持。步进电机的工作电压,能够适应在较大范围内调整。只要将输入电压加高一点,就可以解决。但是,要特别注意驱动器的输入电压不能高于驱动器电源端标注的最高电压,否则,会烧毁驱动器。

    8.接线全部完好,为何开机时步进电机在抖动而不能运行?
    步进电机只能够由数字信号控制运行的,当脉冲提供给驱动器时,在过于短的时间里,控制系统发出的脉冲数太多,也就是脉冲频率过高,将导致步进电机堵转。要解决这个问题,必须采用加减速的办法。就是说,在步进电机起步时,要给逐渐升高的脉冲频率,减速时的脉冲频率需要逐渐减低。这就是我们常说的“加减速”方法。

    步进电机转速度,是根据输入的脉冲信号的变化来改变的。从理论上讲,给驱动器一个脉冲,步进电机就旋转一个步距角(细分时为一个细分步距角)。实际上,如果脉冲信号变化太快,步进电机由于内部的反向电动势的阻尼作用,转子与定子之间的磁反应将跟随不上电信号的变化,将导致堵转和丢步。所以步进电机在高速启动时,需要采用脉冲频率升速的方法,在停止时也要有降速过程,以保证实现步进电机精密定位控制。加速和减速的原理是一样的。下面就加速实例加以说明:
    加速过程,是由基础频率(低于步进电机的直接起动最高频率)与跳变频率(逐渐加快的频率)组成加速曲线(降速过程反之)。跳变频率是指步进电机在基础频率上逐渐提高的频率,此频率不能太大,否则会产生堵转和丢步。加减速曲线一般为指数曲线或经过修调的指数曲线,当然也可采用直线或正弦曲线等。使用单片机或者PLC,都能够实现加减速控制。对于不同负载、不同转速,需要选择合适的基础频率与跳变频率,才能够达到最佳控制效果。指数曲线,在软件编程中,先算好时间常数存贮在计算机存贮器内,工作时指向选取。通常,完成步进电机的加减速时间为300ms以上。如果使用过于短的加减速时间,对绝大多数步进电机来说,很难实现步进电机的高速旋转。

    很多工控场合,要求步进电机运行平稳、振动小、噪音低、瞬间完成执行指令、高精度定位,都需要在编写软件时使用加减速方法。脉冲频率的不同时间常数,对于某个工控现场步进电机的运行,将会产生不同的控制效果。这就要求控制程序的编写人员,深入了解控制要求,明确运动目标,做到锦上添花,力求完美。
    9.有些场合,步进电机为何还要闭环控制?
    本来步进电机,使用开环控制,能够省去很多检测、反馈器件及控制电路,以简单的控制方法,价廉物美的优势,取代很多伺服电机的控制。尤其在低速控制(3000转/分钟以下)环境中,使用步进电机精密控制,有很好的性价比。就是采用闭环控制,其成本也要远低于伺服电机的控制系体成本。在某些工控环境中,负载有可能会随机发生过载现象,使用步进电机开环控制,就会发生丢步。此时,控制系统无法知道丢了多少步,继续按照既定目标工作,导致工作失误。这样,就要求在步进电机带动的主轴上安装旋转编码器,或者安装光电探头、磁敏探头、行程开关等器件,来识别位移物体是否到位,采集到的信号反馈到控制系体,适时修正工作参数,指令步进电机准确动作。
    10.控制器与驱动器的连线是否要求屏蔽?
    如果只有步进电机一种动力源的工控环境,通常不需要将信号线屏蔽。当步进电机周围,有其它动力源或能够产生干扰信号的高压电磁场,就必须将信号线屏蔽,以保证控制信号的指令,能够正确指令步进电机运动。只要控制信号线中有任何由外部干扰源产生的跳变信号,电流强度达到几个毫安,能够推动光耦合,就能够致使步进电机误动作。因此,为保证步进电机正确执行指令,最好将控制器与驱动器连线加以屏蔽。
    11.远距离控制步进电机如何布线?
    步进电机与驱动器之间的连线、控制器与驱动器之间的连线,都允许延长。主要测算好电压衰减参数,补偿信号衰减,都能够实现远距离控制步进电机。
    12.步进电机与驱动器之间的连线是否要求屏蔽?
    绝大多数的工控环境中,无需屏蔽。某些特殊的工控环境中,由于高压强磁场的干扰,还是要求采用屏蔽保护。

    展开全文
  • 步进电机之步进电机驱动器使用说明

    万次阅读 多人点赞 2017-12-31 18:18:36
    这一篇就介绍步进电机驱动器的简介以及使用方法。 这里我们以TB6600步进电机驱动器为例,进行介绍。其他型号的驱动器也大同小异。如图是我们使用的步进电机驱动器 一.输入输出端说明 1.信号输入端 PUL+:脉冲信号...

    上一篇博文简介了一下步进电机控制程序的配置和思路。这一篇就介绍步进电机驱动器的简介以及使用方法。

    这里我们以TB6600步进电机驱动器为例,进行介绍。其他型号的驱动器也大同小异。如图是我们使用的步进电机驱动器

    一.输入输出端说明

    1.信号输入端

    PUL+:脉冲信号输入正。
    PUL-:脉冲信号输入负。
    DIR+:电机正、反转控制正。
    DIR-:电机正、反转控制负。
    EN+:电机脱机控制正。
    EN-:电机脱机控制负。


    2.电机线连接段

    A+:连接电机绕组A+相。
    A-:连接电机绕组A-相。
    B+:连接电机绕组B+相。
    B-:连接电机绕组B-相。
     


    3.电源电压连接

    VCC:电源正端“+”
    GND:电源负端“-”  (需要注意的是电机驱动器上DC电源还是AC,DC只能接入直流电源,而AC的话既交流又可以直流电源)


    4.输入端接线说明

    输入信号共有三路,它们是:①步进脉冲信号PUL+,PUL-;②方向电平信 号DIR+ ,DIR-③脱机信号EN+,EN-。
    输入信号接口有两种接法,用户可根据 需要采用共阳极接法或共阴极接法。 

    共阳极接法:分别将PUL+,DIR+,EN+连接到控制系统的电源上, 如果此电源是+5V 则可直接接入,
    如果此电源大于+5V,则须外部另加限流 电阻R,保证给驱动器内部光藕提供8—15mA 的驱动电流。
    脉冲输入信号通 过CP-接入,方向信号通过DIR-接入,使能信号通过EN-接入。如下图 



    共阴极接法:分别将 PUL-,DIR-,EN-连接到控制系统的地端; 脉冲输入信号通过PUL+接入,方向信号通过DIR+接入,
    使能信号通过EN+接 入。若需限流电阻,限流电阻R 的接法取值与共阳极接法相同。如下图: 


    这里需要注意的是:在一般情况下EN端可不接,EN有效时电机转子处于自由状态(脱机状态),这时 可以手
    动转动电机转轴,做适合您的调节。手动调节完成后,再将 EN 设为 无效状态,以继续自动控制
     。




    二、系统接线方法

    驱动器与控制器、电机、电源的接线,以共阳接法为例,如下图所示: 




    三、拨码开关的设定细分以及电流

    1.细分数设定

    细分数是以驱动板上的拨码开关选择设定的,用户可根据驱动器外盒上 的细分选择表的数据设定(最好在断电情况下设定)。细分后步进
    电机步距 角按下列方法计算:步距角=电机固有步距角/细分数。如:一台固有步距角 为1.8°的步进电机在4细分下步距角为1.8°/4=0.45°
    驱动板上拨码开关1、2、3、分别对应S1、S2、S3. (这里需要注意的是并不是设置细分数越大越好,400细分的意思就是:400个脉冲电机转动1圈)



    2.电流大小设定

    驱动板上拨码开关4、5、6分别对应S4、S5、S6. 

    (这里需要注意的是并不是设置电流越大越好,根据电机的功率取合适值即可)





    四、脱机信号(EN)

    打开脱机功能后,电机转子处于自由不锁定状态,可以轻松转动,此时 输入脉冲信号不响应,
    关闭此信号后电机接受脉冲信号正常运转。
    注:一般在实际应用中可不接。 



    五、常见的问题解答

    1、问:初次使用该步进驱动器,如何能尽快上手?

     答:正确接好电源和电机后,只接脉冲信号PUL(先将频率设置为1K以内),细分设置为16,方向和脱机悬空,
    此时加电后电机默认正转。运行无误后再 依次测试加速(提高频率)、方向、细分和脱机等功能。

    2、问:控制信号高于5V,一定要加串联电阻吗?

     答:是的,否则有可能烧毁驱动器控制接口的电路。

    3、问:接线后电源指示灯亮,但电机不转,是什么原因?

     答:如果接线正确,但仍然不转,说明控制部分驱动能力不够,这种情况多出现在
    用单片机的io口直接控制方式。请确保控制接口有5mA的驱动能力

    4、问:如何判断步进电机四条线的定义?
     答:将电机的任意两条线接在一起,此时用手拧电机转子有阻力,则这两条线是同一相,
    可接在驱动器A+、A-;另外两条线短接仍然有阻力,则将 这两条线接在B+和B-

    5、问:电机的正反转情况与应实际达到的相反? 
    答:只需要把电机其中一相的两根线互换接入即可 


    六、自己本人在实践中遇到的问题以及解决

    只是根据实验尝试而得,并不一定正确

    1.电机旋转电流吱吱声音过大  PWM频率过低 改变方法提高频率或者减少细分数
    2.驱动器自动断电时 设置电流过大,应该降低设置电流 
    3.电流设置会影响转速
    4.电机过烫,设置的电流过大,应该降低设置电流
    5.ENA-和ENA+不接,这是脱机信号控制
    6.PWM输出都采用开漏输出,需要外接上拉5V,不然没有PWM输出
    7.当选择电机转速较慢时,应该选择更多的细分数



    注:还有的一点需要注意的是我为什么采用开漏输出模式,外接上拉信号到5V。设计运用中当遇到大一点的步进电机时
    它的驱动器默认信号是5v以上至少5v(这个在拿到步进电机驱动器时可以看到)。单片机如果不设置为开漏输出外接上拉到5v的话,
    单片机输出的3.3V信号,有些驱动器根本就不认这个信号。








    展开全文
  • 步进电机的应用非常广泛,在各种设备中经常会遇到,而步进电机的驱动则是使用步进电机必不可少的部分,可以有多种方式来实现步进电机的驱动,在这里我们来考虑一下基于TMC2660驱动芯片的步进电机驱动。 1、功能概述...

    步进电机的应用非常广泛,在各种设备中经常会遇到,而步进电机的驱动则是使用步进电机必不可少的部分,可以有多种方式来实现步进电机的驱动,在这里我们来考虑一下基于TMC2660驱动芯片的步进电机驱动。

    1、功能概述

    TMC2660是德国TRINAMIC公司产的步进电机驱动芯片。TMC2660驱动器提供了业界领先的功能集,包括高分辨率微步、无传感器机械负载测量、负载自适应功率优化和低共振斩波操作。拥有标准SPI和STEP/DIR两种接口模式。集成功率MOSFET处理电机电流高达2.2A。集成的保护和诊断功能支持稳健和可靠的运行。其结构图如下:

    TMC2660的参数配置通过SPI接口来实现。TMC2660具有5个配置和控制寄存器,通过SPI端口来访问这些寄存器。这些寄存器的结构定义如下所示:

    所有的寄存器都是20位,在最高的2位或3位表示的是寄存器地址也称为操作码。根据具体的寄存器我们选择不同的操作码实现对寄存器的写操作。每一个写操作都会有一个20位的数据返回。而返回数据的内容可以通过修改配置寄存器来定义。具体的格式如下图所示:

    2、驱动设计于实现

    我们已经了解了TMC2660步进电机驱动芯片的基本技术参数,接下来我们就需要据此来实现TMC2660步进电机驱动芯片的驱动程序的设计与实现。

    2.1、对象定义

    我们依然是居于对象来实现相关的操作。所以我们首先要定义对象,出于适用性考虑,我们要定义对象的类型并将具体的对象实例化,接下来我们就来抽象对象类型和实例化对象的操作。

    2.1.1、对象的抽象

    对于一个对象最主要包括属性与操作两方面内容,所以我们先来考虑TMC2660对象具有哪些属性和操作,并抽象出较为通用的TMC2660对象类型。

    对于步进电机的驱动都具有哪些属性呢?我们考虑到一台步进电机至少具备启停控制命令、方向控制命令、速度设定以及运行状态等,这些对于每一台步进电机来说,在不同的设置下代表不同的状态,所以我们将其作为其属性来处理。此外,与具体的电机相关的参数如固有步距角、微步设置及当前脉冲频率等。以及与TMC2660相关的状态、寄存器的值、速度规划等都与具体的应用需求相关、用以记录其运行和配置状态,所以我们将其作为属性。

    然后再来看一看TMC2660对象需要实现的操作。对于TMC2660对象来说,我们要操作它,需要向其发送和读取数据,需要操作片选信号和使能信号,而这些行为依赖于具体的操作平台,所以我们将其作为对象的操作来设定。TMC2660可以工作在SPI模式或者SD模式,而在SD模式时,存在脉冲和方向的控制,这同样依赖于具体的软硬件操作平台,所以我们也将其作为对象的操作来实现。更具以上的分析我们可以抽象出TMC2660对象类型如下:

    /*定义TMC2660对象类型*/
    typedef struct TMC2660Object {
        float microStep; //微步设置
        float stepAngle; //固有步进角
        float frequency;    //运行频率
        uint16_t *pStartStop;   //启停操作命令
        uint16_t *pDirection;   //方向控制
        uint16_t *pRotateSet;   //转速设定
        uint16_t *pMotorState;  //电机状态
       
        uint32_t status;        //TMC通讯返回状态
        uint32_t Register[5];    //寄存器
        void (*WriteRead)(uint8_t *wData,uint16_t wSize,uint8_t *rData,uint16_t rSize);
        void (*ChipSelcet)(TMC2660CSType cs);   //片选信号
        void (*StartStop)(TMC2660SSType ss);    //启停操作函数
        void (*Direct)(TMC2660DIRType dir);     //方向操作函数
        void (*Enable)(TMC2660ENNType enn);     //使能操作函数
    
        CurveObjectType curve;          //电机调速曲线
    }TMC2660ObjectType;

    2.1.2、对象初始化

    我们定义了对象类型,可以实现基于对象的操作,但定义的对象变量需要进行初始化才能让不同的对象按照我们的配置的方式去运行。所以在开始对象的使用之前我们先对其进行初始化,具体的初始化函数如下:

    /*初始化TMC2660对象*/
    void Tmc2660Initialization(TMC2660ObjectType *tmc,       //待初始化的TMC对象变量
                           TMC2660SdoffType interface,      //驱动接口类型
                           TMC2660MicroStepType microStep,  //微步设置
                           uint16_t Power,                  //电流量程
                           uint16_t stepAngle,                  //固有步进角
                           uint16_t *pStartStop,            //启停操作命令
                           uint16_t *pDirection,            //方向控制
                           uint16_t *pRotateSet,            //转速设定
                           uint16_t *pMotorState,           //电机状态
                           TMC2660WriteReadType writeRead,  //读写函数指针
                           TMC2660ChipSelcetType cs,        //片选操作函数指针
                           TMC2660StartStopType startStop,  //启停操作函数指针
                           TMC2660DirectType direct,        //方向设置函数指针
                           TMC2660EnableType enable         //使能控制函数指针
                           )
    {
        uint32_t MicroStep[9]={0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x01,0x00};
        uint16_t MicroStepNum[9]={1,2,4,8,16,32,64,128,256};
       
        if((tmc==NULL)||(writeRead==NULL)||(cs==NULL)||(enable==NULL))
        {
            return;
        }
       
        tmc->WriteRead=writeRead;
        tmc->ChipSelcet=cs;
        tmc->StartStop=startStop;
        tmc->Direct=direct;
        tmc->Enable=enable;
       
        tmc->pStartStop=pStartStop;
        tmc->pDirection=pDirection;
        tmc->pRotateSet=pRotateSet;
        tmc->pMotorState=pMotorState;
       
        tmc->microStep=MicroStepNum[microStep];
        tmc->stepAngle=(float)stepAngle/10.0;
       
        tmc->curve.stepSpeed=0.02;
        tmc->curve.currentSpeed=0;
        tmc->curve.startSpeed=0;
        tmc->curve.speedMax=300;
        tmc->curve.speedMin=1.0;
        tmc->curve.curveMode=CURVE_SPTA;
        tmc->curve.flexible=10.0;
    
        tmc->Register[Reg_DRVCTRL]=DRVCTRL;
        tmc->Register[Reg_CHOPCONF]=CHOPCONF;
        tmc->Register[Reg_SMARTEN]=SMARTEN;
        tmc->Register[Reg_SGCSCONF]=SGCSCONF;
        tmc->Register[Reg_DRVCONF]=DRVCONF;
       
        tmc->Register[Reg_CHOPCONF]=tmc->Register[Reg_CHOPCONF]|0x1B1;
        tmc->Register[Reg_SMARTEN]=tmc->Register[Reg_SMARTEN]|0x202;
        tmc->Register[Reg_SGCSCONF]=tmc->Register[Reg_SGCSCONF]|0x10000;
       
        WriteReadTmc2660Register(tmc,Reg_CHOPCONF);
        WriteReadTmc2660Register(tmc,Reg_SGCSCONF);
       
        if(interface==TMC2660_SPI)
        {
            tmc->Register[Reg_DRVCONF]=tmc->Register[Reg_DRVCONF]|0xA190;
            WriteReadTmc2660Register(tmc,Reg_DRVCONF);
        }
        else
        {
            tmc->Register[Reg_DRVCONF]=tmc->Register[Reg_DRVCONF]|0xA140;
            WriteReadTmc2660Register(tmc,Reg_DRVCONF);
           
            tmc->Register[Reg_DRVCTRL]=tmc->Register[Reg_DRVCTRL]|0x100|MicroStep[microStep];
            WriteReadTmc2660Register(tmc,Reg_DRVCTRL);
        }
      
        WriteReadTmc2660Register(tmc,Reg_SMARTEN);
       
        SetMotorPower(tmc,Power);
    }

    2.2、对象操作

    接下来我们考虑对TMC2660进行的操作问题。我们已经知道TMC2660拥有5个寄存器,而对TMC2660的各种配置都是通过这5个寄存器来实现的。即使使用SD模式来实现电机驱动也是通过寄存器配置才能实现,所以对TMC2660基本的操作则是读写TMC2660寄存器。至于SD模式下,输入脉冲和方向信号依赖于具体平台,我们已将其定义为对象的回调函数。

    /*读写寄存器*/
    static void WriteReadTmc2660Register(TMC2660ObjectType *tmc,TMC2660RegType reg)
    {
        uint8_t wData[3];
        uint8_t rData[3];
        uint32_t status=0;
        uint32_t regValue;
       
        tmc->ChipSelcet(TMC2660CS_Enable);
       
        regValue=tmc->Register[reg]&0xFFFFF;
        wData[0]=(uint8_t)(regValue>>16);
        wData[1]=(uint8_t)(regValue>>8);
        wData[2]=(uint8_t)regValue;
       
        tmc->WriteRead(wData,3,rData,3);
       
        status=rData[0];
        status=(status<<8)+rData[1];
        status=(status<<8)+rData[2];
       
        tmc->status= status;
       
        tmc->ChipSelcet(TMC2660CS_Disable);
    }

    3、驱动的应用

    我们已经设计并实现了TMC2660步进电机驱动芯片的驱动程序,接下来我们实现一个实例来验证这一驱动设定是否符合要求。

    3.1、声明并初始化对象

    在开始一切操作之前,首先我们需要一个对象。前面的设计中,我们已经定义了一个TMC2660对象类型,所以我们使用它定义一个对象变量。

    TMC2660ObjectType tmc;

    定义了tmc对象变量之后,还没有办法使用,因为我们需要对其进行初始化。前面我们已经设计了对象初始化函数,我们需要使用它来初始化tmc对象变量。初始化函数需要如下参数:

    TMC2660ObjectType *tmc,          //待初始化的TMC对象变量

    TMC2660SdoffType interface,      //驱动接口类型

    TMC2660MicroStepType microStep,  //微步设置

    uint16_t Power,                  //电流量程

    uint16_t stepAngle,               //固有步进角

    uint16_t *pStartStop,            //启停操作命令

    uint16_t *pDirection,            //方向控制

    uint16_t *pRotateSet,            //转速设定

    uint16_t *pMotorState,           //电机状态

    TMC2660WriteReadType writeRead,  //读写函数指针

    TMC2660ChipSelcetType cs,        //片选操作函数指针

    TMC2660StartStopType startStop,  //启停操作函数指针

    TMC2660DirectType direct,        //方向设置函数指针

    TMC2660EnableType enable         //使能控制函数指针

    在这些参数中,操作变量将具体的变量指针传入即可,而其它参数如接口类型,步距角等则根据具体的应用情况输入即可。需要注意的是,5歌操作函数指针,其函数原型定义如下:

    typedef void (*TMC2660WriteReadType)(uint8_t *wData,uint16_t wSize,uint8_t *rData,uint16_t rSize);
    typedef void (*TMC2660ChipSelcetType)(TMC2660CSType cs);     //片选信号
    typedef void (*TMC2660StartStopType)(TMC2660SSType ss);        //启停操作函数
    typedef void (*TMC2660DirectType)(TMC2660DIRType dir);     //方向操作函数
    typedef void (*TMC2660EnableType)(TMC2660ENNType enn);     //使能操作函数

    这些操作函数依赖于具体的操作平台,我们采用的是已于STM32F103CBT6和HAL库函数的操作平台,所以根据函数原型定义来收集这些函数如下:

    /*TMC2660片选操作函数*/
    static void TMC2660ChipSelcet(TMC2660CSType cs)
    {
        if(cs==TMC2660CS_Enable)
        {
            TMC_CSN_ENABLE();
        }
        else
        {
            TMC_CSN_DISABLE();
        }
    }
    
    /*启停操作函数*/
    static void MotorStartStop(TMC2660SSType ss)
    {
        if(ss==TMC2660SS_Start)
        {
            if(HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_3) != HAL_OK)
            {
            }
        }
        else
        {
            if(HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_3) != HAL_OK)
            {
            }
        }
    }
    
    /*方向操作函数*/
    static void MotorDirect(TMC2660DIRType dir)
    {
        if(dir==TMC2660DIR_CCW)
        {
            TMC_DIR_DISABLE();
        }
        else
        {
            TMC_DIR_ENABLE();
        }
    }
    
    /*使能操作函数*/
    static void TMC2660Enable(TMC2660ENNType enn)
    {
        if(enn==TMC2660ENN_Enable)
        {
            TMC_ENN_ENABLE();
        }
        else
        {
            TMC_ENN_DISABLE();
        }
    }
    
    /*通过SPI2端口读写数据*/
    static void WriteReadBySPI2(uint8_t *wData,uint16_t wSize,uint8_t *rData,uint16_t rSize)
    {
        HAL_SPI_TransmitReceive (&hspi2, wData, rData, wSize, 1000);
    }

    至此,我们已经明白了初始化函数所需要的全部参数,我们可以使用改初始换函数初始化tmc对象变量如下:

    /*初始化TMC2660对象*/
        Tmc2660Initialization(&tmc,
                              TMC2660_SD,
                              MicroStep_256,
                              aPara.phyPara.sm42PowerRange,
                              aPara.phyPara.sm42StepAngle,
                              &aPara.phyPara.sm42StartStop,
                              &aPara.phyPara.sm42Direction,
                              &aPara.phyPara.sm42RotateSet,
                              &aPara.phyPara.sm42RunStatus,
                              WriteReadBySPI2,
                              TMC2660ChipSelcet,
                              MotorStartStop,
                              MotorDirect,
                              TMC2660Enable
                                  );

    3.2、基于对象进行操作

    初始化之后,我们就可以使用该对象来事项我们想要的操作了。我们设计一个应用函数调用相关驱动实现操作,并判断速度的设定是否改变来决定是否调整电机的运行速度。

    /* 步进电机驱动控制处理函数 */
    void SM42Tmc2660Driver(void)
    {
        float temp=0;
           
        if(aPara.phyPara.sm42RotateSet<=0)
        {
            //return;
          aPara.phyPara.sm42StartStop=0;
        }
       
        Tmc2660ControlBySD(&tmc);
       
        SpeedSet(tmc.frequency);
       
        //计算转速
        temp=tmc.frequency*((float)aPara.phyPara.sm42StepAngle);
        temp=temp/((float)aPara.phyPara.sm42MicroStep);
        aPara.phyPara.sm42RotateSpeed=(uint16_t)(temp*100/30.0);
    }
    
    /* 速度调整函数 */
    static void SpeedSet(float freq)
    {
        uint16_t period=0;
        float temp=24000000;
       
        if(freq>0)
        {
            temp=temp/freq;
            period=(uint16_t)temp;
           
            if((2<=period)&&(period<65535))
            {
                __HAL_TIM_SET_AUTORELOAD(&htim1,period-1);
                __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_3,period/2-1);
            }
        }
        else
        {
            __HAL_TIM_SET_AUTORELOAD(&htim1,0);
            __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_3,0);
        }
    }

    4、应用总结

    在本篇中,我们设计并实现了TMC2660的驱动程序,并基于驱动程序设计了一个验证程序,测试结果良好。事实上,该驱动已经使用到我们的多个项目之中,运行效果目前还是不错的。

    在使用驱动程序时需要注意,片选信号并非必须实现。因为有些时候我们可能需要在硬件上直接将其选中,此时添加片选操作函数是没有什么意义的,我们可以在初始化时传入NULL来完成。

    在配置TMC2660的寄存器时,一定要仔细根据自己的应用需求来配置,如电流保护、波形输出等这些参数的配置对力矩以及电机的运行噪声有很大关系,所以需要特别注意。

    欢迎关注:

     

    展开全文
  • 步进电机无法直接接到直流或交流电源上工作,必须使用专用的驱动电源步进电机驱动器。 步进电机是一种感应电机,它的工作原理是利用电子电路,将直流电变成分时供电的,多相时序控制电流,用这种电流为步进电机供电,...
  • 步进电机驱动控制系统由控制电路、驱动电路和步进电机三部分组成。其主要功能如下:(1) 控制电路:用于产生脉冲,控制电机的速度和方向。(2) 驱动电路:根据控制器输入的脉冲和方向信号,为步进电机各绕组提供正确的...
  • 总线步进电机驱动器开发注意事项实物图:1.使用PusiDebugTool软件连接pmc006 步进电机驱动器,首先读取所有参数,然后修改站点地址,点击保存,再点击掉电保存。2.控制器重新上电,使用PusiDebugTool软件连接pmc006 ...
  • Trinamic 的双轴步进电机驱动器 IC 集成了 MOSFET 电源开关,适合各种各样的应用Trinamic 宣布推出集成了 MOSFET 电源开关的双轴步进电机驱动器 IC。TMC2041 可在 26 V 电压下提供每台电机 1.5 A 的电流(峰值),也...
  • 步进电机驱动器因为遭受本身生产制造加工工艺的限定,如步距角的大小由电机转子齿数和运作拍数决策,但电机转子齿数和运作拍数是比较有限的,因而步距角一般很大而且是固定不动的,屏幕分辨率低、欠缺协调能力、在低...
  • 步进电机驱动.zip

    2019-09-03 08:47:09
    步进电机驱动,完美单脉冲模式,超级方便的驱动,步进电机驱动

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,312
精华内容 1,724
关键字:

步进电机驱动