舵机控制 —— 一篇就够
来看文章的都是想快速学会使用的,咱们挑重点的说
【舵机有多种,本文仅介绍固定180度舵机(MG996R舵机、SG90舵机、MG90S舵机等)】
红色 棕色 黄色 VCC GND 信号线
2.如何让舵机转动起来?
舵机的转动角度跟输入脉冲有关,详细看下表:
脉冲总周期20ms | ||
---|---|---|
角度 | 高电平 | 低电平 |
0 | 0.5ms | 19.5ms |
45 | 1ms | 19ms |
90 | 1.5ms | 18.5ms |
135 | 2ms | 18ms |
180 | 2.5ms | 17.5ms |
可以发现一个规律:角度每次增加45度,高电平时间相应增加0.5ms
总周期 - 高电平脉冲 = 低电平脉冲
舵机角度的转动就是通过高、低脉冲的变化实现的
知道了规律,这下子我们可以来写代码了↓
#include sbit PWM=P1^1; //定义给舵机信号线接的I/O口void Delay(unsigned char i) //12MHz 延时函数 { unsigned char a,b; //该段延时函数Delay(1)=0.5ms for(;i>0;i--) for(b=71;b>0;b--) for(a=2;a>0;a--);}/总周期20ms 通过调节占空比实现舵机需要转动的角度舵机代码用定时器控制更方便稳定,本文方便读者了解使用,使用延时计算 其功能可正常使用*/void zero(void) //0度 子程序{ PWM=1; Delay(1);//高电平 Delay(1)=0.5ms。因为周期为20ms,所以低电平就是19.5ms PWM=0; Delay(39); //低电平 Delay(39)=19.5ms}void one(void) //45度 子程序{ PWM=1; Delay(2); //高电平 Delay(2)=1ms PWM=0; Delay(38); //低电平 Delay(38)=19ms}void two(void) //90度 子程序{ PWM=1; Delay(3);//高电平 Delay(3)=1.5ms PWM=0; Delay(37); //低电平 18.5ms}void three(void) //135度 子程序{ PWM=1; Delay(4);//高电平 Delay(4)=2ms PWM=0; Delay(36); //低电平 18ms}void four(void) //180度 子程序{ PWM=1; Delay(5); //高电平 Delay(5)=2.5ms PWM=0; Delay(35); //低电平 17.5ms}void main() //主程序{ while(1) { two(); //调用90度的子程序,实现舵机转动90度 }}//end
如果需要按键控制,可以通过改变主程序代码实现,如↓
void main(){ while(1){ if(P3_1==0) //按键接P3^1口。如果按键按下{ /* Delay(20); //10ms的按键消抖,可删,看需要添加。 if(P3_1==0) */ two(); //如果按键按下,调用舵机90度子程序,实现转动90度。 } else //否则 zero(); //舵机为0度 }}
PS:建议写代码时先写一个0度的程序,先确定舵机0度位置,方便确定舵机转动的方向和角度
相关链接:
延时函数计算软件
单片机小精灵(延时、定时计算软件)_啊维的博客-CSDN博客https://blog.csdn.net/qq_51272949/article/details/121553635?spm=1001.2014.3001.5502