标题: 单片机控制SG90舵机 如何精准一些? [打印本页]

作者: 363249    时间: 2020-3-4 12:17
标题: 单片机控制SG90舵机 如何精准一些?
本帖最后由 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;
        }
}



作者: 51hei**1140    时间: 2020-3-4 14:29
你好!
这个应该可以做到每一度一个控制角度;
再精确估计是不行了,没有进一步试过。
作者: lovexulu    时间: 2020-3-4 17:41
受限于舵机精度,单片机驱动可以做到十分之一度。甚至更高
作者: zheng0401    时间: 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;
        }
}
作者: boboidundun    时间: 2020-12-16 08:49
zheng0401 发表于 2020-4-26 14:34
楼主  根据你的程序修改的   如有问题还请见谅  
不能达到你所说的一度一度的   但是还是可以达到你所写的 ...

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





欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1