/*
* PWM Speed Control Program for DC Motors
*/
/* The crystal oscillator uses 11.0592MHz, resulting in a PWM frequency of approximately 91Hz */
#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit en1 = P2^0; /* L298 Enable A */
sbit en2 = P2^1; /* L298 Enable B */
sbit s1 = P2^2; /* L298 Input 1 */
sbit s2 = P2^3; /* L298 Input 2 */
sbit s3 = P2^4; /* L298 Input 3 */
sbit s4 = P2^5; /* L298 Input 4 */
uchar t = 0; /* Interrupt counter */
uchar m1 = 0; /* Motor 1 speed value */
uchar m2 = 0; /* Motor 2 speed value */
uchar tmp1, tmp2; /* Current motor speed values */
/* Motor control function: index (motor number 1 or 2), speed (-100 to 100) */
void motor(uchar index, char speed)
{
if (speed >= -100 && speed <= 100)
{
if (index == 1) /* Motor 1 processing */
{
m1 = abs(speed); /* Take absolute value of speed */
if (speed < 0) /* Reverse direction */
{
s1 = 0;
s2 = 1;
}
else /* Forward direction */
{
s1 = 1;
s2 = 0;
}
}
if (index == 2) /* Motor 2 processing */
{
m2 = abs(speed); /* Set motor 2 speed */
if (speed < 0) /* Reverse direction */
{
s3 = 0;
s4 = 1;
}
else /* Forward direction */
{
s3 = 1;
s4 = 0;
}
}
}
}
/* Simple delay function */
void delay(uint j)
{
for (; j > 0; j--);
}
void main()
{
char i;
TMOD = 0x02; /* Timer 0 in mode 2 */
TH0 = 0x9B; /* Timer initial value */
TL0 = 0x9B;
EA = 1; /* Enable global interrupts */
ET0 = 1; /* Enable timer 0 interrupt */
TR0 = 1; /* Start timer 0 */
while (1) /* Motor control demonstration */
{
for (i = 0; i <= 100; i++) /* Accelerate forward */
{
motor(1, i);
motor(2, i);
delay(5000);
}
for (i = 100; i > 0; i--) /* Decelerate forward */
{
motor(1, i);
motor(2, i);
delay(5000);
}
for (i = 0; i <= 100; i++) /* Accelerate reverse */
{
motor(1, -i);
motor(2, -i);
delay(5000);
}
for (i = 100; i > 0; i--) /* Decelerate reverse */
{
motor(1, -i);
motor(2, -i);
delay(5000);
}
}
}
/* Timer 0 interrupt service routine */
void Timer0() interrupt 1
{
if (t == 0) /* Accept new value after one PWM cycle */
{
tmp1 = m1;
tmp2 = m2;
}
t++;
if (t == 100) t = 0; /* One PWM signal is generated by 100 interrupts */
}
Wonke Electric CO.,Ltd. , https://www.wkdq-electric.com