标题:
单片机控制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