51单片机(六)驱动sg90舵机

文章目录

sg90介绍

        SG90 是一款小型伺服电机,是一种定位精度较高的驱动器,可以精确地控制电机转子位置。SG90 伺服电机的工作原理基于普通直流电机,但它通过内部的控制电路和位置反馈机制来实现精确的位置控制。

sg90工作原理

  1. 控制信号:伺服电机的控制是基于输入的脉冲宽度调制(PWM)信号。控制信号通常是一个周期约为20毫秒的方波,脉冲宽度(高电平持续时间)通常在1到2毫秒之间变化。

  2. 位置反馈:内部的电位计(变阻器)与输出轴连接,能够提供电机当前位置的反馈。变阻器把位置转换为电压信号,控制电路将这个电压信号与它从PWM信号中解码得到的目标位置进行比较。

  3. 控制调整:当控制电路发现当前位置与目标位置不符时,它会调整电机的方向和速度,以使输出轴转动到所需位置。

  4. 驱动电机:控制电路增加或减少流经电机的电流,驱动电机旋转到正确的位置。

  5. 维持位置:当输出轴达到目标位置后,控制电路会使用它的电位计反馈来维持这个位置。如果出现任何偏移,电路将重新调整电机,以保持输出轴在目标位置。

sg90输出pwm

        sg90输出pwm的周期为20ms,sg90输出pwm的占空比与电机转动角度的关系如下:

        (1)0.5ms 脉宽的PWM信号可能会使 SG90 转到 0 度的位置。

        (2)1.5ms 脉宽通常会使它转到中间位置,大约是 90 度。

        (3)2.5ms 脉宽可能会使 SG90 转到 180 度的位置。

        也就是说,pwm脉宽增加1/90ms,电机转动1°

全部代码

 sg90.c

#include "sg90.h"

unsigned char angle_value = 5;
unsigned char cnt = 0;

void timer2_init(void)
{
	T2MOD= 0x00;	  //向上计数		     
	CP_RL2=0;         //16位自动重装
	RCAP2H=(65536-100)/256;	  //给RCAP2H和RCAP2L赋初值
	RCAP2L=(65536-100)%256;    //外部晶振12MHz时,定时时间为0.1ms
	EA=1;            //总中断使能
	ET2=1;           //定时器2中断使能
	TR2=1;           //定时器2开始运行
}

void set_value(unsigned char t) //设置脉宽,t = 5为0°,t = 15为90°,t = 25为180°
{
	angle_value = t;
}

void timer2_isr(void) interrupt 5 
{
	TF2=0;    //清除标志位
	cnt++;    //记录定时次数
	if(cnt < angle_value) //高电平时间
	{
		sg90_p =1;
	}
	else                  //低电平时间
	{
		sg90_p =0;
	}
	if(cnt == 200)
	{
		cnt= 0;           //恢复计数初值
	}
}

 sg90.h

#ifndef __SG90_H_
#define __SG90_H_

sbit sg90_p = P2^1;

void timer2_init(void);
void set_value(unsigned char t);

#endif

总结

        驱动sg90需要输出pwm方波,51单片机的定时器没有比较输出功能,因此使用定时器中断计数的方式依次输出高低电平,形成200ms周期方波,关于sg90的更多用法请参考网上教程

 

<think>好的,我现在需要帮助用户找到使用51单片机驱动SG90舵机的代码示例或教程。用户已经提供了一些相关的引用资料,我需要仔细分析这些引用,提取有用的信息,并按照用户的要求组织回答。 首先,我查看用户提供的引用内容。引用[1]提到了51单片机控制SG-90舵机实现精确角度转动的实验,并提到附录有完整C语言代码。引用[2]是关于51单片机学习笔记,其中第二部分详细讨论了SG90舵机的控制,包括硬件连接、控制信号和代码示例。引用[3]提到蓝牙模块控制模拟舵机,但可能重点在接口方面。引用[4]则直接提供了通过51单片机控制SG90舵机按角度正反转的代码,包括延时函数和PWM控制的具体实现。 接下来,我需要整理这些信息,确保回答符合用户的要求:结构清晰,分步骤讲解,使用正确的中文和LaTeX格式,生成相关问题,并正确添加引用标识。 首先,回答部分需要包含控制原理、硬件连接、PWM信号参数、代码示例和注意事项。代码部分需要用正确的格式展示,可能还需要解释关键部分,比如PWM的计算方法。引用标识需要自然添加在相关段落的末尾。 然后,生成相关问题需要考虑用户可能感兴趣的扩展方向,比如参数调整、多舵机控制、外部控制集成等。 在检查过程中,要确保所有数学公式或技术术语使用正确的LaTeX格式,例如PWM周期20ms应写成$20ms$,占空比计算可能需要用公式表示,例如脉冲宽度为$0.5ms + \text{角度} \times 11.11\mu s$,这里需要注意单位转换和数值的正确性。 同时,要验证代码示例是否正确,是否与引用中的内容一致。例如,引用[4]中的代码使用了delay函数生成PWM,这可能在实际项目中因阻塞延迟而受限,但作为示例是可行的。需要指出这一点在注意事项中。 最后,确保回答中没有使用Markdown格式,但代码块需要用三个反引号包裹,并注明语言为python或其他。但用户提供的示例中使用的是Python,而这里实际代码是C语言,所以需要正确标注。</think>根据引用资料,以下是使用51单片机控制SG90舵机的详细实现方案: ### 一、SG90控制原理 舵机通过PWM信号控制旋转角度,信号周期$20ms$,脉冲宽度对应$0°-180°$范围: - $0.5ms$ → $0°$ - $1.5ms$ → $90°$ - $2.5ms$ → $180°$[^4] 角度转换公式: $$ \text{脉冲宽度} = 500\mu s + \text{角度} \times 11.11\mu s/^{\circ} $$ ### 二、硬件连接 1. 舵机信号线 → P1.0(可自定义) 2. VCC → 5V电源(建议独立供电) 3. GND → 共地[^2] ### 三、代码实现 ```c #include <reg51.h> sbit servoPin = P1^0; // 定义控制引脚 // 延时函数(12MHz晶振) void delay_us(unsigned int us) { while(us--) { _nop_(); _nop_(); _nop_(); _nop_(); // 约1μs延时 } } // 角度控制函数 void setAngle(unsigned char angle) { unsigned int highTime = 500 + angle * 11.11; // 计算高电平时间 servoPin = 1; delay_us(highTime); servoPin = 0; delay_us(20000 - highTime); // 保持周期20ms } void main() { while(1) { setAngle(0); // 转至0° delay_ms(2000); // 保持2秒 setAngle(90); // 转至90° delay_ms(2000); setAngle(180); // 转至180° delay_ms(2000); } } ``` ### 四、关键参数说明 | 参数 | 值域 | 说明 | |------------|-----------|--------------------| | PWM周期 | $20ms$ | 固定不可更改[^4] | | 脉冲宽度 | $500-2500\mu s$ | 对应$0°-180°$范围 | | 控制精度 | $\pm1°$ | 受机械结构限制[^3] | ### 五、优化建议 1. 使用定时器中断生成PWM信号(提升系统响应) 2. 增加死区保护(避免角度超限导致舵机损坏) 3. 添加滤波电容(提高抗干扰能力)[^2]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值