设计分享 | 基于51单片机理解SG90舵机原理并用按键控制

 vx【嵌入式工程师成长日记】

https://mp.weixin.qq.com/s?__biz=Mzg4Mzc3NDUxOQ==&mid=2247484130&idx=1&sn=742e1776817dd6af6dcfac495a6f8f00&chksm=cf4307baf8348eac7fc5f527773f820d90ff77dd19c1aae5690b56baadfb3af5d55870d8ce12&token=1731405569&lang=zh_CN#rdhttps://mp.weixin.qq.com/s?__biz=Mzg4Mzc3NDUxOQ==&mid=2247484130&idx=1&sn=742e1776817dd6af6dcfac495a6f8f00&chksm=cf4307baf8348eac7fc5f527773f820d90ff77dd19c1aae5690b56baadfb3af5d55870d8ce12&token=1731405569&lang=zh_CN#rd

 

 

具体功能实现

当按下开关时,舵机的角度分别运行到0°,45°,90°,135°,180°,0°(最后停止位置),其中每转动一个角度时间延时1s。

器件:

AT89C52,sg90舵机,三根杜邦线公对母,两支按键

转动角度展示图:

转动至45°

转动至180°

转动至90°

知识介绍:

sg90舵机简介

由直流电机、减速齿轮组、传感器(可变电阻)和控制电路组成的一套自动控制系统。

直流电机是一圈圈转动的,舵机只能在一定角度内转动(有最大旋转角度比如:180度),不能一圈圈转。

外部中断:

STC89C52有4个外部中断;

STC89C52的外部中断有两种触发方式:

下降沿触发和低电平触发

下降沿触发:当按键按下不松手时只触发一次

低电平触发:当按键按下不松手时会持续触发

中断号:

由定时器和中断系统这张图来分析,可以得到定时器0的初始代码如下:

void Init_Timer0()

{

TMOD = 0x01;

TL0 = 0x33; //设置定时初值

TH0 = 0xFE; //设置定时初值

EA = 1;

ET0 = 1;

TR0 = 1;

PT0 = 1;

TF0=0;

}

PWM脉冲宽度调制定理

PWM(Pulse Width Modulation)即脉冲宽度调制,在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,来等效地获得所需要的模拟参量,常应用于电机控速、开关电源等领域

PWM重要参数:

频率 = 1 / TS            占空比 = TON / TS           精度 = 占空比变化步距

例子:在制作LED呼吸灯时,如果想要让LED亮的时间更长,只需要提高比较值。

sg90舵机接线图

舵机的输入线共有三条:

红色线——电源正线(需接5V电源才能驱动)

棕色线——电源地线

黄色线——信号线(本项目使用P2^7端口)

sg90舵机控制原理

本文采用的是定时器0来计时,初始值设为0.5ms,每次定时器溢出是0.5ms,设置一个计数值count=0,每一个0.5ms count都会自增1,加了40次就20ms,是舵机控制的一个周期。

所以0.5ms是自增一次,1ms是自增两次,1.5ms是自增三次,2ms是自增四次,2.5ms是自增五次。

主函数代码(C语言)KEIL5实现:

无按键自转代码:

#include <REGX52.H>

sbit Sg90_com = P2^7;

unsigned char compare=0,count=0; //compare比较值控制占空比大小,控制舵机转动的角度

void Delay1ms(unsigned int num) //@11.0592MHz

{

unsigned char i, j;

while(num--)

{

i = 2;

j = 199;

do

{

while (--j);

} while (--i);

}

}

void Init_Timer0()

{

TMOD = 0x01;

TL0 = 0x33; //设置定时初值

TH0 = 0xFE; //设置定时初值

EA = 1;

ET0 = 1;

TR0 = 1;

PT0 = 1;

TF0=0;

}

void main()

{

Init_Timer0();

while(1)

{

compare = 1; //0度

Delay1ms(1000);

compare = 2; //45度

Delay1ms(1000);

compare = 3; //90度

Delay1ms(1000);

compare = 4; //135度

Delay1ms(1000);

compare = 5; //180度

Delay1ms(1000);

}

}

