STC12單片機+2個L298N模塊+3個直流電機(演示其中一個電機的PWM調速過程)
0.png (613.16 KB, 下載次數: 115)
下載附件
2017-5-17 19:07 上傳
L298模塊電路原理圖如下:
0.png (334.44 KB, 下載次數: 123)
下載附件
2017-5-17 19:07 上傳
L298N電機驅動模塊pdf資料:
0.png (136.41 KB, 下載次數: 131)
下載附件
2017-5-17 19:08 上傳
1511.png (182.85 KB, 下載次數: 108)
下載附件
L298模塊
2017-5-17 15:15 上傳
stc單片機源程序如下:
- //周期為7毫秒,100微秒一調,脈寬范圍是0~70
- //當脈寬小于15,電機不轉(不知道是不是跟電機有關,電壓達不到最低要求)
- //用的STC10F08,外接兩個L298模塊,控制3個直流電機
- #include <STC10.h>
- #include <math.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit en1=P0^0; /* L298Enable A */
- sbit en2=P0^3; /* L298Enable B */
- sbit en3=P0^6;
- sbit s1=P0^1; /* L298Input 1 */
- sbit s2=P0^2; /* L298Input 2 */
- sbit s3=P0^4; /* L298Input 3 */
- sbit s4=P0^5; /* L298Input 4 */
- sbit s5=P2^0; /* L298-2Input 1 */
- sbit s6=P2^1; /* L298-2Input 2 */
- sbit k1=P2^2; //演示3個電機正轉
- sbit k2=P2^3; //演示反轉
- sbit k3=P2^4; //通過按鍵次數,電機速度加快
- sbit k4=P2^5; //自轉
- sbit k5=P2^6; //stop
- bit fangx=0;//0正轉,1反轉
- uchar keynum=0; //按鍵次數
- uchar idata t=0; /* 中斷計數 */
- uchar idata mk1=0; /* 電機1速度對應脈寬 */
- uchar idata mk2=0; /* 電機2速度*/
- uchar idata mk3=0; /* 電機3速度*/
- uchar idata tmp1,tmp2,tmp3; /* 電機當前速度 */
- ////////////////
- void delay1ms() //@22.1184MHz
- {
- unsigned char i, j;
- _nop_();
- i = 4;
- j = 146;
- do
- {
- while (--j);
- } while (--i);
- }
- ////////////////
- void delay50ms() //@22.1184MHz
- {
- unsigned char i, j, k;
- i = 5;
- j = 52;
- k = 195;
- do
- {
- do
- {
- while (--k);
- } while (--j);
- } while (--i);
- }
- /////////////////////////////////////////
- /* index-電機號(1,2,3); 脈寬(0~70) ,方向 0=正轉*/
- void motor(uchar index, char speed,bit a)
- {
-
- fangx=a;
-
- if(a==0) //正轉
- {
- switch(index)
- {
- case 1 : s1=1; s2=0;mk1=speed;break;
- case 2 : s3=1; s4=0;mk2=speed;break;
- case 3 : s5=1; s6=0;mk3=speed;break;
- default: break;
- }
- }
- else //反轉
- {
- switch(index)
- {
- case 1 : s1=0;s2=1; mk1=speed;break;
- case 2 : s3=0; s4=1 ; mk2=speed;break;
- case 3 : s5=0; s6=1 ; mk3=speed;break;
- default: break;
- }
- }
- }
- /////////////////////////////
- /* index-電機號(1,2,3);*/
- void motorstop(uchar index )
- {
- switch(index)
- {
- case 1 :s1=0;s2=0; mk1=0;break;
- case 2 :s3=0;s4=0; mk2=0;break;
- case 3 :s5=0;s6=0; mk3=0;break;
- default: break;
- }
- }
- ///////////////
- void Timer0Init(void) //100US,22.1184MHz
- {
- AUXR |= 0x80; //1T
- TMOD &= 0xF0;
- TMOD |= 0x01; //16位工作方式1
- TL0 = 0x5C;
- TH0 = 0xF7;
- TF0 = 0;
- TR0 = 1;
- EA=1;
- ET0=1;
- }
- ///////////////////////////
- void main()
- {
- uchar i;
-
- P0=P1=P2=P3=0XFF;
-
- Timer0Init();
-
- while(1) /* 電機控制演示 */
- {
- /////////////////
- if(k1==0) //3個電機正轉
- {
- motor(1,50,0);
- motor(2,30,0);
- motor(3,10,0);
- }
- //////////////////////
- else if(k2==0) //3個電機反轉
- {
- motor(1,20,1);
- motor(2,40,1);
- motor(3,60,1);
- }
- ////////////////////
- else if(k3==0)
- {
- delay1ms();
- while(!k3); //等待按鍵放開
- if(keynum>=70)
- {keynum=0;}
- keynum++; //加速
- motor(1,keynum,fangx);
- }
-
- /////////////////////
- else if(k4==0)
- {
- delay1ms();
- while(!k4); //等待按鍵放開
- for(i=0;i<=70;i++)
- {
- motor(1,i,fangx);
- delay50ms();
- delay50ms();
- delay50ms();
- delay50ms();
- delay50ms();
- delay50ms();
- delay50ms();
- delay50ms();
- delay50ms(); //延時,通過示波器可以看見脈寬的變化
- }
-
- }
- /////////////////////
- else if(k5==0)
- {
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
0.png (50.41 KB, 下載次數: 132)
下載附件
2017-5-17 19:11 上傳
所有資料51hei提供下載:
pwm l298.rar
(277.29 KB, 下載次數: 190)
2017-5-17 15:21 上傳
點擊文件名下載附件
c例程和298指導書 下載積分: 黑幣 -5
|