关于arduino驱动舵机的程序问题。以下是我的程序,为何转60度之后不回到0度。而是一直在60度来回偏转

关于arduino驱动舵机的程序问题。以下是我的程序,为何转60度之后不回到0度。而是一直在60度来回偏转,第1张

如果只是简单的想让舵机在0-60度来回转,并不限制速度的话,可以这样:

void loop()

{

myservowrite(0); //舵机转动到相应角度

delay(500);

myservowrite(60);

delay(500);

}

加个延时。 因为舵机从0-60要有个时间,你原来的程序,没等到舵机转到60度呢,就又让它转回0度,当然不行了。

如果要给定转动速度 ,你可以直接用库例程:servo-sweep

因为舵机中有电位器,输出15ms宽度的脉冲宽度是正90度,所以你可以写一个for循环,然后引进一个参数,不停地改变05ms到25ms之间的脉冲宽度就行了。(用延迟函数可以调整速度)希望能帮到你!

看一下舵机控制器主芯片旁边的双排针,使用RS232来控制的时候是有条线帽的,您要使用Arduino控制需要将条线帽拆除,用四根杜邦线连接内侧的排针和UNO控制器,连接之前将程序导入到UNO控制器中,接线顺序为:TX-RX,RX-TX,+接电源正,-接GND然后给舵机供电,就可以使用UNO控制器来控制32路舵机控制器了。

首先开明白你的舵机控制原理,它要求输入的脉冲期是20ms,其中高电平在15ms时舵臂在0位

在20ms时舵臂在右90度位 在15ms时舵臂在左90度位 舵机有3根线,一根线是电源正,另一根电源负,还有一根(一般为白线)是控制线,就是输入的脉冲信号的

程序中可以用两个定时器,一个定时20ms,另外一个定时1到2ms可变,就可以让舵机动作

下面程序供参考,先不考虑按键问题,能让舵机动作就 成功一大半

/双定时器产生PWM波,控制舵机

//定时器0负责置高电平和控制定时器1的开停,定时器1负责置低电平

#include<STC12C5AH>

#define uchar unsigned char

#define uint unsigned int

sbit PWM=P3^7;//经试验,此引脚信号可以直接送舵机不用放大

uchar b=1500;//定时15ms的初值

void Delay1ms(uint i) //1ms延时程序

{

uint j;

for(;i>0;i--)

{

for(j=0;j<125;j++)

{;}

}

}

void main()

{

b=1500;

TMOD=0X11;

TH0=(65536-20000)/256;

TL0=(65536-20000)%256;

TH1=(65536-b)/256;

TL1=(65536-b)%256;

ET0=1;

EA=1;

TR0=1;

PWM=1;

P1M0=0X0F; //低4位配置为推挽输出 ,普通51单片机无此寄存器

P1M1=0X00;

while(1)

{

P1=0; //这是让行走电机正向转动的,用的是L298N模块

b=1500;Delay1ms(2000);//直行

b=1000;Delay1ms(1000);//左转

b=1500;Delay1ms(2000);//直行

b=2000;Delay1ms(1000);//右转

b=1500;Delay1ms(2000);//直行

P1=0x05;//这是让行走电机反向转动的

b=1500;Delay1ms(2000);//后退

b=1000;Delay1ms(1000);//后左转

b=1500;Delay1ms(2000);//后退

b=2000;Delay1ms(1000);//后右转

b=1500;Delay1ms(2000);//后退

}

}

void timer0()interrupt 1//定时器0中断

{

TH0=(65536-20000)/256;

TL0=(65536-20000)%256;

PWM=1;

TR1=1;

ET1=1;

}

void timer1()interrupt 3//定时器1中断

{

TH1=(65536-b)/256;//改变b的值就可转向

TL1=(65536-b)%256;

PWM=0;

TR1=0;

ET1=0;

}

单片机系统实现对舵机输出转角的控制,必须首先完成两项任务:首先,产生基本的PWM周期信号,即产生20ms的周期信号;其次,调整脉宽,即单片机调节PWM信号的占空比。单片机能使PWM信号的脉冲宽度实现微秒级的变化,从而提高舵机的转角精度。单片机完成控制算法,再将PWM信号输出到舵机。

