設計思路:
直流電機PWM控制系統(tǒng)的主要功能包括:實現(xiàn)對直流電機的加速、減速以及電機的正轉、反轉和急停,并且可以調(diào)整電機的轉速,能夠很方便的實現(xiàn)電機的智能控制。 主體電路:即直流電機PWM控制模塊。這部分電路主要由AT89C52單片機的I/O端口、定時計數(shù)器、外部中斷擴展等控制直流電機的加速、減速以及電機的正轉和反轉,并且可以調(diào)整電機的轉速,能夠很方便的實現(xiàn)電機的智能控制。其間是通過AT89C52單片機產(chǎn)生脈寬可調(diào)的脈沖信號并輸入到L298驅(qū)動芯片來控制直流電機工作的。該直流電機PWM控制系統(tǒng)由以下電路模塊組成: 設計輸入部分:這一模塊主要是利用帶中斷的獨立式鍵盤來實現(xiàn)對直流電機的加速、減速以及電機的正轉、反轉和急�?刂�。 設計控制部分:主要由AT89C52單片機的外部中斷擴展電路組成。直流電機PWM控制實現(xiàn)部分主要由一些二極管、電機和L298直流電機驅(qū)動模塊組成。 設計顯示部分: LED數(shù)碼顯示部分,實現(xiàn)對PWM脈寬調(diào)制占空比的實時顯示。
系統(tǒng)框架設計:
1.jpg (13.72 KB, 下載次數(shù): 133)
下載附件
2019-8-8 12:16 上傳
仿真運行:
截圖5.jpg (20.37 KB, 下載次數(shù): 131)
下載附件
2019-8-8 12:18 上傳
程序部分: ********************************************************************* 直流電機PWM調(diào)速 功能描述:使用單片機T0定時器產(chǎn)生(xxxHz)脈寬調(diào)制信號,輸?shù)?/font>L298N的EN_A 實現(xiàn)雙直流電機的速度調(diào)控。 修訂日期:2011-5-7 *********************************************************************/ #include<reg52.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int
/********************************************************************** L298n接口定義 **********************************************************************/ sbit MOTOR_A_2=P3^6; sbit MOTOR_A_1=P3^7; sbit EN_MOTOR_A =P3^4; sbit k1=P1^5; sbit k2=P3^1; sbit k3=P3^2; sbit k4=P3^3; uchar T=0; uchar W=0; uchar A=0; uchar k=0; uchar i=0;
uchar code table1[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71};
uchar code table2[]={0xef,0xbf,0xdf,0x7f};
void delayms(uint t); /********************************************************************** 數(shù)碼管顯示 **********************************************************************/ void disp(void) { P0=table2[3]; P2=table1[W%10]; delayms(1); P0=0xff;
P0=table2[2]; P2=table1[W/100]; delayms(1); P0=0xff;
P0=table2[1]; P2=table1[W/10%10]; delayms(1); P0=0xff;
P0=table2[0]; P2=table1[A]; delayms(1); P0=0xff; }
/********************************************************************** 定時器變量定義 **********************************************************************/
void init(void) { TMOD=0x01; EA=1; ET0=1; TR0=1; //設置定時時間 TH0=0xfd; TL0=0x17; } void timer0() interrupt 1 { TL0=0x17; TH0=0xff; T++; disp(); if(T>W) EN_MOTOR_A=1; else EN_MOTOR_A=0; if(T==100) T=0;
} /********************************************************************** 延時1ms **********************************************************************/ void delayms(uint t) { ucharj; while(t--) { for(j=0;j<250;j++) { _nop_(); _nop_(); _nop_(); _nop_(); } }
}
|