• 凌乱的DSP笔记(6)-直流电机&步进电机


    1. 直流电机介绍

    直流电机是指能将直流电能转换成机械能(直流电动机)或将机械能转换成直流电能(直流发电机)的旋转电机。它是能实现直流电能和机械能互相转换的电机。

    2. 硬件设计

    imageimage

    image

    TC1508S:

    image

    image

    Hi-Z(高阻态):数字电路常见术语,指的是电路的一种输出状态,既不是高电平也不是低电平,如果高阻态再输入下一级电路的话,对下级电路无任何影响,相当于没接。

    3. 软件设计

    3.1 dc_motor

    /*
     * dc_motor.c
     *
     *  Created on: 2020-4-8
     *      Author: Administrator
     */
    
    
    #include "dc_motor.h"
    
    
    void DC_Motor_Init(void)
    {
        EALLOW;
        SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;// 开启GPIO时钟
        //DC_MOTOR 第1路端口配置
        GpioCtrlRegs.GPAMUX1.bit.GPIO2=0;
        GpioCtrlRegs.GPADIR.bit.GPIO2=1;
    
        GpioCtrlRegs.GPAMUX1.bit.GPIO3=0;
        GpioCtrlRegs.GPADIR.bit.GPIO3=1;
    
        //DC_MOTOR 第2路端口配置
        GpioCtrlRegs.GPAMUX1.bit.GPIO4=0;
        GpioCtrlRegs.GPADIR.bit.GPIO4=1;
    
        GpioCtrlRegs.GPAMUX1.bit.GPIO5=0;
        GpioCtrlRegs.GPADIR.bit.GPIO5=1;
    
        EDIS;
    
        GpioDataRegs.GPACLEAR.bit.GPIO2=1;
        GpioDataRegs.GPACLEAR.bit.GPIO3=1;
        GpioDataRegs.GPACLEAR.bit.GPIO4=1;
        GpioDataRegs.GPACLEAR.bit.GPIO5=1;
    }
    /*
     * dc_motor.h
     *
     *  Created on: 2020-4-8
     *      Author: Administrator
     */
    
    #ifndef DC_MOTOR_H_
    #define DC_MOTOR_H_
    
    
    #include "DSP2833x_Device.h"     // DSP2833x 头文件
    #include "DSP2833x_Examples.h"   // DSP2833x 例子相关头文件
    
    
    #define DC_MOTOR_INA_SETH            (GpioDataRegs.GPASET.bit.GPIO2=1)
    #define DC_MOTOR_INA_SETL            (GpioDataRegs.GPACLEAR.bit.GPIO2=1)
    #define DC_MOTOR_INB_SETH            (GpioDataRegs.GPASET.bit.GPIO3=1)
    #define DC_MOTOR_INB_SETL            (GpioDataRegs.GPACLEAR.bit.GPIO3=1)
    
    #define DC_MOTOR_INC_SETH            (GpioDataRegs.GPASET.bit.GPIO4=1)
    #define DC_MOTOR_INC_SETL            (GpioDataRegs.GPACLEAR.bit.GPIO4=1)
    #define DC_MOTOR_IND_SETH            (GpioDataRegs.GPASET.bit.GPIO5=1)
    #define DC_MOTOR_IND_SETL            (GpioDataRegs.GPACLEAR.bit.GPIO5=1)
    
    void DC_Motor_Init(void);
    
    #endif /* DC_MOTOR_H_ */

    3.2 main.c

    /*
     * main.c
     *
     *  Created on: 2020年4月8日
     *      Author: lenovo
     */
    
    #include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
    #include "DSP2833x_Examples.h"   // DSP2833x Examples Include File
    #include "leds.h"
    #include "key.h"
    #include "dc_motor.h"
    
    /*******************************************************************************
    * 函 数 名         : main
    * 函数功能           : 主函数
    * 输    入         : 无
    * 输    出         : 无
    *******************************************************************************/
    void main()
    {
        int i=0;
        char key=0;
    
        InitSysCtrl();
    
        LED_Init();
        KEY_Init();
        DC_Motor_Init();
    
        while(1)
        {
            key=KEY_Scan(0);
            switch(key)
            {
                case KEY1_PRESS: DC_MOTOR_INA_SETH;DC_MOTOR_INB_SETL;break;
                case KEY2_PRESS: DC_MOTOR_INA_SETL;DC_MOTOR_INB_SETH;break;
                case KEY3_PRESS: DC_MOTOR_INA_SETL;DC_MOTOR_INB_SETL;break;
            }
    
            i++;
            if(i%2000==0)
            {
                LED1_TOGGLE;
            }
            DELAY_US(100);
        }
    }

    如果驱动电流不足,可使用50%占空比方波驱动:

    void main()
    {
        int i=0;
        char key=0;
        char flag=0;
        InitSysCtrl();
    
        LED_Init();
        KEY_Init();
        DC_Motor_Init();
    
        while(1)
        {
            key=KEY_Scan(0);
            switch(key)
            {
                case KEY1_PRESS: flag=1;break;
                case KEY2_PRESS: flag=2;break;
                case KEY3_PRESS: flag=0;break;
            }
            if(flag==1)
            {
                DC_MOTOR_INB_SETL;
                if(i%2==0)
                    DC_MOTOR_INA_SETH;
                else
                    DC_MOTOR_INA_SETL;
            }
            else if(flag==2)
            {
                DC_MOTOR_INA_SETL;
                if(i%2==0)
                    DC_MOTOR_INB_SETH;
                else
                    DC_MOTOR_INB_SETL;
            }
            else if(flag==0)
            {
                DC_MOTOR_INA_SETL;
                DC_MOTOR_INB_SETL;
            }
    
            i++;
            if(i%2000==0)
            {
                LED1_TOGGLE;
            }
            DELAY_US(100);
        }
    }

    4. 效果

    因为启动时电流不足,还需要手动拨一下Crying face

    5. 步进电机介绍

    步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。在非超载情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机加一个脉冲信号,电机则转过一个步距角。这一线性关系的存在,加上步进电机只有周期性的误差而无累积误差等特点,使得步进电机在速度、位置等控制领域的控制操作非常简单。虽然步进电机应用广泛,但它并不像普通的直流和交流电机那样在常规状态下使用, 它必须由双环形脉冲信号、 功率驱动电路等组成控制系统方可使用。因此用好步进电机也非易事,它涉及机械、电机、电子及计算机等许多专业知识。

    步进电机主要分为以下几类:

    1. 永磁式(PM)
    2. 反应式(VR)
    3. 混合式(HB)

    步进电机主要技术指标如下:

    1. 相数
    2. 步距角
    3. 拍数
    4. 保持转矩

    工作原理:

    步进电机有三线式、四线式、五线式和六线式,但其控制方式均相同,都要以脉冲信号电流来驱动。假设每旋转一圈需要 200 个脉冲信号来励磁, 可以计算出每个励磁信号能使步进电机前进 1.8°。其旋转角度与脉冲的个数成正比。步进电动机的正、反转由励磁脉冲产生的顺序来控制。

    步进电机的励磁方式分为全步励磁和半步励磁两种。其中全步励磁又有一相励磁和二相励磁之分, 半步励磁又称一二相励磁。

    • 一相励磁:在每一瞬间,步进电机只有一个线圈导通.每送一个励磁信号,步进电机旋转 1.8°,这是三种励磁方式中最简单的一种。其特点是:精确度好、消耗电力小,但输出转矩最小,振动较大。

    image

    • 二相励磁:在每一瞬间,步进电动机有两个线圈同时导通。每送一个励磁信号,步进电机旋转 1.8°。其特点是:输出转矩大,振动小,因而成为目前使用最多的励磁方式。

    image

    • 一二相励磁:为一相励磁与二相励磁交替导通的方式。每送一个励磁信号,步进电机旋转 0.9°。其特点是:分辨率高,运转平滑,故应用也很广泛。

    image

    6. 软件设计

    按键1:正转两周;按键2:反转两周;按键3:正转一下;按键4:反转一下。

    /*
     * main.c
     *
     *  Created on: 2020年4月8日
     *      Author: lenovo
     */
    
    #include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
    #include "DSP2833x_Examples.h"   // DSP2833x Examples Include File
    #include "leds.h"
    #include "key.h"
    #include "step_motor.h"
    
    //4(GPIO3),6(GPIO5),3(GPIO2),5(GPIO4)
    unsigned char Step_table_ZTurn[]={0xfff7,0xffdf,0xfffb,0xffef};//正转
    unsigned char Step_table_FTurn[]={0xffef,0xfffb,0xffdf,0xfff7};//反转
    
    /*******************************************************************************
    * 函 数 名         : main
    * 函数功能           : 主函数
    * 输    入         : 无
    * 输    出         : 无
    *******************************************************************************/
    void main()
    {
        int i=0;
        char key=0;
        short cnt=0;
        char j=0;
    
        InitSysCtrl();
    
        LED_Init();
        KEY_Init();
        Step_Motor_Init();
    
        while(1)
        {
            key=KEY_Scan(0);
    
            if(key==KEY1_PRESS)
            {
                cnt=10;
                while(cnt--)
                {
                    for(j=0;j<4;j++)
                    {
                        GpioDataRegs.GPADAT.all=Step_table_ZTurn[j];
                        DELAY_US(5000);
                    }
                }
            }
            else if(key==KEY2_PRESS)
            {
                cnt=10;
                while(cnt--)
                {
                    for(j=0;j<4;j++)
                    {
                        GpioDataRegs.GPADAT.all=Step_table_FTurn[j];
                        DELAY_US(5000);
                    }
                }
            }
            else if(key==KEY3_PRESS)
            {
                for(j=0;j<4;j++)
                {
                    GpioDataRegs.GPADAT.all=Step_table_ZTurn[j];
                    DELAY_US(5000);
                }
            }
            else if(key==KEY4_PRESS)
            {
                for(j=0;j<4;j++)
                {
                    GpioDataRegs.GPADAT.all=Step_table_FTurn[j];
                    DELAY_US(5000);
                }
            }
            i++;
            if(i%2000==0)
            {
                LED1_TOGGLE;
            }
            DELAY_US(100);
        }
    }

    7. 效果

    为了观察明显,在转轴上绑了两条线绳……

  • 相关阅读:
    COCI 2018/2019 CONTEST #2 Solution
    点分治学习笔记
    【Treap 例题】神秘岛(island)
    【暴力Treap 或 离线归并】子串计数(genies)
    【拓扑 字符串还原 + 线段树维护】奇洛金卡达(father)
    UVA 10217 A Dinner with Schwarzenegger!!!---数学
    URAL-1018 Binary Apple Tree---树形DP
    ZOJ-3278 8G Island---二分第k大
    UVA-1152-4 Values whose Sum is 0---中途相遇法
    SGU---462 Electrician 最大生成树
  • 原文地址:https://www.cnblogs.com/dingdangsunny/p/12657918.html
Copyright © 2020-2023  润新知