51单片机驱动不了sg90舵机

我是在用51单片机最小系统板做智能小车,用L298N驱动模块输入12v后再通过L298N的5v输出经过稳压给单片机供电。然后通过这样的供电方式使用舵机的时候,舵机有很明显的响声,但是舵机没有转动。请问各位这是什么原因?
代码如下:

#include <REGX52.H>
#include <intrins.h>
#include "delay.h"

sbit PWM = P3^5;


unsigned char counter;
unsigned char angle;

void Timer1_Init()        //500微秒@11.0592MHz
{
    TMOD &= 0x0F;            //设置定时器模式
    TMOD |= 0x10;            //设置定时器模式
    TL1 = 0x33;                //设置定时初始值
    TH1 = 0xFE;                //设置定时初始值
    TF1 = 0;                //清除TF1标志
    TR1 = 1;                //定时器1开始计时
    ET1 = 1;                //使能定时器1中断
    EA = 1;         //打开总中断
    PT1 = 1;         //设置优先级
}

void control()
{
    counter = 2;       //右转
    angle = 1;           
    Delay1ms(1000);
    
    counter = ;       //左转
    angle = 4Delay1ms(1000);
    
    counter = 3;      //归中
    angle = ;           
    Delay1ms(1500);
    
}

void Timer1_Isr() interrupt 3
{
    TL1 = 0x33;                //设置定时初始值
    TH1 = 0xFE;                //设置定时初始值
    counter++;
    if(counter == 40)
    {
        counter = 0;
    }
    if(counter <= angle)
    {
        PWM = 1;
    }
    else
    {
        PWM = 0;
    }
    TR1 = 1;
}

可以确认一下你的代码实现了PWM输出,是否可以驱动你的舵机。此外,还需要确保舵机的供电电压、电流都满足要求。可以根据舵机的数据手册,检查您的驱动模块是否正常工作。

此外,还有一些细节:

在代码中,P3.5被用作PWM输出,确保该引脚是51单片机的可用输出引脚。
定时器1的初始值需要根据实际情况调整。
在control函数中,角度变量angle的初始值是否与舵机的要求一致。
control函数中的Delay1ms延时是否合适。
还有:
这个问题可能是由于舵机不能得到足够的电流供应造成的。可以尝试通过更换驱动模块,或增加电流供应的方式来解决这个问题。此外,还可以检查舵机的连接是否正确,确保舵机的控制信号被正确地发送到驱动模块。

另外,你的代码中存在一些错误,请检查代码,以确保所有的变量都有正确的值,以免对舵机控制造成影响。比如,在 control 函数中, angle 变量没有正确地初始化
如果以上所有因素都没有问题,那么你的代码应该可以正常驱动舵机。如果问题仍然存在,请提供更多信息

很可能是电压不够导致舵机无法正常工作。L298N输出的5V可能不能满足舵机的电压需求,你可以尝试直接从12V输入给舵机供电,或者使用更高输出电压的稳压模块。此外,还有可能是舵机的控制信号不正确导致舵机无法工作,你可以检查一下单片机的程序以及舵机的控制信号是否正确。

这种情况可能是由于舵机驱动电路的电压不稳定导致的。L298N 驱动模块把 12V 电压稳压到 5V,但是如果稳压的不足,舵机可能就无法正常工作。

另外,舵机的驱动电流可能不足,这样也可能导致舵机无法正常工作。在使用 L298N 驱动模块时,您需要确保模块能够提供足够的电流来驱动舵机。如果不能,您可以尝试使用其他驱动模块,或者增加电流输出以满足舵机的需求。

还有,舵机的控制信号可能不正确。您需要确保您的代码正确地生成了舵机的控制信号,并且该信号的格式和舵机的驱动电路相匹配。

建议您对电路进行检查,确保电压和电流输出正确,并且检查代码以确保控制信号的生成是正确的。如果仍然存在问题,您可以尝试寻求专业人士的帮助。

这可能是由于舵机没有得到足够的电流,请检查L298N模块,以确保它获得足够的电流以驱动舵机转动。也可能是舵机自身的问题,请检查舵机的质量,以确保它可以正常工作;如果无法排除此问题,可以尝试更换一个新的舵机。

既然舵机有很明显的响声,这时就要首先检查电压是否足够,判定驱动能量,不足的话先解决此问题。

驱动不了要么线接错了要么控制代码不正确

有几个原因可能导致舵机没有转动:

1.电源不足:如果舵机需要的电流较大,而你给舵机供电的电源不足,舵机将无法正常工作。
2.电源电压值:测量舵机电源的输入电压值和输出电压值,以确定电源是否符合要求。
3.电路故障:如果电路板或控制电路出现故障,舵机将无法正常工作。
4.单片机程序错误:如果单片机程序有误,控制舵机的信号可能不正确,从而导致舵机不工作。
4.舵机故障:舵机可能已损坏,导致其不工作
5舵机连接:确认舵机与L298N驱动模块以及单片机之间的接线是否正确。

