DC motor PWM speed control program

/* * 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 */ }

Hand Tools

Wonke Electric CO.,Ltd. , https://www.wkdq-electric.com

Posted on