这个问题困扰了我一晚上才解决,我觉得很有必要发出来,第一是希望一些新手同志少走弯路,第二也是为了提醒自己以后不要再犯这种错误。
发现的问题及经过
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开发板供电的电流和电压突然减小,当电压下降到一个阈值的时候,单片机就会复位。
解决方法
以后当我们使用大功率外接设备或模块时(例如直流电机、舵机),一定要考虑的是供电问题,我们要保证系统电路整体的电压和电流在正常工作的范围,不要直接用单片机开发板给这些大功率设备供电!!!我们可以用电池或充电宝给这些设备供电,要是用电脑供电搞不好会把电脑干烧(同学的经验教训),反正就是给开发板和大功率设备供电的电源要分开,不能是同一个!!!现在想想我之前一直是直接电脑供电,到现在都没出事真的很幸运。。。
就这样吧。。。