软件设计:
我们知道想让舵机转动,必须给舵机一个脉冲,脉冲说白了就是高低电平,高低电平的占比不同,转的角度也就不同。
这里使用51的定时器,每过0.1ms计时一次,20ms为一个周期,同时定义一个变量,一个常量,将二者进行比较即可。

程序:

//实际上想让舵机转到指定角度,是需要自己实验的,每个舵机都不一样,原理是参考的。
#include <reg52.h>
 
sbit SEV_PWM = P1^7;                               //设定PWM输出的I/O端口,有个引脚输出
 
unsigned char count = 0;                            //比较值
unsigned char SEV_conut=9;                         //pwm控制值
 
/*延时程序*/
void Delay(unsigned int s)
{
    unsigned int i;
    for(i=0; i<s; i++);
    for(i=0; i<s; i++);
}
 
/*定时器T0初始化*/
void Com_Init()           
{
    TMOD |= 0x01;                         //定时器T0设置成方式1
    TH0 = 0xff;                            //定时常数 0.1ms 晶振为11.0592MHz
    TL0 = 0xa4;
    ET0 = 1;                                                     //中断标志    
    TR0 = 1;                                                     //定时器开关
    EA=1;                                                     //总开关
}
    
/*T0中断初始化*/
void Time0_Init() interrupt 1 
{
            TR0 = 0;                                                 //定时器开关
            TH0 = 0xff;                          //重装时间常数 0.1ms
            TL0 = 0xa4;
            count++;                       //比较值,很关键
            if(count <= SEV_conut)            //5==0° 10==90°
            { 
                        SEV_PWM = 1;                //高电平
            }
            else 
            { 
                        SEV_PWM = 0;             //低电平
            }
          
            if (count >= 200)              //T = 20ms清零  20ms为周期,重新开始
            { 
                        count = 0; 
            }
            TR0 = 1;                       //开启T0
}
 
void main()
{
        Com_Init();                            //中断初始化,打开定时器
        while(1)
        {    
            SEV_conut=9;  
            count=0;                         //重新赋值,重新比较
            Delay(50000);                    //延时是为了留一些时间给舵机反映。
            SEV_conut=2;
            count=0;
            Delay(50000);
            SEV_conut=17;
            count=0;
            Delay(50000);
        }
}

总结:
控制舵机其实就是控制输出PWM,而PWM的输出就需要配置51单片机的定时器,总的来说还是要对51单片机的定时器熟悉。

建议采用以下程序:
运行程序前建议确认:
1、硬件连接正确,供电电压稳定5V
2、晶振是否为11.0592MHz
3、舵机是否损坏
4、连接线是否发生断线问题

#include <REGX52.H>
#include <intrins.h>
#include "delay.h"
 
sbit PWM = P3^5;
 
 
unsigned char counter;
unsigned char angle;
 
void Timer0_Init()        //500微秒@11.0592MHz
{

    TMOD = 0X01;
    
    TH0 = 0XFE;
    TL0 = 0X33;
    
    TR0 = 1;
    TF0 = 0;
    
    ET0 = 1;
    
    EA = 1;
}
 
void control()
{
    counter = 0;       
    angle = 2;         //右转   
    Delay1ms(1000);
    
    counter =0 ;       
    angle = 4//左转
    Delay1ms(1000);
    
    counter = 0;      
    angle =3 ;         //归中  
    Delay1ms(1500);
    
}
 
void Timer0_Isr() interrupt 1
{
    TL0 = 0x33;                //设置定时初始值
    TH0 = 0xFE;                //设置定时初始值
    counter++;
    if(counter == 40)
    {
        counter = 0;
        PWM = 1;
    }
    if(counter <= angle)
    {
        PWM = 1;
    }
    else
    {
        PWM = 0;
    }

}
 

如果问题得到解决请点 采纳~~

这个问题可能是由于舵机的电压不足或者输入的PWM信号不正确造成的。由于L298N模块是一个12V的驱动模块,而舵机通常需要5V左右的电压来工作。因此,您需要确保L298N模块输出的5V稳定并且足够用于驱动舵机。

此外,您还需要确保您使用正确的PWM信号来驱动舵机。通常,舵机需要50Hz左右的PWM信号来工作,因此您需要确保您的PWM信号频率正确。

如果上述方法都不能解决您的问题,您可以尝试进一步测试舵机的电压和PWM信号,以确保它们都是正确的。您也可以检查您的驱动电路,确保舵机的控制信号线连接正确。