凌亂的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. 效果

為了觀察明顯,在轉軸上綁了兩條線繩……

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM