1. 直流電機介紹
直流電機是指能將直流電能轉換成機械能(直流電動機)或將機械能轉換成直流電能(直流發電機)的旋轉電機。它是能實現直流電能和機械能互相轉換的電機。
2. 硬件設計
TC1508S:
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. 效果
因為啟動時電流不足,還需要手動撥一下![]()

5. 步進電機介紹
步進電機是將電脈沖信號轉變為角位移或線位移的開環控制元件。在非超載情況下,電機的轉速、停止的位置只取決於脈沖信號的頻率和脈沖數,而不受負載變化的影響,即給電機加一個脈沖信號,電機則轉過一個步距角。這一線性關系的存在,加上步進電機只有周期性的誤差而無累積誤差等特點,使得步進電機在速度、位置等控制領域的控制操作非常簡單。雖然步進電機應用廣泛,但它並不像普通的直流和交流電機那樣在常規狀態下使用, 它必須由雙環形脈沖信號、 功率驅動電路等組成控制系統方可使用。因此用好步進電機也非易事,它涉及機械、電機、電子及計算機等許多專業知識。
步進電機主要分為以下幾類:
- 永磁式(PM)
- 反應式(VR)
- 混合式(HB)
步進電機主要技術指標如下:
- 相數
- 步距角
- 拍數
- 保持轉矩
工作原理:
步進電機有三線式、四線式、五線式和六線式,但其控制方式均相同,都要以脈沖信號電流來驅動。假設每旋轉一圈需要 200 個脈沖信號來勵磁, 可以計算出每個勵磁信號能使步進電機前進 1.8°。其旋轉角度與脈沖的個數成正比。步進電動機的正、反轉由勵磁脈沖產生的順序來控制。
步進電機的勵磁方式分為全步勵磁和半步勵磁兩種。其中全步勵磁又有一相勵磁和二相勵磁之分, 半步勵磁又稱一二相勵磁。
- 一相勵磁:在每一瞬間,步進電機只有一個線圈導通.每送一個勵磁信號,步進電機旋轉 1.8°,這是三種勵磁方式中最簡單的一種。其特點是:精確度好、消耗電力小,但輸出轉矩最小,振動較大。
- 二相勵磁:在每一瞬間,步進電動機有兩個線圈同時導通。每送一個勵磁信號,步進電機旋轉 1.8°。其特點是:輸出轉矩大,振動小,因而成為目前使用最多的勵磁方式。
- 一二相勵磁:為一相勵磁與二相勵磁交替導通的方式。每送一個勵磁信號,步進電機旋轉 0.9°。其特點是:分辨率高,運轉平滑,故應用也很廣泛。
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. 效果
為了觀察明顯,在轉軸上綁了兩條線繩……









