步進電動機基本原理實驗
一、實驗要求
1、 編制程序,利用單片機P1口產生驅動步進電動機運轉的脈沖信號(四相單四拍、四相雙四拍、四相八拍)。
2、 編制程序,實現步進電動機自鎖功能。
3、 編制程序,演示步進電動機的步距角。
二、實驗目的
1、 了解步進電動機的基本結構和工作原理。
2、 掌握步進電動機驅動程序的設計方法。
3、 掌握外部開關數據的讀入方法。
三、實驗電路及連線
圖4—1
1.機電平臺的選擇開關打在步進電機位置。
2.實驗板上的K0~K3 控制運行方式(初始K5~K0全置‘0’)。
3.實驗板上P10~P13內部已接機電平臺步進電機的A、B、C、D。
4.開關部分的電原理圖見實驗板的有關說明。
四、實驗說明
步進電動機又稱為脈沖電機,是工業過程控制和儀表中一種能夠快速啟動、反轉和制動的執行元件。其功用是將電脈沖轉換為相應的角位移或直線位移。步進電動機的運轉是由電脈沖信號控制的,步進電動機的角位移量或線位移量與脈沖數成正比,每給一個脈沖,步進電機就轉動一個角度(步距角)或前進/倒退一步。步進電機旋轉的角度由輸入的電脈沖數確定,所以,也有人稱步進電動機為一個數字/角度轉換器。
當某一相繞阻通電時,對應的磁極產生磁場,并與轉子形成磁路,這時,如果定子和轉子的小齒沒有對齊,在磁場的作用下,由于磁通具有力圖走磁阻最小路徑的特點,轉子將轉動一定的角度,使轉子與定子的齒相互對齊,由此可見,錯齒是促使電機旋轉的原因。
四相步進電動機以四相單四拍、四相雙四拍、四相八拍方式工作時的脈沖分配表如表1,表2和表3表1 四相單四拍脈沖分配表 表2 四相雙四拍脈沖分配表 表3 四相八拍脈沖分配表 如步進電動機每一相均停止通電,則電機處于自由狀態;若某一相一直通直流電時,則電機可以保持在固定的位置上,即停在最后一個脈沖控制的角位移的終點位置上,這樣,步進電動機可以實現停止時轉子定位。這就是步進電動機的自鎖功能。當步進電機處于自鎖時,若用手旋轉它,感覺很難轉動。 本實驗用撥動開關K0~K3來確定步進電動機的工作方式(表4)。 表4 步進電動機工作方式(X代表任意邏輯)
#include <reg52.h>
#include <intrins.h>
#include "main.h"
#define uchar unsigned char
#define uint unsigned int
/******************************************/
/*
sfr P1ASF = 0x9D;
sfr ADC_CONTR = 0xBC;
sfr ADC_RES = 0xBD;
sfr ADC_RESL = 0xBE;
// 7 6 5 4 3 2 1 0 Reset Value
//sfr ADC_CONTR = 0xBC; ADC_POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0 0000,0000 //AD ×a»»¿ØÖƼÄ′æÆ÷
#define ADC_OFF() ADC_CONTR = 0
#define ADC_ON (1 << 7)
#define ADC_90T (3 << 5)
#define ADC_180T (2 << 5)
#define ADC_360T (1 << 5)
#define ADC_540T 0
#define ADC_FLAG (1 << 4)
#define ADC_START (1 << 3)
#define ADC_CH0 0
#define ADC_CH1 1
#define ADC_CH2 2
#define ADC_CH3 3
#define ADC_CH4 4
#define ADC_CH5 5
#define ADC_CH6 6
#define ADC_CH7 7
*/
#define uchar unsigned char
#define uint unsigned int
uchar KEY,TC,BPC;
/**********************************************/
void Delay_Us(void)
{_nop_(); _nop_();}
sfr ISP_CONTR = 0xC7;
void ResetKey_Download()
{
if ((PCON & 0x10) == 0)
{
PCON = PCON | 0x10;
ISP_CONTR = 0x60;
}
else
{
PCON = PCON & 0xef;
}
}
//---------------------
uint8_t KEY_Input(void)
{
uint8_t buffer;
DATA=0xff;
IN_EN();
Delay_Us();
Delay_Us();
buffer=DATA;
IN_NEN();
return buffer;
}
// ¶Ë¿ú 3õ ê1»ˉ
void Init(void)
{
IN_NEN();
DATA=0; // P0
LED_DATA_EN();
LED_DATA_NEN();
P3=0XFF; //
P1=0XFF; //
P2=0X00;
}
/*******************************/
void MCU_Init(void)
{
TMOD=0x11;
EA=1;
ET0=1;
ET1=1;
TH1=0xEE; //5ms (11.0592M)
TL1=0x00;
TR1=1;
}
/*******************************/
//*ËÄÏàËÄÅÄ
void D4P4()
{
BPC++;
if (BPC==0x05) BPC=0x01;
switch(BPC)
{ case 0x01: BA=1;BB=0;BC=0;BD=0;break;
case 0x02:BA=0;BB=1;BC=0;BD=0;break;
case 0x03:BA=0;BB=0;BC=1;BD=0;break;
case 0x04:BA=0;BB=0;BC=0;BD=1;break;
default: BPC=0x0;
}
}
/*******************************/
//*ËÄÏàË«ËÄÅÄ
void D4SP4()
{
BPC++;
if (BPC==0x05) BPC=0x01;
switch(BPC)
{ case 0x01: BA=1;BB=1;BC=0;BD=0;break;
case 0x02:BA=0;BB=1;BC=1;BD=0;break;
case 0x03:BA=0;BB=0;BC=1;BD=1;break;
case 0x04:BA=1;BB=0;BC=0;BD=1;break;
default: BPC=0x0;
}
}
//*ËÄÏà°ËÅÄ
void D4P8()
{
BPC++;
if (BPC==0x09) BPC=0x01;
switch(BPC)
{ case 0x01:BA=1;BB=0;BC=0;BD=0;break;
case 0x02:BA=1;BB=1;BC=0;BD=0;break;
case 0x03:BA=0;BB=1;BC=0;BD=0;break;
case 0x04:BA=0;BB=1;BC=1;BD=0;break;
case 0x05:BA=0;BB=0;BC=1;BD=0;break;
case 0x06:BA=0;BB=0;BC=1;BD=1;break;
case 0x07:BA=0;BB=0;BC=0;BD=1;break;
case 0x08:BA=1;BB=0;BC=0;BD=1;break;
default: BPC=0x0;
}
}
//
void LOCK()
{ BA=1;BB=0;BC=0;BD=0;}
/******************************/
void Timer1_ISR(void)interrupt 3 //f=5ms
{ TR1=0 ;
TH1=0xEE;
TL1=0x00;
TC++;
if (TC==50)
{ TC=0x00;
switch(KEY)
{ case 0x01:D4P4();break; //K0=1 ;
case 0x02:D4SP4();break; //K1=1
case 0x04:D4P8();break; //K2=1
default:LOCK();
}
}
TR1=1;
}
void main(void)
{ResetKey_Download();
BPC=0x00;
Init();
MCU_Init();
while(1)
{
KEY=KEY_Input();
}
}
|