发一个自己原来写的简单的。

#include<reg52h>

#define uchar unsigned char

#define uint unsigned int

uchar count,jd;

sbit pwm=P1^0;

sbit jia=P3^2;

sbit jian=P3^3;

uchar code table[10] = {0x3f,0x06,0x5b,

0x4f,0x66,0x6d,

0x7d,0x07,0x7f,0x6f};

//延时函数

void delay(uchar x)

{

uchar i,j;

for(i=x;i>0;i--)

for(j=125;j>0;j--);

}

//定时器初始化

void Time0_init()

{

TMOD=0x01; //定时器0工作方式1

IE=0x82;

TH0=0xfe;

TL0=0x33; //110592MHZ晶振,05ms

TR0=1;

}

//定时器0中断程序

void Time0() interrupt 1

{

TH0=0xfe;

TL0=0x33;

if(count<jd) //判断05ms次数是否小于角度标识

pwm=1; //是,pwm输出高电平

else

pwm=0; //否,输出低电平

count=count+1;

count=count%40; //次数始终保持为40,即保持周期为20ms

}

//按键扫描

void keyscan()

{

if(jia==0)

{

delay(10);

if(jia==0)

{

jd++; //角度增加 1

count=0; //按键按下则20ms周期重新开始计时

if(jd==6)

jd=5; //已经是180度,保持

while(jia==0);

}

}

if(jian==0)

{

delay(10);

if(jian==0)

{

jd--;

count=0;

if(jd==0)

jd=1; //已经0度,保持

while(jian==0);

}

}

}

//数码管显示

void display()

{

uchar bai ,shi,ge ;

switch(jd)

{

case 1:

bai=0;

shi=0;

ge=0;

break;

case 2:

bai=0;

shi=4;

ge=5;

break;

case 3:

bai=0;

shi=9;

ge=0;

break;

case 4:

bai=1;

shi=3;

ge=5;

break;

case 5:

bai=1;

shi=8;

ge=0;

break;

}

P0=table[bai];

P2=1;

delay(5);

P0=table[shi];

P2=2;

delay(5);

P0=table[ge];

P2=3;

delay(5);

}

void main()

{

//jd=1;

count=0;

Time0_init();

while(1)

{

keyscan();

display();

}

}

电路图很简单的,几个按键,再在单片机最小系统上接出一个信号线,再给舵机供上电就可以了。

定时器0表示的是脉冲总周期20ms,定时器1表示的是正脉冲宽度(如pwm_value = 1500时表示正脉冲宽度为15ms), 而while循序只是为了改变正脉冲宽度。运行过程是:定时器0和定时器,1同时开启,此时pwm = 1,定时器1的时间到了之后pwm = 0,并关闭定时器1,等待脉冲总周期达到20ms即定时器0中断,在定时器0的中断服务中又将pwm赋值为1并开启定时器1……以这样的方式循环就可以控制舵机转动了!

舵机是一种位置伺服的驱动器,主要是由外壳、电路板、无核心马达、齿轮与位置检测器所构成。其工作原理是由接收机或者单片机发出信号给舵机,其内部有一个基准电路,产生周期为20ms,宽度为15ms 的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。经由电路板上的IC 判断转动方向,再驱动无核心马达开始转动,透过减速齿轮将动力传至摆臂,同时由位置检测器送回信号,判断是否已经到达定位。适用于那些需要角度不断变化并可以保持的控制系统。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。一般舵机旋转的角度范围是0 度到180 度。

以上就是关于关于arduino驱动舵机的程序问题。以下是我的程序,为何转60度之后不回到0度。而是一直在60度来回偏转全部的内容,包括:关于arduino驱动舵机的程序问题。以下是我的程序,为何转60度之后不回到0度。而是一直在60度来回偏转、求问单片机控制舵机连续来回转动而不停下来的C程序怎么写、按钮控制舵机的arduino程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10123730.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存