SG20舵机模块与51单片机驱动详解

一.控制舵机

1.
什么是舵机

如下图所示,最便宜的舵机
sg90
,常用三根或者四根接线,黄色为
PWM
信号控制

用处:垃圾桶项目开盖用、智能小车的全比例转向、摄像头云台、机械臂等

常见的有
0-90°

0-180°
、0-360°。

IO口输出一个PWM信号给黄色线

2.
怎么控制舵机

向黄色信号线

灌入
”PWM
信号。

PWM
波的频率不能太高,大约
50HZ
,即周期
=1/
频率
=1/50=0.02s=
20ms
左右

数据:

0.5ms(高电平时间)————-0
度;
 

1.0ms(高电平时间)————45度;

1.5ms(高电平时间)————90度;

2.0ms(高电平时间)———–135度;
 

2.5ms(高电平时间)———–180度;

定义一个0.5ms的定时器模拟IO口输出PWM波,定时器需要定时
20ms,
关心的单位
0.5ms, 40
个的
0.5ms,
初值0.5m cnt++,20ms = 0.5ms * 40。

3.编程实现

#include "reg52.h"
#include <intrins.h>

sfr AUXR = 0x8E;

sbit sg20_ctrl = P1^0;
sbit led1 = P2^0;

int jd;         //转到的角度
int cnt = 0;    //计数次数

void Timer0_Init(void)      //500微秒@11.0592MHz
{
    AUXR &= 0x7F;           //定时器时钟12T模式
    TMOD &= 0xF0;           //设置定时器模式
    TMOD |= 0x01;           //配置定时器0工作模式位16位计时
    TL0 = 0x33;             //设置定时初始值
    TH0 = 0xFE;             //设置定时初始值
    TF0 = 0;                //清除TF0标志
    TR0 = 1;                //定时器0开始计时
    ET0 = 1;                //使能定时器0中断
    EA = 1;                 //
}

void Delay300ms(void)    //@11.0592MHz
{
    unsigned char data i, j, k;

    _nop_();
    i = 3;
    j = 26;
    k = 223;
    do
    {
        do
        {
            while (–k);
        } while (–j);
    } while (–i);
}

void Delay2000ms(void)    //@11.0592MHz
{
    unsigned char data i, j, k;

    _nop_();
    i = 15;
    j = 2;
    k = 235;
    do
    {
        do
        {
            while (–k);
        } while (–j);
    } while (–i);
}

void sg20_init(void)
{
    cnt++;
    TL0 = 0x33;             //设置定时初始值
    TH0 = 0xFE;             //设置定时初始值
    
    //控制PWM波
    if(cnt < jd)
    {
        sg20_ctrl = 1;
    }
    else
    {
        sg20_ctrl = 0;
    }
    
    if(cnt == 40)       //20ms到了
    {
        cnt = 0;
        sg20_ctrl = 1;
    }
}

void sg20_process(void)
{
    jd = 4;
    cnt = 0;
    Delay2000ms();
    jd = 1;
    cnt = 0;
    Delay2000ms();
}

void main(void)
{
    //使硬件稳定一会
    Delay300ms();
    
    //定时器初始化
    Timer0_Init();
    
    //赋初值
    jd = 1;
    cnt = 0;
    sg20_ctrl = 1;
    while(1)
    {
        sg20_process();
    }
}

void Timer0_Isr(void) interrupt 1
{
    sg20_init();
}
 

作者:会学嵌入式

物联沃分享整理
物联沃-IOTWORD物联网 » SG20舵机模块与51单片机驱动详解

发表回复