void Timer0_Rountine() interrupt 1 //每次定时器溢出时是0.5ms

{

TL0 = 0x33; //设置定时初值

TH0 = 0xFE; //设置定时初值

count++;

//PWM控制

if(count < 40) //每一个0.5mscount都会++,加了40次就20ms,是舵机控制的一个周期

{

if(count < compare) //通过比较值控制高电平占据周期的时间,也就是占空比大小

{

Sg90_com = 1;

}

else

{

Sg90_com = 0;

}

}

else //count加到40后清零

{

count = 0;

Sg90_com = 1;

}

}



按键自转代码:

#include <REGX52.H>

sbit Sg90_com = P2^7;

sbit key1 = P3^1;    //独立按键1

sbit key2 = P3^0; //独立按键2



unsigned char compare=0,count=0; //compare比较值控制占空比大小,控制舵机转动的角度

void Delay1ms(unsigned int num) //@11.0592MHz

{

unsigned char i, j;

while(num--)

{

i = 2;

j = 199;

do

{

while (--j);

} while (--i);

}

}

void Init_Timer0()

{

TMOD = 0x01;

TL0 = 0x33; //设置定时初值

TH0 = 0xFE; //设置定时初值

EA = 1;

ET0 = 1;

TR0 = 1;

PT0 = 1;

TF0=0;

}

void main()

{

Init_Timer0();

while(1)

{

while(key1==0){

compare = 1; //0度

Delay1ms(1000);

}

while(key2==0){

compare = 5; //180度

Delay1ms(1000);

}

}

}

void Timer0_Rountine() interrupt 1 //每次定时器溢出时是0.5ms

{

TL0 = 0x33; //设置定时初值

TH0 = 0xFE; //设置定时初值

count++;

//PWM控制

if(count < 40) //每一个0.5mscount都会++,加了40次就20ms,是舵机控制的一个周期

{

if(count < compare) //通过比较值控制高电平占据周期的时间,也就是占空比大小

{

Sg90_com = 1;

}

else

{

Sg90_com = 0;

}

}

else //count加到40后清零

{

count = 0;

Sg90_com = 1;

}

}

问题解答:

Q1:代码超出版本限制如何解决?如图:

A1:用注册机对KEIL5软件进行重新破解,破解步骤链接:

Q2:延时函数如何快速自动生成?

A2:在STC-ISP中根据红色方框进行设计

Q3:单片机计时器TH0 和TL0初值的计算方法

A3:首先计算计数值:
例如:计数值=10000us(10ms转换成微秒)* 11.0592(晶振大小)/12    计算结果=9216
TH0=(65536-9216)/256     =DC
TL0=(65536-9216)%256  =00   

//8位逢256进位,整除的结果为高位,取余的结果为低位

Q4:单片机计时器TMOD设置

A4:通常情况下,定时器0的TMOD=0x01,工作模式1——16位计时计数器 (65536)

