新手控制舵机,编写了一段51单片机程序做测试,但是舵机只是动作了一点点,不明原因,请高手指点。

新手控制舵机,编写了一段51单片机程序做测试,但是舵机只是动作了一点点,不明原因,请高手指点。,第1张

都说了周期是20ms,‘周期’啊!!!!当然是持续的了

准确的说,舵机的控制信号,是以20ms为间隔的一系列脉宽可在15ms上下1ms范围内变动的脉冲信号,舵机角度实时最终脉宽变化

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

控制舵机宜采用两个定时器,第一个定时器定时20mS,定时结束,让某一管脚输出高电平,同时打开另一定时器,该定时器定时15至25mS,定时结束输出低电平,同时关闭自身。改变第二个定时器的时间,舵机即出现不同的角度。

#include<reg52h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

#define KeyPort P3

#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换

sbit LATCH1=P2^2;//定义锁存使能端口 段锁存

sbit LATCH2=P2^3;// 位锁存

sbit DCOUT1 = P1^1;//定义电机信号输出端口1

sbit DCOUT2 = P1^2;//定义电机信号输出端口2

unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9

unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码

unsigned char TempData[8]; //存储显示值的全局变量

/------------------------------------------------

函数声明

------------------------------------------------/

void DelayUs2x(unsigned char t);//us级延时函数声明

void DelayMs(unsigned char t); //ms级延时

void Display(unsigned char FirstBit,unsigned char Num);//数码管显示函数

unsigned char KeyScan(void);//键盘扫描

void Init_Timer0(void);//定时器初始化

/------------------------------------------------

主函数

------------------------------------------------/

void main (void)

{

unsigned char num;

Init_Timer0(); //初始化定时器0,主要用于数码管动态扫描

TempData[0]=0x5E; //'d'

TempData[1]=0x39; //'C'

TempData[2]=0x06; //'1'

TempData[5]=0x5E; //'d'

TempData[6]=0x39; //'C'

TempData[7]=0x5b; //'2'

while (1) //主循环

{

num=KeyScan(); //循环调用按键扫描

switch(num)

{

//电机1改变运行状态,数码管显示运行状态

case 1:DCOUT1=!DCOUT1;

TempData[0]=0x5E; //'d'

TempData[1]=0x39; //'C'

TempData[2]=0x06; //'1'

if(DCOUT1)

{

TempData[5]=0x3F; //'O'

TempData[6]=0x54; //'n'

TempData[7]=0;

}

else

{

TempData[5]=0x3F; //'O'

TempData[6]=0x71; //'F'

TempData[7]=0x71; //'F'

}

break;

//电机2改变运行状态,数码管显示运行状态

case 2:DCOUT2=!DCOUT2;

TempData[0]=0x5E; //'d'

TempData[1]=0x39; //'C'

TempData[2]=0x5B; //'2'

if(DCOUT2)

{

TempData[5]=0x3F; //'O'

TempData[6]=0x54; //'n'

TempData[7]=0;

}

else

{

TempData[5]=0x3F; //'O'

TempData[6]=0x71; //'F'

TempData[7]=0x71; //'F'

}

break;

default:break;

}

}

}

/------------------------------------------------

uS延时函数,含有输入参数 unsigned char t,无返回值

unsigned char 是定义无符号字符变量,其值的范围是

0~255 这里使用晶振12M,精确延时请使用汇编,大致延时

长度如下 T=tx2+5 uS

------------------------------------------------/

void DelayUs2x(unsigned char t)

{

while(--t);

}

/------------------------------------------------

mS延时函数,含有输入参数 unsigned char t,无返回值

unsigned char 是定义无符号字符变量,其值的范围是

0~255 这里使用晶振12M,精确延时请使用汇编

------------------------------------------------/

void DelayMs(unsigned char t)

{

while(t--)

{

//大致延时1mS

DelayUs2x(245);

DelayUs2x(245);

}

}

/------------------------------------------------

显示函数,用于动态扫描数码管

输入参数 FirstBit 表示需要显示的第一位,如赋值2表

示从第三个数码管开始显示,如输入0表示从第一个显示。

Num表示需要显示的位数,如需要显示99两位数值则该值

输入2

------------------------------------------------/

void Display(unsigned char FirstBit,unsigned char Num)

{

static unsigned char i=0;

DataPort=0; //清空数据,防止有交替重影

LATCH1=1; //段锁存

LATCH1=0;

DataPort=dofly_WeiMa[i+FirstBit]; //取位码

LATCH2=1; //位锁存

LATCH2=0;

DataPort=TempData[i]; //取显示数据,段码

LATCH1=1; //段锁存

LATCH1=0;

i++;

if(i==Num)

i=0;

}

/------------------------------------------------

定时器初始化子程序

------------------------------------------------/

void Init_Timer0(void)

{

TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响

//TH0=0x00; //给定初值

//TL0=0x00;

EA=1; //总中断打开

ET0=1; //定时器中断打开

TR0=1; //定时器开关打开

}

/------------------------------------------------

定时器中断子程序

------------------------------------------------/

void Timer0_isr(void) interrupt 1

{

TH0=(65536-2000)/256; //重新赋值 2ms

TL0=(65536-2000)%256;

Display(0,8); // 调用数码管扫描

}

以上就是关于新手控制舵机,编写了一段51单片机程序做测试,但是舵机只是动作了一点点,不明原因,请高手指点。全部的内容,包括:新手控制舵机,编写了一段51单片机程序做测试,但是舵机只是动作了一点点,不明原因,请高手指点。、51单片机控制舵机转角的C语言程序、请问怎么写程序能够控制舵机旋转0-90度,停留3秒,再从90转回0度等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存