51直行调速代码stc89c52,两个双相电机分别控制两个轮子,使用pwm调速不需要使能端
时间: 2024-05-09 16:16:33 浏览: 59
以下是基于STC89C52单片机的双向电机PWM调速代码,其中使用了定时器中断来产生PWM信号:
```c
#include <reg52.h>
#define FREQ 5000 // PWM频率
#define DUTY_CYCLE 50 // 初始占空比
sbit IN1 = P1^0; // IN1控制端口
sbit IN2 = P1^1; // IN2控制端口
sbit IN3 = P1^2; // IN3控制端口
sbit IN4 = P1^3; // IN4控制端口
unsigned int counter1 = 0; // 定时器1计数器
unsigned int counter2 = 0; // 定时器2计数器
unsigned int counter3 = 0; // 定时器3计数器
unsigned int counter4 = 0; // 定时器4计数器
void timer1_init(){
TMOD |= 0x10; // 定时器1工作在模式1
TH1 = (65536 - FREQ/2)/256; // 定时器1初值
TL1 = (65536 - FREQ/2)%256;
ET1 = 1; // 开启定时器1中断
EA = 1; // 开启总中断
TR1 = 1; // 启动定时器1
}
void timer3_init(){
TMOD |= 0x40; // 定时器3工作在模式2
TH3 = (65536 - FREQ*DUTY_CYCLE/100)/256; // 定时器3初值
TL3 = (65536 - FREQ*DUTY_CYCLE/100)%256;
ET3 = 1; // 开启定时器3中断
TR3 = 1; // 启动定时器3
}
void timer4_init(){
TMOD |= 0x80; // 定时器4工作在模式2
TH4 = (65536 - FREQ*DUTY_CYCLE/100)/256; // 定时器4初值
TL4 = (65536 - FREQ*DUTY_CYCLE/100)%256;
ET4 = 1; // 开启定时器4中断
TR4 = 1; // 启动定时器4
}
void main(){
timer1_init();
timer3_init();
timer4_init();
while(1){
// 这里可以写其他的控制代码
}
}
void timer1() interrupt 3{
counter1++;
if(counter1 == FREQ/2){
counter1 = 0;
IN1 = 0;
IN2 = 0;
IN3 = 0;
IN4 = 0;
}
}
void timer3() interrupt 14{
counter3++;
if(counter3 == FREQ*DUTY_CYCLE/100){
IN1 = 1;
}
if(counter3 == FREQ){
counter3 = 0;
IN1 = 0;
}
}
void timer4() interrupt 15{
counter4++;
if(counter4 == FREQ*DUTY_CYCLE/100){
IN4 = 1;
}
if(counter4 == FREQ){
counter4 = 0;
IN4 = 0;
}
}
```
在以上代码中,定时器1用于计算PWM信号的周期,定时器3和定时器4分别用于控制IN1和IN4的占空比。你可以通过修改DUTY_CYCLE的值来改变电机的转速,实现PWM调速。需要注意的是,由于STC89C52的定时器精度有限,可能会导致PWM信号的频率和占空比有一定的误差,需要根据实际情况进行调整。
阅读全文