L298是SGS公司的產品,L298N為15個管角的單塊集成電路,高電壓,高電流,四通道驅動,設計用L298N來接收DTL或者TTL邏輯電平,驅動感性負載(比如繼電器,直流和步進馬達)和開關電源晶體管。內部包含4通道邏輯驅動電路,其額定工作電流為 1 A,最大可達 1.5 A,Vss 電壓最小 4.5 V,最大可達 36 V;Vs 電壓最大值也是 36 V。L298N可直接對電機進行控制,無須隔離電路,可以驅動雙電機。
1,L298內部的原理圖 2,L298 引腳符號及功能 3,L298的邏輯功能 當使能端為高電平時,輸入端IN1為PWM信號,IN2為低電平信號時,電機正轉;輸入端IN1為低電平信號,IN2為PWM信號時,電機反轉;;IN1與IN2相 同時,電機快速停止。當使能端為低電平時,電動機停止轉動。 在對直流電動機電壓的控制和驅動中,半導體功率器件(L298)在使用上可以分為兩種方式:線性放大驅動方式和開關驅動方式在線性放大驅動方式。 半導體功率器件工作在線性區優點是控制原理簡單,輸出波動小,線性好,對鄰近電路干擾小,缺點為功率器件工作在線性區,功率低和散熱問題嚴重。開關驅動方式是使半導體功率器件工作在開關狀態,通過脈調制(PWM)來控制電動機的電壓,從而實現電動機轉速的控制。
- #include<reg51.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit MOTOR_A_1=P3^6;
- sbit MOTOR_A_2=P3^7;
- sbit k1=P1^0; //定義k1為p1.0口
- sbit k2=P1^1; //定義k2為p1.1口
- sbit k3=P1^2; //定義k3為p1.2口
- sbit k4=P1^3; //定義k4為p1.3口
- uchar T=0; //定時標記
- uchar W=0; //脈寬值 0~100
- uchar A=0; //方向標記 0,1
- 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[]={0xfe,0xfb,0xfd,0xf7};
-
- void delayms(uint t);
-
- void disp(void)
- {
- P2=table2[3];
- P0=table1[W]; //顯示占空比個位
- delayms(1); //延時1ms
- P2=0xff; //P0清1
- P2=table2[2];
- P0=table1[W/100]; //顯示占空比百位
- delayms(1); //延時1ms
- P2=0xff; //P0清1
-
- P2=table2[1];
- P0=table1[W/10]; //顯示占空比十位
- delayms(1); //延時1ms
- P2=0xff; //P0清1
- P2=table2[0];
- P0=table1[A]; //顯示方向
- delayms(1); //延時1ms
- P2=0xff; //P0清1
- }
-
- void init(void)
- {
- //啟動中斷
- TMOD=0x01;
- EA=1;
- ET0=1;
- TR0=1;
- //設置定時時間
- TH0=0xff;
- TL0=0xf6;
- }
- void timer0() interrupt 1
- {
- //重置定時器時間
- TH0=0xff;
- TL0=0xf6;
- T++; //定時標記加1
- disp(); //數碼管顯示
- if(k==0)
- {
- if(T>W)
- MOTOR_A_1 =0;
- else
- MOTOR_A_1 =1;
- }
- else
- {
- if(T>W)
- MOTOR_A_2 =0;
- else
- MOTOR_A_2 =1;
- }
-
- if(T==100)
- T=0;
- }
-
- void delayms(uint t)
- {
- uchar j;
- while(t--)
- {
- for(j=0;j<250;j++) //循環250次
- {
- _nop_(); //系統延時
- _nop_(); //系統延時
- _nop_(); //系統延時
- _nop_(); //系統延時
- }
- }
- }
-
- void key(void) //按鍵判斷程序
- {
- if(k1==0) //按鍵1按下
- {
- while(k1==0); //按鍵1抬起
- if(W==100) //如果脈寬為100
- W=0; //脈寬置0
- else
- W+=1; //否則加1
- }
- else if(k2==0) //按鍵2按下
- {
- while(k2==0); //按鍵2抬起
- if(W==0) //如果脈寬為0
- W=100; //脈寬設置成100
- else
- W-=1; //否則減1
- }
- else if(k3==0) //按鍵3按下
- {
- while(k3==0); //按鍵3抬起
- A=!A; //方向標記取反
- k=!k; //按鍵標記取反
- }
- else if(k4==0) //按鍵4按下
- {
- while(k4==0); //按鍵4抬起
- W=0; //脈寬清0
- }
- }
- void main(void)
- {
- init(); /////////系統初始化
- while(1)
- {
- if(k==0)
- MOTOR_A_2=0;
- else
- MOTOR_A_1=0;
- key(); ////////查詢按鍵
- }
- }
復制代碼
|