下面两张图是工作模式1和2的对比流程图:

  • 6
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 按键控制51单片机sg90舵机的步骤如下: 1. 准备好所需材料:51单片机SG90舵机、按键开关、杜邦线以及所需的电源。 2. 将SG90舵机的三个线(VCC、GND、Signal)分别连接到51单片机的电源和IO引脚。将VCC接到单片机的5V电源引脚上,将GND接到单片机的地(GND)引脚上,将Signal接到单片机的IO引脚上。 3. 将按键开关的两个针脚分别连接到单片机的IO引脚和地(GND)引脚上。 4. 编写51单片机的程序代码,实现按键控制SG90舵机的功能。首先,需要初始化IO引脚和按键开关的输入输出设置。然后,在主循环中,不断检测按键开关的状态。当按键按下时,单片机通过IO引脚控制SG90舵机的运动。可以根据需要设置舵机运动的角度和速度。 5. 通过编译、烧录和执行程序,将代码上传到51单片机中。 6. 连接好电源,并将程序运行起来。 7. 通过按下按键开关,检查SG90舵机是否按照预期的方式运动。根据需要,可以调整程序代码中的舵机运动参数,以获得所需的舵机运动效果。 总结:通过以上步骤,可以按键控制51单片机上的SG90舵机。按下按键开关可以触发单片机控制舵机的运动,从而实现各种舵机角度的控制和调整。这样的控制方式可以在很多场景中使用,例如车辆模型的遥控、机器人的动作控制等。 ### 回答2: 控制51单片机上的SG90舵机需要通过GPIO口输出PWM信号来实现角度调节。以下是一个简单的300字结果,供参考: 首先,需要了解SG90舵机工作原理SG90舵机是一种小型、低成本、高性能的模拟舵机,其主要由直流电机、减速机构和位置反馈电路组成。舵机在工作时,接收到的PWM信号的占空比决定了舵机的位置,通常情况下,SG90舵机的控制PWM信号频率为50Hz(周期为20ms),脉宽范围为0.5ms-2.5ms,其中0.5ms对应舵机的180°角度,1.5ms对应舵机的90°角度,2.5ms对应舵机的0°角度。 在51单片机上,可以利用其中的GPIO(通用输入/输出)口实现PWM输出。具体的步骤如下: 1. 配置GPIO口为输出模式,用于连接舵机。可以使用单片机的开发环境进行配置,具体方法视所使用的开发环境而定。 2. 通过编程控制GPIO口的输出信号,生成PWM波形。可以使用单片机的定时器/计数器模块来实现精确的控制。在每个周期内,根据所需要的舵机角度,计算出对应的脉宽,并将此脉宽赋值给GPIO口输出。 3. 根据实际需求,编写适当的延时函数,来控制舵机在给定的角度停留的时间。可以使用单片机的延时函数或者自行编写延时函数,保证舵机能够稳定运行。 以上是控制51单片机上的SG90舵机的基本步骤。需要特别注意的是,为了保证操作的稳定性,可以添加适当的保护电路,如电阻、电容等,以防止过电流或过电压的损坏。另外,在编程中要注意舵机的工作电压和电流限制,避免给舵机提供超出其能力范围的信号。 当以上步骤完成后,即可通过按键控制51单片机上的SG90舵机。根据按键的状态,编写相应的控制程序,通过改变PWM信号的占空比,实现舵机角度的调节。可以使用按键中断来检测按键状态的变化,然后在中断程序中更新舵机的PWM信号输出。在程序中可以设置不同的按键功能,如按下按键舵机逆时针旋转一定角度,松开按键舵机停止。根据具体需求,可以进行灵活的调整和扩展。 ### 回答3: 要按键控制51单片机上的sg90舵机,你需要做以下步骤: 1. 准备材料:51单片机sg90舵机、蓝牙模块、面包板、按键开关、跳线等。 2. 将sg90舵机连接到面包板上。将舵机的VCC连接到5V的电源,将GND连接到电源的GND,将信号线连接到51单片机的一个IO口,例如P1.1口。 3. 将按键开关连接到面包板上。一端连接到5V电源,一端连接到GND,中间引出的引脚接到另一个51单片机的IO口,例如P2.3口。引脚上需要加上一个上拉电阻。 4. 将蓝牙模块连接到面包板上。将TX引脚连接到P3.1口,将RX引脚连接到P3.0口。 5. 使用Keil等开发工具编写51单片机的程序代码。在程序中,对按键口进行轮询,如果检测到按键按下,则发送信号给舵机控制程序。在舵机控制程序中,根据接收到的信号来控制舵机旋转的方向和角度。 6. 将编写好的程序下载到51单片机中。可以选择通过USB转串口工具将程序下载到单片机中。 7. 打开蓝牙,以手机等设备与蓝牙模块进行连接。通过发送指定的命令给蓝牙模块,来控制舵机的旋转方向和角度。 通过以上步骤,你就可以实现按键控制51单片机上的sg90舵机了。你可以通过按下按键来控制舵机的旋转,也可以通过蓝牙发送命令来控制舵机的动作。这种方法可以应用于一些需要远程遥控或者按键控制舵机应用中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值