关于舵机一转单片机就自动复位的问题

这个问题困扰了我一晚上才解决,我觉得很有必要发出来,第一是希望一些新手同志少走弯路,第二也是为了提醒自己以后不要再犯这种错误。

发现的问题及经过

1.第一个遇到的问题——舵机不转

       在我昨晚使用舵机的时候,经常会发现它有时能转,有时又完全转不了,甚至有时候会乱转。比如我要它转90度,它有时完全不转,只能听到舵机内部咔咔响,只有转到位的时候才不会响。

2.第二个遇到的问题——舵机一转单片机就自动复位

       在上一个问题捣鼓了半天后,舵机突然莫名其妙能转了!!!但是问题又来了。因为我把超声波模块和舵机模块一起用,想用他们两个做一个简单的实验:舵机初始的角度为0°,当超声波测量的距离小于6cm时,舵机转动90°。运行的时候,一开始测距大于6cm,当我用手靠近超声波模块直到小于6cm时,这时舵机转了90°,按正常来说的话舵机之后不会再转,但是才刚转到位,舵机又回到0°的位置!!!我重复试了几次都这样。我后来发现每次舵机自动转回0°的时候,OLED显示屏第二行会清屏,并且转回0°的行为对应着函数里 Servo_SetAngle(0); 这一步。所以我认为单片机很有可能是自动复位了。但是每次舵机一转为什么就复位?

以下时我当时main函数的代码。

int main(void)
{
	
	OLED_Init();
	Timer_Init();
	HCSR04_Init();
	Servo_Init();	
	OLED_ShowString(1,1,"distance:");
	Servo_SetAngle(0);	
	
	while(1)
	{
		int distance = Get_Distance();
		OLED_Clear_Part(2,1,16);			//将OLDE屏第2行清屏
		OLED_ShowNum(2, 1,distance,numlen(distance));		//显示单位为毫米的距离结果
		OLED_ShowString(2, 1 + numlen(distance), "mm");
		if(distance<60)
		{
			Servo_SetAngle(90);
 		}
//		else
//			Servo_SetAngle(180);
		
		Delay_ms(500);		//延时500毫秒,即OLED显示屏的更新时间。至少延时60毫秒,防止发射信号对回响信号造成影响
	}
		
}

问题出现的原因

我百度了一下,并且问了身边的同学(嵌入式大佬),才发现自己存在着很严重的问题。

原来,因为我是直接用STM32开发板给舵机供电,而且舵机从静态到转动的一瞬间需要的电流非常大(但是舵机一旦转起来后需要的电流又不是很大),这就导致给STM32开发板供电的电流和电压突然减小,当电压下降到一个阈值的时候,单片机就会复位。

解决方法

以后当我们使用大功率外接设备或模块时(例如直流电机、舵机),一定要考虑的是供电问题,我们要保证系统电路整体的电压和电流在正常工作的范围,不要直接用单片机开发板给这些大功率设备供电!!!我们可以用电池或充电宝给这些设备供电,要是用电脑供电搞不好会把电脑干烧(同学的经验教训),反正就是给开发板和大功率设备供电的电源要分开,不能是同一个!!!现在想想我之前一直是直接电脑供电,到现在都没出事真的很幸运。。。

     

就这样吧。。。

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值