找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机控制SG90舵机 如何精准一些?

[复制链接]
跳转到指定楼层
楼主
ID:370407 发表于 2020-3-4 12:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 363249 于 2020-3-4 15:09 编辑

怎么把 n 的值变成填入 2500  ?

这样就不局限于 5-20 个位置了?    即使有误差也可以接受 或者做到每一度一个控制角度

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int

sbit pwm=P1^0;      //信号输出
sbit k1=P3^1;        //按键k1接P3^5,控制顺时针旋转
sbit k2=P3^2;        //按键k2接P3^4,控制逆时针旋转
sbit k3=P3^3;
uchar count=0;

uchar n=5;       //初始位置-在0°附近  改变n值可以改变舵机的初始位置

//这个n值在不同的舵机可能存在一点误差,可以改变他的值来试试具体位置
void delay5ms()
{
    unsigned char a,b;
    for(b=19;b>0;b--)
        for(a=130;a>0;a--);
}
void key()
{
  if(k1==0)
  {
            delay5ms();
          n=5;               //  0度

  }
    if(k2==0)
  {
            delay5ms();
         n=15;               //  90度

  }                        
   if(k3==0)
  {
            delay5ms();
         n=25;                // 180度

  }
}

void InitTimer()        //  0.1ms   11.0592Mhz
{
    TMOD = 0x01;
    TH0 = 0xFF;
    TL0 = 0XA4;
    EA = 1;
    ET0 = 1;
    TR0 = 1;
}

void main()
{
    InitTimer();
        while(1)
        {
          key();
        }
}

void Timer() interrupt 1      //特别注意此处,0--外部中断0,1--定时器中断0,2--外部中断1,3--定时器中断1,4--串行口中断1
{
    TH0 = 0xFF;
    TL0 = 0xA4;
        count++;
        if(count<=200)
        {
           if(count<=n)
           {
                      pwm=1;
           }
           else
           {
                      pwm=0;
           }
        }
        else
        {
           count=0;
           pwm=0;
        }
}


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

使用道具 举报

沙发
ID:648281 发表于 2020-3-4 14:29 | 只看该作者
你好!
这个应该可以做到每一度一个控制角度;
再精确估计是不行了,没有进一步试过。
回复

使用道具 举报

板凳
ID:687694 发表于 2020-3-4 17:41 | 只看该作者
受限于舵机精度,单片机驱动可以做到十分之一度。甚至更高
回复

使用道具 举报

地板
ID:526831 发表于 2020-4-26 14:34 | 只看该作者
楼主  根据你的程序修改的   如有问题还请见谅  
不能达到你所说的一度一度的   但是还是可以达到你所写的那三个固定值以外的角度

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int

sbit pwm=P1^0;      //信号输出
sbit k1=P3^1;        //按键k1接P3^5,控制顺时针旋转
sbit k2=P3^2;        //按键k2接P3^4,控制逆时针旋转
sbit k3=P3^3;
uchar count=0;

uchar n=5;       //初始位置-在0°附近  改变n值可以改变舵机的初始位置

//这个n值在不同的舵机可能存在一点误差,可以改变他的值来试试具体位置
void delay5ms()
{
    unsigned char a,b;
    for(b=110;b>0;b--)
        for(a=130;a>0;a--);
}
void delay1ms()
{
    unsigned char a;
    for(a=130;a>0;a--);
}
void key()
{
  if(k1==0)
  {
                delay5ms();
                if(k1==0)
                {
                         delay5ms();
          n++;               //  0度
                if(n >= 25)
                        n = 25;
                }
  }
    if(k2==0)
  {
                delay5ms();
                if(k2==0)
                {
            delay5ms();
         n--;               //  90度
                if(n <= 5)
                        n = 5;
          }
  }                        
}

void InitTimer()        //  0.1ms   11.0592Mhz
{
    TMOD = 0x01;
    TH0 = 0xFF;
    TL0 = 0XA4;
    EA = 1;
    ET0 = 1;
    TR0 = 1;
}

void main()
{
    InitTimer();
        while(1)
        {
          key();
        }
}

void Timer() interrupt 1      //特别注意此处,0--外部中断0,1--定时器中断0,2--外部中断1,3--定时器中断1,4--串行口中断1
{
    TH0 = 0xFF;
    TL0 = 0xA4;
        count++;
        if(count<=200)
        {
           if(count<=n)
           {
                      pwm=1;
           }
           else
           {
                      pwm=0;
           }
        }
        else
        {
           count=0;
           pwm=0;
        }
}
回复

使用道具 举报

5#
ID:861088 发表于 2020-12-16 08:49 | 只看该作者
zheng0401 发表于 2020-4-26 14:34
楼主  根据你的程序修改的   如有问题还请见谅  
不能达到你所说的一度一度的   但是还是可以达到你所写的 ...

你好,从if(count<=200)以后是什么意思呀?能解释一下吗?不理解。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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