找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2487|回复: 5
打印 上一主题 下一主题
收起左侧

刚学c51单片机控制舵机,请问SG90要怎么控制?

[复制链接]
跳转到指定楼层
楼主
ID:879865 发表于 2021-1-23 07:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
第一次学习使用c51控制sg90舵机,晶振12MHz。
我是想让舵机1秒钟转动一个角度,但是指示灯亮4下左右,也就是4秒钟才转动一个角度,0度和180度有时候才转一半,是我的程序哪里没写对吗,还是接线有问题,还是舵机质量有问题?我在Proteus 8中模拟一个舵机运行很正常。

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

sbit pwm=P2^0;      //信号输出
sbit led=P2^1;                //信号灯

void delay500us(void)   //延时0.5毫秒
{
    unsigned char a,b;
    for(b=71;b>0;b--)
        for(a=2;a>0;a--);
}

void delay1ms500us(void)   //延时1.5毫秒
{
    unsigned char a,b;
    for(b=3;b>0;b--)
        for(a=248;a>0;a--);
}

void delay2ms500us(void)   //延时2.5毫秒
{
    unsigned char a,b;
    for(b=227;b>0;b--)
        for(a=4;a>0;a--);
}

void delay1s(void)                   //延时1秒
{
    unsigned char a,b,c;
    for(c=167;c>0;c--)
        for(b=171;b>0;b--)
            for(a=16;a>0;a--);
    _nop_();  
}

void main()
{
        led=0;                        //信号灯初始为亮
        while(1)
        {
                led=~led;
                pwm=1;
                delay500us();                //0度
                pwm=0;
                delay1s();                        //延时1秒再发下一个指令
        
                led=~led;
                pwm=1;
                delay1ms500us();          //90度
                pwm=0;
                delay1s();                        //延时1秒再发下一个指令
        
                led=~led;
                pwm=1;
                delay2ms500us();         //180度,但是这里有时候能转180度,有时候转不到
                pwm=0;
                delay1s();                        //延时1秒再发下一个指令
        }
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:879865 发表于 2021-1-23 08:22 | 只看该作者
花了1小时,自己搞定了,改成下面的程序就行了,原来模拟舵机要不停地给它发指令才会转到特定角度,发一次居然不够,我太高估它了
#include<reg52.h>
#include<intrins.h>
#define COUNT 15                //指令个数

sbit pwm=P2^0;      //信号输出
sbit led=P2^1;                //信号灯

void delay500us(int t)   //延时0.5毫秒
{
    unsigned char a,b,n;
        for(n=0;n<t;n++)
            for(b=71;b>0;b--)
                for(a=2;a>0;a--);
}

void delay1s(void)                   //延时1秒
{
    unsigned char a,b,c;
    for(c=167;c>0;c--)
        for(b=171;b>0;b--)
            for(a=16;a>0;a--);
    _nop_();  
}

void s0()
{
        unsigned char i;
        led=~led;
        for(i=0;i<COUNT;i++)
        {
                pwm=1;
                delay500us(1);          //90度
                pwm=0;
                delay500us(39);                        //满20ms指令周期
        }
}

void s90()
{
        unsigned char i;
        led=~led;
        for(i=0;i<COUNT;i++)
        {
                pwm=1;
                delay500us(3);          //90度
                pwm=0;
                delay500us(37);                        //满20ms指令周期
        }
}

void s180()
{
        unsigned char i;
        led=~led;
        for(i=0;i<COUNT;i++)
        {
                pwm=1;
                delay500us(5);          //90度
                pwm=0;
                delay500us(35);                        //满20ms指令周期
        }
}

void main()
{
        led=0;                        //信号灯初始为亮
        while(1)
        {
                s0();
                delay1s();
                s90();
                delay1s();
                s180();
                delay1s();
        }
}

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:226055 发表于 2021-1-23 11:00 | 只看该作者
发一次的是数字舵机,模拟舵机确实如此
回复

使用道具 举报

地板
ID:879865 发表于 2021-1-23 11:16 | 只看该作者
谢谢大佬帮我确定一下,我也是自己乱试试出来的,刚又研究了一上午,可以用中断定时器控制任意角度了
回复

使用道具 举报

5#
ID:448556 发表于 2021-1-23 13:37 | 只看该作者
好多Delay()
回复

使用道具 举报

6#
ID:902749 发表于 2021-4-26 16:49 | 只看该作者
半只恐龙 发表于 2021-1-23 11:16
谢谢大佬帮我确定一下,我也是自己乱试试出来的,刚又研究了一上午,可以用中断定时器控制任意角度了

你好,我也是51单片机的初学者,看了你的代码觉得对舵机的理解清楚了很多(很厉害),请问能不能将你用定时器中断舵机的方法也分享到这帖子下面呢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表