解决51单片机驱动SG90舵机抖动或无反应问题的有效方案

1、自制的51单片机最小系统板。

 

 2、加入了一个7805CV稳压模块,使用12V直流供电,随便找了个电源适配器。输出12V,1A

3、问题:确保程序无误,接线无误,上电之后舵机有轻微咔咔声,无法正确运行。或者有时候反复重新执行。根据观察判断是单片机运行几条指令之后就自动断电复位。

解决;经过网上查询,基本确定是供电问题。由于公用一个电源,导致供电不足,都无法正常运行。但是又不想用2个电源,太麻烦,因此用一个电源分出两路7805分别带动单片机和舵机,两路共地,运行之后一切正常,在面包板上测试没问题。

4、改进之后:

 

 5、程序代码:

#include "reg52.h"
//开发板做信号,自制板做电源可以稳定运行(共地)。
//自制版做信号,外接直连5V,可稳定运行(共地)。
sbit sg90_con = P1^0;
sbit light = P1^1;    //设置指示灯以判断程序是否正确运行
int jd;
int cnt = 0;
void Delay2000ms()		//@11.0592MHz
{
	unsigned char i, j, k;
 
	i = 15;
	j = 2;
	k = 235;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}
 
 
void Time0Init()
{
	TMOD = 0x01;
	TL0=0x33;
	TH0=0xFE;
	TR0 = 1;
	TF0 = 0;
	ET0 = 1;
	EA = 1;
}
void Delay300ms()		
{
	unsigned char i, j, k;
 
	i = 2;
	j = 15;
	k = 50;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}
 
void main()
{
	Delay300ms();
	Time0Init(); 
	jd = 1;      
	cnt = 0;
	sg90_con = 1;
	jd = 3; 
	cnt = 0;
	Delay2000ms();
	jd = 1; 
	cnt = 0;
	Delay300ms();
	Time0Init(); 
	jd = 1;      
	cnt = 0;
	sg90_con = 1;
	jd = 3; 
	cnt = 0;
	while(1)  //让舵机只动一次,然后进入死循环,我是用来开电脑的,有别的需求自己改。
	{
		light = 0;
		Delay300ms();
		light = 1;
		Delay300ms();
	}
}
 
void Time0Handler() interrupt 1
{
	cnt++; 
	TL0=0x33;
	TH0=0xFE;	
	if(cnt < jd)
	{
		sg90_con = 1;
	}
	else
	{
		sg90_con = 0;
	}
	if(cnt == 40)
	{
		cnt = 0;  
		sg90_con = 1;
	}
		
}

5、总结:由于本人模电一窍不懂,所以走了很多弯路,双电源确实能解决问题,但是觉得过于麻烦,此方法使用一个电源就能正常工作。电源适配器选功率高一点的,太低的话可能也无法正常运行,毕竟舵机运行时候需要几百毫安的电流。

6、改进:可以装一个红外接收,用于控制舵机功能。也可根据需要添加其他功能。

 

物联沃分享整理
物联沃-IOTWORD物联网 » 解决51单片机驱动SG90舵机抖动或无反应问题的有效方案

发表评论