从零开始的单片机学习(十二)

本文深入介绍了直流电机和步进电机的基本概念、类型及特性,包括电机的工作原理、接线方法、驱动问题以及实验现象。针对步进电机,详细阐述了步进电机的步距角、相数、细分和驱动架构,并通过单相四拍、双相四拍及半步八拍的驱动时序展示了如何通过编程控制电机的转动。最后,分析了开发板上的电机驱动电路和编程实践,为实际操作提供了指导。
摘要由CSDN通过智能技术生成

十二、直流电机和步进电机
    1、直流电机
        a、什么是电机
            电机就是一种将电能转化为动能和热能的装置。

        b、常见电机
            (1)交流电机:两相、三相
                小功率的都是两相电机一般家用的
                大功率的都是三相电机,譬如工厂、高铁上用的是三相电机。
            (2)直流电机:永磁、励磁
            (3)步进电机、伺服电机
                这类电机可以进行精确控制,其精度比微米还要小。一般用在高精度机床上,譬如数控机床。

        c、直流电机详解
            (1)外观
            (2)接线和工作原理
            (3)直流电机的驱动问题:不能用IO口直接驱动

        d、直流电机实验
            (1)直流电机直接接在开发板的VCC和GND插针上看电机是否转动,还可以调换位置看看电机是否反转
                实验结果,开发板只要接电(甚至不用开开关)电机就转,反接后用小扇叶作指示发现反转了。
            (2)单片机的IO口是数字口,本身的驱动能力很小(最多20mA级别),这个驱动能力是带不动电动机
         的。实验结果:单片机IO引脚不能直接驱动直流电机转动。
             (3)一般单片机需要使用专门的驱动芯片来驱动电机。驱动芯片的作用就是把单片机的小电流的控制信号
         转成逻辑上相同的大电流的驱动源。这就是所谓的弱电控制强电。用电机驱动芯片来驱动直流电机,具体的电
         路分析后面学习步进电机时再具体学习。

    2、步进电机理论1
        a、什么是步进电机:步进电机是一种直接将电脉冲转化为机械运动的机电装置,通过控制施加在电机线圈上
           的电脉冲顺序、频率和数量,可以实现对步进电机的转向、速度和旋转角度的控制。在不借助带位置感应
           的闭环反馈控制系统的情况下,使用步进电机与配套的驱动器共同组成的控制简便、低成本的开环控制系
           统,就可以实现精确的位置和速度控制。
            (1)外观:在开发板套餐中双极性步进电机是一个小圆柱形中间一个主轴,一端有四个接线插针,通过
         PCB引出来,五线四相的步进电机相对双极性的步进电机大很多,外观基本就是其放大版。
            (2)功能特点:可以精准控制转动的距离,在其精度范围内可以准确控制转动的角度。
            (3)操作接口:有很多种的接口,有3PIN的有4PIN的,也有5PIN的,根据功能和需求的不同有不同的
         操作接口。

        b、步距角
            (1)步进电机有一个固有的步距角,这个参数和步进电机本身有关。
            (2)步进电机一般情况下只能以固有步距角的整数倍来运动,这一个固有步距角的移动就叫一个节拍。
            (3)电机还有个可以比固有步距角更小的运动方法,这种方法叫细分,有电机驱动器来支持。

        c、相数
            步进电机的相数是指电机内部的线圈组数,目前常用的有二相、三相、四相、五相步进电机。电机相数不
         同,其步距角也不同,一般二相电机的步距角为0.9°/1.8°、三相的为0.75°/1.5°等、五相的为0.36°/
         0.72°。在没有细分驱动器时,用户主要靠选择不同相数的步进电机来满足自己步距角的要求。如果使用细分
         驱动器,那么“相数”将变得没有意义,用户只需要在驱动器上改变细分数,就可以改变步距角。
             开发板配套的双极性步进电机是二相的。

        d、细分
            步进电机细分控制是指对步距角再进行详细的分步控制。譬如,对一个步距角为1.8°的两相四拍电机进行
         四细分控制,就是使得电机转动一步是1.8除以4,也就是0.45°来运转。 对于步进电机来说细分功能完全是
         由外部驱动电路精确控制电机的相电流产生的,和具体电机无关。步进电机的细分控制是通过等角度有规律的
         插入大小相等的电流合成向量,从而减小合成磁势的角度(步距角),从而达到细分目的。

    3、    步进电机理论2
        a、极性:单极性(unipolar)和双极性(bipolar)是步进电机最常用的两种驱动架构。
            (1)单极性驱动电路使用四颗晶体管来驱动步进电机的两相相位,电机结构则包含两组带有中间抽头的
         线圈,整个电机共有六条线与外界相连。这类电机有的时候又称为四相电机,但这种说法不正确有会让人混淆
         ,因为其本质上只有两个相位,准确的说是双相位六线式步进电机。六线式步进电机虽然称其为单极性步进电
         机,实际上却可以同时使用单极性或者双极性的驱动电路。
             (2)双极性步进电机则会使用8颗晶体管来驱动两组相位。双极性驱动电路可以同时驱动四线式或六线式
         步进电机,虽然四线式只能使用双极性驱动电路,但是却可以大幅度降低量产型应用的成本。双极性步进电机
         驱动的晶体管数目是单极性驱动电路的两倍,其中四颗下端晶体管通常是由微控制器直接驱动,上端晶体管则
         需要成本较高的上端驱动电路。双极性驱动电路的晶体管只需要承受电机电压,所以它不像单极性驱动电路一
         样需要钳位电路。

        b、拍数:完成一个磁场周期性变化所需脉冲数或导电状态用n表示,或指电机转过一个齿距角所需脉冲数,以
         四相电机为例,有四相四拍运行方式即AB-BC-CD-DA- AB,
                         四相八拍运行方式即 A-AB-B-BC-C-CD-D-DA-A。
            (1)单相通电四拍驱动时序
                正转:A-,B,A,B-
                反转:B-,A,B,A-
            (2)双相通电四拍驱动时序
                正转:A-B,AB,AB-,A-B-
                反转:A-B-,AB-.AB.A-B
            (3)半步八拍驱动时序
                正转:A-,A-B,B,AB,A,AB-,B-,A-B-
                反转:A-B-,B-,AB-,A,AB,B,A-B,A-
            (4)节拍驱动时序解释,以单相通电四拍为例
                四根线: A     A-     B     B-
                电平:     0     1     0     0         第一拍
                         0     0     1     0         第二拍
                         1     0     0     0         第三拍
                         0     0     0     1         第四拍
                4个节拍加在一起就是一个完整的周期。按照这个周期给步进电机供电,则步进电机就会转动一个步
             距角。正转和反转的时序是完全相反的,无论什么拍数要反转只需要将正转的节拍时序倒过来即可。
                 其他拍数的驱动时序以同样的方式理解即可。双相四拍比单相四拍的动力更强,但是更耗电,半步八
             拍是二者的折中方案。

        c、控制器和驱动器
            (1)一套步进电机的系统分为三部分:控制器+驱动器+步进电机
            (2)一般情况下,控制器就是单片机,驱动器一般是接在单片机IO口上的专用驱动芯片。(譬如开发板
         上的是TC1508S)
             (3)控制器负责产生时序信号,驱动器负责将时序信号转成功率驱动信号来驱动步进电机。

    4、开发板原理图分析说明
        a、原理图分析
            (1)原理图中INA、INB、INC、IND要接单片机的IO口,单片机是做控制器的,通过单片机的IO口给
         驱动器芯片输入1或者0的控制信号,控制信号经过TC1508S的转换,从OUTA、OUTB、OUTC、OUTD四个引
         脚输出具有驱动步进电机能力的驱动信号。
             (2)接线:譬如可以用P0端口的4个引脚(实际用P0.0~P0.3)接INA、INB、INC、IND。
             (3)输出端本来符号是OUTA、OUTB、OUTC、OUTD,但是有的开发板上实际丝印的符号是A-、A+、
         B-、B+。这里面的对印关系是按照顺序依次对应的,接线不能接错了,不然电机就不能正常工作了。
             (4)丝印符号改变主要是为了对应步进电机上面的符号,让我们方便接线,不会接错。
             (5)结合之前讲的步进电机的原理可知:A-和A+是一个相线线圈的两端,而B-和B+是另一个线圈的两
         端。

        b、电机驱动芯片数据手册

    5、步进电机编程实践1
        a、接线
            (1)单片机P0端口的P0.0~P0.3接电机驱动芯片TC1508S的四个输入端
            (2)TC1508S的输出端接步进电机(按照丝印符号相对应即可)
            (3)根据上面的接线,实际的接线逻辑是:P0.0和P0.1对应一组线圈,而P0.2和P0.3对应另一组线
         圈。

        b、单相四拍方式驱动
            (1)时序编程:A-,B,A,B-
                代码:
                    #include <REGX51.H>

                    sbit Apos = P0^0;
                    sbit Aneg = P0^1;
                    sbit Bpos = P0^2;
                    sbit Bneg = P0^3;

                    void delay(unsigned int t);
                    void main(void)
                    {
                        while(1)
                        {
                            //循环内实现一个周期
                            //一个周期其实就是各个节拍依次排列构成的,注意节拍之间要有延时
                            
                            //单相四拍
                            //第一拍
                            Apos = 0;
                            Aneg = 1;
                            Bpos = 0;        //B正负极只要电平一样即可,全为1和全为0效果相同
                            Bneg = 0;
                            delay(50);
                            
                            //第二拍
                            Apos = 1;
                            Aneg = 0;
                            Bpos = 0;        
                            Bneg = 0;
                            delay(50);
                            
                            //第三拍
                            Apos = 0;
                            Aneg = 0;
                            Bpos = 0;        
                            Bneg = 1;
                            delay(50);
                            
                            //第四拍
                            Apos = 0;
                            Aneg = 0;
                            Bpos = 1;        
                            Bneg = 0;
                            delay(50);
                        }
                    }
                    void delay(unsigned int t)
                    {
                        while(t--)
                        {
                            unsigned char i = 2;
                            unsigned char j = 239;
                            do
                            {
                                while(--j);
                            }while(--i);        
                        }
                    }
            (2)转速控制:转速是由脉冲信号的频率控制的,其实就是delay的时间
            (3)正转与反转

    6、步进电机编程实践2
        a、双相四拍
            代码:
                #include <REGX51.H>

                #define speed 30
                sbit Apos = P0^0;
                sbit Aneg = P0^1;
                sbit Bpos = P0^2;
                sbit Bneg = P0^3;

                void delay(unsigned int t);
                void main(void)
                {
                    while(1)
                    {
                        //循环内实现一个周期
                        //一个周期其实就是各个节拍依次排列构成的,注意节拍之间要有延时
                        
                        //双相四拍:A-B,AB,AB-,A-B-
                        //第一拍
                        Apos = 0;
                        Aneg = 1;
                        Bpos = 1;        //B正负极只要电平一样即可,全为1和全为0效果相同
                        Bneg = 0;
                        delay(speed);
                        
                        //第二拍
                        Apos = 1;
                        Aneg = 0;
                        Bpos = 1;        
                        Bneg = 0;
                        delay(speed);
                        
                        //第三拍
                        Apos = 1;
                        Aneg = 0;
                        Bpos = 0;        
                        Bneg = 1;
                        delay(speed);
                        
                        //第四拍
                        Apos = 0;
                        Aneg = 1;
                        Bpos = 0;        
                        Bneg = 1;
                        delay(speed);
                    }
                }
                void delay(unsigned int t)
                {
                    while(t--)
                    {
                        unsigned char i = 2;
                        unsigned char j = 239;
                        do
                        {
                            while(--j);
                        }while(--i);        
                    }
                }

        b、半步八拍
            代码:
                #include <REGX51.H>

                #define speed 30
                sbit Apos = P0^0;
                sbit Aneg = P0^1;
                sbit Bpos = P0^2;
                sbit Bneg = P0^3;

                void delay(unsigned int t);
                void main(void)
                {
                    while(1)
                    {
                        //循环内实现一个周期
                        //一个周期其实就是各个节拍依次排列构成的,注意节拍之间要有延时
                        
                        //半步八拍:A-,A-B,B,AB,A,AB-,B-,A-B-
                        //第一拍
                        Apos = 0;
                        Aneg = 1;
                        Bpos = 0;        //B正负极只要电平一样即可,全为1和全为0效果相同
                        Bneg = 0;
                        delay(speed);
                        
                        //第二拍
                        Apos = 0;
                        Aneg = 1;
                        Bpos = 1;        
                        Bneg = 0;
                        delay(speed);
                        
                        //第三拍
                        Apos = 0;
                        Aneg = 0;
                        Bpos = 1;        
                        Bneg = 0;
                        delay(speed);
                        
                        //第四拍
                        Apos = 1;
                        Aneg = 0;
                        Bpos = 1;        
                        Bneg = 0;
                        delay(speed);
                        
                        //第五拍
                        Apos = 1;
                        Aneg = 0;
                        Bpos = 0;        //B正负极只要电平一样即可,全为1和全为0效果相同
                        Bneg = 0;
                        delay(speed);
                        
                        //第六拍
                        Apos = 1;
                        Aneg = 0;
                        Bpos = 0;        
                        Bneg = 1;
                        delay(speed);
                        
                        //第七拍
                        Apos = 0;
                        Aneg = 0;
                        Bpos = 0;        
                        Bneg = 1;
                        delay(speed);
                        
                        //第八拍
                        Apos = 0;
                        Aneg = 1;
                        Bpos = 0;        
                        Bneg = 1;
                        delay(speed);
                    }
                }
                void delay(unsigned int t)
                {
                    while(t--)
                    {
                        unsigned char i = 2;
                        unsigned char j = 239;
                        do
                        {
                            while(--j);
                        }while(--i);        
                    }
                }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值