1. 程式人生 > 其它 >DSP2833x實驗_步進電機

DSP2833x實驗_步進電機

步進電機介紹:

  步進電機是將電脈衝訊號轉變為角位移或線位移的開環控制元件。在非超載情況下,電機的轉速、停止的位置只取決於脈衝訊號的頻率和脈衝數,而不受負載變化的影響,即給電機加一個脈衝訊號,電機則轉過一個步距角。這一線性關係的存在,加上步進電機只有週期性的誤差而無累積誤差等特點,使得步進電機在速度、位置等控制領域的控制操作非常簡單。雖然步進電機應用廣泛,但它並不像普通的直流和交流電機那樣在常規狀態下使用, 它必須由雙環形脈衝訊號、 功率驅動電路等組成控制系統方可使用。因此用好步進電機也非易事,它涉及機械、電機、電子及計算機等許多專業知識。

步進電機主要分為以下幾類:
(1)永磁式(PM)
(2)反應式(VR)
(3)混合式(HB)
步進電機主要技術指標如下:
(1)相數
(2)步距角
(3)拍數
(4)保持轉矩

(1)工作原理
  步進電機有三線式、 四線式、 五線式和六線式, 但其控制方式均相同, 都要以脈衝訊號電流來驅動。 假設每旋轉一圈需要 200 個脈衝訊號來勵磁, 可以計算出每個勵磁訊號能使步進電機前進 1.8° 。 其旋轉角度與脈衝的個數成正比。 步進電動機的正、 反轉由勵磁脈衝產生的順序來控制。 六線式四相步進電機是比較常見的, 它的控制等效電路如下圖所示:

(2)勵磁方式
  步進電機的勵磁方式分為全步勵磁和半步勵磁兩種。

  其中全步勵磁又有一相勵磁和二相勵磁之分, 半步勵磁又稱一二相勵磁。 假設每旋轉一圈需要 200 個脈衝訊號來勵磁, 可以計算出每個勵磁訊號能使步進電動機前進 1.8°。

  簡要介紹如下:(6線式)
  ①一相勵磁:在每一瞬間, 步進電機只有一個線圈導通.每送一個勵磁訊號, 步進電機旋轉 1.8, 這是三種勵磁方式中最簡單的一種。
  其特點是:精確度好、 消耗電力小,但輸出轉矩最小, 振動較大。

      

  ②二相勵磁:在每一瞬間,步進電動機有兩個線圈同時導通。每送一個勵磁訊號, 步進電機旋轉 1.8。
  其特點是: 輸出轉矩大, 振動小, 因而成為目前使用最多的勵磁方式。 如果以該方式控制步進電機正轉, 對應的勵磁順序見下表。 若勵磁訊號反向傳送, 則步進電機反轉。

    

  ③一二相勵磁:為一相勵磁與二相勵磁交替導通的方式。 每送一個勵磁訊號, 步進電機旋轉 0.9。
  其特點是:解析度高, 運轉平滑, 故應用也很廣泛。 如果以該方式控制步進電機正轉,對應的勵磁順序見下表。 若勵磁訊號反向傳送, 則步進電機反轉

  

五線4相式:四相五線步進電機_qq5132834的專欄-CSDN部落格_五線四相步進電機

  ULN2003晶片簡介:

  ULN2003是一個單片高電壓、高電流的達林頓電晶體陣列積體電路。它是由7對NPN達林頓管組成的,它的高電壓輸出特性和陰極箝位二極體可以轉換感應負載。單個達林頓對的集電極電流是500mA。達林頓管並聯可以承受更大的電流。此電路主要應用於繼電器驅動器,字錘驅動器,燈驅動器,顯示驅動器(LED氣體放電),線路驅動器和邏輯緩衝器。ULN2003的每對達林頓管都有一個2.7k串聯電阻,可以直接和TTL或5V CMOS裝置。輸入輸出反向。

步進電機驅動電路:

  

1 GPIO5
2 GPIO4
3 GPIO3
4 GPIO2
5 電源

#include "DSP2833x_Device.h"     // DSP2823x Headerfile Include File
#include "DSP2833x_examples.h"   // DSP2823x Examples Include File
#include "leds.h"
#include "beep.h"
#include "key.h"
#include "dc_motor.h"
#include "steep_motor.h"
//////////////////////////////////////
unsigned char Step_table[]={0x0004,0x0008,0x0010,0x0020};//對應相位拉低使能;0b0000 0000 0000 0100 = 0x0040.ULN2003取反
unsigned char Step_table1[]={0x0020,0x0010,0x0008,0x0004};

void main(void)
{
    int i=0;
    char key=0;
    short cnt=0;
    char j=0;

    InitSysCtrl();    // 步驟 1. 初始化系統控制:
    LED_Init();
    KEY_Init();
    DC_Motor_Init();
    Steep_Motor_Init();
    while(1)
    {
        key=KEY_Scan(0);
        if(key==KEY1_PRESS)
        {
            cnt=1024;
            while(cnt--)
            {
                for(j=0;j<4;j++)
                {
                    GpioDataRegs.GPADAT.all=Step_table[j];
                    DELAY_US(5000);
                }
            }
        }
        else if(key==KEY2_PRESS)
        {
            cnt=1024;
            while(cnt--)
            {
                for(j=0;j<4;j++)
                {
                    GpioDataRegs.GPADAT.all=Step_table1[j];
                    DELAY_US(5000);
                }
            }
        }
        i++;
        if(i%2000==0)
        {
            LED1_TOGGLE;
        }
        DELAY_US(100);
    }
}
/*
 * steep_motor.c
 *
 *  Created on: 2021年7月7日
 *      Author: Administrator
 */
#include "steep_motor.h"

void Steep_Motor_Init(void)
{
    EALLOW;
    SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;// 開啟GPIO時鐘
    //Step_MOTOR埠配置
    GpioCtrlRegs.GPAMUX1.bit.GPIO2=0;
    GpioCtrlRegs.GPADIR.bit.GPIO2=1;

    GpioCtrlRegs.GPAMUX1.bit.GPIO3=0;
    GpioCtrlRegs.GPADIR.bit.GPIO3=1;

    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;

    }
/*
 * steep_motor.h
 *
 *  Created on: 2021年7月7日
 *      Author: Administrator
 */

#ifndef STEEP_MOTOR_H_
#define STEEP_MOTOR_H_

#include "DSP2833x_Device.h"     // DSP2833x 標頭檔案
#include "DSP2833x_Examples.h"   // DSP2833x 例子相關標頭檔案

#define MOTO_OUTA_SETH    (GpioDataRegs.GPASET.bit.GPIO2=1)
#define MOTO_OUTA_SETL    (GpioDataRegs.GPACLEAR.bit.GPIO2=1)

#define MOTO_OUTB_SETH    (GpioDataRegs.GPASET.bit.GPIO3=1)
#define MOTO_OUTB_SETL    (GpioDataRegs.GPACLEAR.bit.GPIO3=1)

#define MOTO_OUTC_SETH    (GpioDataRegs.GPASET.bit.GPIO4=1)
#define MOTO_OUTC_SETL    (GpioDataRegs.GPACLEAR.bit.GPIO4=1)

#define MOTO_OUTD_SETH    (GpioDataRegs.GPASET.bit.GPIO5=1)
#define MOTO_OUTD_SETL    (GpioDataRegs.GPACLEAR.bit.GPIO5=1)

void Steep_Motor_Init(void);

#endif /* STEEP_MOTOR_H_ */