1. 51单片机驱动sg20舵机模块

一.控制舵机
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();
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值