STC12单片机+2个L298N模块+3个直流电机(演示其中一个电机的PWM调速过程)
L298模块电路原理图如下:
L298N电机驱动模块pdf资料:
L298模块
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黑下载附件…………
复制代码
所有资料51hei提供下载:
pwm l298.rar
(277.29 KB, 下载次数: 190)
|