51直行调速代码stc89c52,两个双相电机分别控制两个轮子,使用pwm调速不需要使能端
时间: 2024-05-13 10:18:56 浏览: 44
以下是基于STC89C52单片机的代码实现,使用PWM调速控制两个双相电机分别控制两个轮子。不需要使用使能端。
```c
#include <reg52.h>
sbit IN1 = P1^0; // IN1 - P1.0
sbit IN2 = P1^1; // IN2 - P1.1
sbit IN3 = P1^2; // IN3 - P1.2
sbit IN4 = P1^3; // IN4 - P1.3
unsigned int speed = 0; // 速度变量
void delay_ms(unsigned int ms)
{
unsigned int i, j;
for(i = 0; i < ms; i++)
for(j = 0; j < 120; j++);
}
void pwm_init()
{
TMOD |= 0x01; // 设置定时器0为模式1
TH0 = 0xfc; // 定时1ms
TL0 = 0x67;
ET0 = 1; // 开启定时器0中断
EA = 1; // 开启总中断
TR0 = 1; // 启动定时器0
}
void main()
{
pwm_init(); // 初始化PWM
while(1)
{
// 控制电机1正转
IN1 = 1;
IN2 = 0;
speed = 80; // 设置速度为80%
delay_ms(2000); // 维持2秒
// 控制电机1反转
IN1 = 0;
IN2 = 1;
speed = 50; // 设置速度为50%
delay_ms(2000); // 维持2秒
// 控制电机2正转
IN3 = 1;
IN4 = 0;
speed = 90; // 设置速度为90%
delay_ms(2000); // 维持2秒
// 控制电机2反转
IN3 = 0;
IN4 = 1;
speed = 70; // 设置速度为70%
delay_ms(2000); // 维持2秒
}
}
// 定时器0中断服务程序
void timer0_isr() interrupt 1
{
static unsigned int cnt = 0;
cnt++;
if(cnt <= speed)
IN1 = 1;
else
IN1 = 0;
if(cnt <= (100 - speed))
IN2 = 1;
else
IN2 = 0;
if(cnt <= speed)
IN3 = 1;
else
IN3 = 0;
if(cnt <= (100 - speed))
IN4 = 1;
else
IN4 = 0;
if(cnt >= 100)
cnt = 0;
}
```
本代码中,使用定时器0的中断服务程序来实现PWM的调节,通过设置speed变量来控制PWM的占空比,从而控制电机的转速。其中,电机1的IN1和IN2分别对应P1.0和P1.1引脚,电机2的IN3和IN4分别对应P1.2和P1.3引脚。在实际应用中,你需要根据电机的具体型号和驱动方式来设置PWM的频率和占空比。
阅读全文