t++;
if(t>=100)t=0;/*1个PWM信号由100次中断产生*/
}
本程序实现串口对
直流电机的控制
******************************************************************/
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
//****************************************************************
//defineastatusworldwhichsendedbacktocomputer
#defineCOMMAND_STATUS 0
#defineSTATUS_LEFT 1
#defineSTATUS_RIGHT 2
#defineSTATUS_SAFETYL 4
#defineSTATUS_SAFETYR 8
#defineCOMMAND_LEFT 1 //Turnleft
#defineCOMMAND_RIGHT 2 //Turnright
#defineCOMMAND_STOP 3
#defineCOMMAND_SPEED 4
#defineSTOP 0
#defineLEFT 1
#defineRIGHT 2
#defineA_OUTPUT_ENABLE P3_4 //输出使能
#defineB_OUTPUT_ENABLEP3_5
#defineMotorA 1
#defineMotorB 2
#definemotorA_r P1_7
#definemotorA_l P1_6
#definemotorB_r P1_5
#definemotorB_l P1_4
/*******************************************************************************
全局变量定义
*******************************************************************************/
ucharmotor,command,cmddata;/*Usedtoreceivecommandswithrs232*/
ucharbytenr=0; /*Usedtorecordhowmanybytewewillreceive*/
ucharCycle=100;
uchardirectionA=0; /*currentrotatingdirection*/
uchardirectionB=0;
ucharPWidthA=50;
ucharPWidthB=50;
uint speedA=0; /*Defaultspeed*/
uint speedB=0;
ucharticks=0; /*counterusedforspeedcalculation*/
ucharserialtimeout=0; /*usedwhenwindowscrashes;-)*/
/*******************************************************************************
//funtionname:
voidTimer0_Int(void)
//
//
*******************************************************************************/
voidTimer0_Int(void)interrupt1using1
{
serialtimeout++; //Ignoreallreceivedbytesafterabout2seconds
if(!
serialtimeout)
bytenr=0;
P3_7=~P3_7; //invertP3.7,nicefordebugging
ticks++;
if(ticks>=Cycle)
ticks=0;
if(ticks<=PWidthA)
A_OUTPUT_ENABLE=0;
else
A_OUTPUT_ENABLE=1;
switch(directionA)
{
caseSTOP:
{
motorA_r=0;
motorA_l=0;
A_OUTPUT_ENABLE=0; //NPN三极管为省电
}
break;
caseLEFT:
{
motorA_r=0;
motorA_l=1;
}
break;
caseRIGHT:
{
motorA_r=1;
motorA_l=0;
}
break;
}
switch(directionB)
{
caseSTOP:
{
motorB_r=0;
motorB_l=0;
B_OUTPUT_ENABLE=0;
}
break;
caseLEFT:
{
motorB_r=0;
motorB_l=1;
}
break;
caseRIGHT:
{
motorB_r=1;
motorB_r=0;
}
break;
}
TH0=0xFF; //Timing10ms
TH0=0xF0; //reloadbasiccountnumber
TR0=1; //Enabletimer0
return;
}
//**************************************************************************
//
//
//
//***************************************************************************/
voidSendChar(ucharch)
{
SBUF=ch;
while(TI==0); //等待发送完
TI=0; //中断标志复位
}
//**************************************************************************
//函数名:
voidSerial_INT_SVR
//
//
//***************************************************************************
voidSerial_INT_SVR(void)interrupt4using3
{
if(RI) //Didwereceivedata?
{
serialtimeout=0; //resetTimeoutCounter
RI=0; //resettheinterruptflag
switch(bytenr)
{
case0:
{
motor=SBUF; //receivethefirstbyte
SendChar(motor);
break;
}
case1:
{
command=SBUF;
SendChar(command);
break;
}
case2:
{
cmddata=SBUF;
SendChar(cmddata);
break;
}
}
bytenr++;
if(bytenr>2)
{
bytenr=0; //resetbytecounter
//motorshouldalwaysbezero*/
if(motor==MotorA)
{
switch(command) /*commandhandler*/
{
caseCOMMAND_STOP:
{
directionA=0;
break;
}
caseCOMMAND_LEFT:
{ //turnleft
directionA=1;
break;
}
caseCOMMAND_RIGHT:
{ //turnright
directionA=2;
break;
}
caseCOMMAND_SPEED:
{ //改变速度
speedA=cmddata;
if((speedA<=Cycle)&&(speedA>1)) //保证脉宽不会太窄
{
PWidthA=speedA;
}
break;
}
}
}
elseif(motor==MotorB)
{
switch(command) /*commandhandler*/
{
caseCOMMAND_STOP:
{
directionB=0;
break;
}
caseCOMMAND_LEFT:
{ //turnleft
directionB=1;
break;
}
caseCOMMAND_RIGHT:
{ //turnright
directionB=2;
break;
}
caseCOMMAND_SPEED:
{ //改变速度
speedB=cmddata;
if((speedB<=Cycle)&&(speedB>1)) //保证脉宽不会太窄
{
PWidthA=speedB;
}
break;
}
}
}
}
}
}
/********************************************************************************
serialinitil
******************************************************************************/
voidInit_serialCOM(void)
{
SCON=0x50; //SCON:
serailmode1,8-bitUART,enableREN
TMOD|=0x20;//TMOD:
timer1,mode2,8-bitreload
PCON|=0x80;//SMOD=1;Baud*2
TH1=0xF4; //Baud:
4800fosc=11.0592MHz
TL1=0xF4;
EA=1; //EnableSerialInterrupt
ES=1;
TR1=1; //timer1run
}
/*******************************************************************************
setingtimer0
*******************************************************************************/
voidSet_Timer0(void)
{
TMOD&=0xf0; /*Settimer0*/
TMOD|=0x01; /*settimer0asGate=0Timer,mode1*/
TH0=0xff; /*Timint10ms*/
TL0=0x00;
TR0=1; /*Enabletimer0*/
ET0=1; /*Enabletimer0interrupt*/
EA=1; /*Enableallenabledinterrupts*/
}
/*******************************************************************************
Mainloop
*******************************************************************************/
voidmain(void)
{
Init_serialCOM(); //serialinition
Set_Timer0(); //intmode
SendChar(PWidthA);
SendChar(PWidthB); //
A_OUTPUT_ENABLE=1;
B_OUTPUT_ENABLE=1; //forbidoutput
while
(1)
{
; //herecanaddsomeusercode
}
}
大家来讨论下L298是怎么驱动直流电机的
为什么我用单片机的I/O控制L298的IN1,IN2,ENA直流减速电机不转动呢?
而直接在上面加H/L电平却能控制呢?
是不是L298又什么要求,我还不知道.......,不过我用仿真软件跑的很好~
请高手帮忙诊断下,谢谢~
程序如下:
#include
sbitP1_1=P1^1;//ENA 左使能
sbitP1_2=P1^2;//IN1
sbitP1_3=P1^3;//IN2
sbitP1_4=P1^4;//ENB 右使能
sbitP1_5=P1^5;//IN3
sbitP1_6=P1^6;//IN4
sbitP2_0=P2^0; //前进
sbitP2_1=P2^1; //后退
sbitP2_2=P2^2; //左转
sbitP2_3=P2^3; //右转
#define ENA P1_1
#define IN1 P1_2
#define IN2 P1_3
#define ENB P1_4
#define IN3 P1_5
#define IN4 P1_6
unsignedinti,k=0;
voidint_tmer0();
voidforwoard();
voidbackwoard();
voidleft();
voidright();
voidstop();
voidinit();
voidint_tmer0()interrupt 1
{i++;
TH0=0x3C;
TL0=0xB0;
if(i==100)
{i=0;
switch(k++)
{case0:
P2_0=1;