资源描述
SG90舵机
一:实物图、引脚及其参数
二:内部电路
三:结构
四:工作原理
五:PWM控制
六:注意事项
(1) 舵机的转动需要时间的,因此,程序中a值的变化不能太快,不然舵机跟不上程序。根据需要,选择合适的延时,用一个a递增循环,可以让舵机很流畅的转动,而不会产生像步进电机一样的脉动。
(2) 当舵机SG90无法正常工作一般为两个原因,工作电压不稳定或PWM值不正确
七:程序实现
在此设计的定时100us中断中:
角度Angle 度数
5 0
9 45
13 90
17 135
21 180
#include<reg52.h>
sbit P32 = P3^2; // K1(P32),按下时舵机向左转
sbit P33 = P3^3; // K2(P33),按下时舵机向右转
sbit P10 = P1^0; // P17 与舵机的信号线相接
unsigned int Time = 0; // 定义周期并初始化为0, 其量程范围为 0~175,即周期为 175*100us ≈ 20ms
// 也可不写此语句,可在 T0 中断函数中写此语句:static unsigned char Time = 0;
unsigned char Angle = 5; // 定义角度,其可为任意角度,所以此处不需初始化
void T_0() interrupt 1 // 用 PWM 方式控制舵机的转动及其角度,即导通时间比上周 期,只要改变导通的时间,即可改变其转动的角度
{
TH0 = 0x9c;
TL0 = 0x9c; // 初值为 156,即计数 100us
if(Time<Angle)
{
P10 = 1; // 舵机控制线置高电平
}
else
{
P10 = 0; // 舵机控制线置低电平
}
Time++;
if(Time==175)
{
Time = 0; // 周期查询及周期清0
}
}
void delay(unsigned int i) // 此软件延时函数用于按键的防抖动
{
for(;i<0;i--);
}
void main(void)
{
P3 = 0xff; // P3 并行口寄存器初始化
/*********************************
* 下面的程序语句是对进行 PWM
* 调制的定时器 T0 进行初始化
*********************************/
TMOD = 0x02; // 0000 0010, T0、软启、定时、工作方式二(8位自动重载)
TH0 = 0x9c;
TL0 = 0x9c; // 初值为 156,即计数 100us
TR0 = 1; // 启动定时器 T1
ET0 = 1;
EA = 1; // 切记开源、总允位
/**********************************************
* 下面的程序语句是对按键进行扫描并执行相应按键的动作
* 因按下弹性按键(因其是机械按键)时会在在抖动,所以要
* 进行判断并去抖
*************************************/
while(1)
{
if(P3!=0xff) // 判断有按键按下与否,没有时全部为高电平
{
delay(2500); // 软件编程防抖动,大约 10ms
if(P3!=0xff) // 再次判断有按键按下与否,没有时全部为高电平
{
switch(P3)
{
case 0xfb: Angle = 21;break;// 按下 K1(P32),左转
case 0xf7:Angle = 5;break;// 按下 K2(P33),右转 }
}
}
}
}
展开阅读全文