求51单片机直接控制舵机转动角度的程序

求51单片机直接控制舵机转动角度的程序,第1张

#include<REG52H>

#define OUT P0

#define CON P2

#define ms0_5Con 461

#define ms2_5Con 2304

typedef unsigned char unit8;

typedef unsigned short unit_16;

sbit servo0=OUT^0;

sbit servo1=OUT^1;

sbit servo2=OUT^2;

sbit servo3=OUT^3;

sbit servo4=OUT^4;

sbit servo5=OUT^5;

sbit servo6=OUT^6;

sbit servo7=OUT^7;

sbit KEY1=CON^0;

sbit KEY2=CON^1;

unit_16 pwm[8]={1382,1382,1382,1382,1382,1382,1382,1382}; //90,(13824,1382)

void Inter_Form()

{

TMOD|=0x01;

TH0 =0xf7;

TL0 =0x00;

TR0 =1;

ET0 =1;

EA =1;

}

void delay(unit8 x)

{

unit8 i=0;

while(x--)

{

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

}

}

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

/unit_16 Transform(uchar val)

{

//0=05ms, 45=1ms, 90=15ms, 135=2ms, 180=25ms

//25 ms F700, (12n/11059200=25/1000, n=2304, X=65536-2304=63232 > F700)

//return (unit_16)(((float)(2/180)X+05)/100011059200/12);

unit_16 a = (val+46)10;

if(a<ms0_5Con)

a=ms0_5Con;

if(a>ms2_5Con)

a=ms2_5Con;

return a;

} /

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

void Steering_UP(unit8 val)

{

if(pwm[val]>ms2_5Con)

pwm[val]=ms2_5Con;

pwm[val]=pwm[val]+10;

}

void Steering_Down(unit8 val)

{

if(pwm[val]<ms0_5Con)

pwm[val]=ms0_5Con;

pwm[val]=pwm[val]-10;

}

void main(void)

{

Inter_Form();

while(1)

{

if(!KEY1)

{

delay(2);

if(!KEY1)

Steering_UP(0);

}

else if(!KEY2)

{

delay(2);

if(!KEY2)

Steering_Down(0);

}

}

}

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

void SteeringGear() interrupt 1

{

static unit8 pwm_flag=0;

switch(pwm_flag)

{

case 1: servo0=1; TH0=-pwm[0]>>8; TL0=-pwm[0]; break;

case 2: servo0=0; TH0=-(ms2_5Con-pwm[0])>>8; TL0=-(ms2_5Con-pwm[0]); break;

case 3: servo1=1; TH0=-pwm[1]>>8; TL0=-pwm[1]; break;

case 4: servo1=0; TH0=-(ms2_5Con-pwm[1])>>8; TL0=-(ms2_5Con-pwm[1]); break;

case 5: servo2=1; TH0=-pwm[2]>>8; TL0=-pwm[2]; break;

case 6: servo2=0; TH0=-(ms2_5Con-pwm[2])>>8; TL0=-(ms2_5Con-pwm[2]); break;

case 7: servo3=1; TH0=-pwm[3]>>8; TL0=-pwm[3]; break;

case 8: servo3=0; TH0=-(ms2_5Con-pwm[3])>>8; TL0=-(ms2_5Con-pwm[3]); break;

case 9: servo4=1; TH0=-pwm[4]>>8; TL0=-pwm[4]; break;

case 10: servo4=0; TH0=-(ms2_5Con-pwm[4])>>8; TL0=-(ms2_5Con-pwm[4]); break;

case 11: servo5=1; TH0=-pwm[5]>>8; TL0=-pwm[5]; break;

case 12: servo5=0; TH0=-(ms2_5Con-pwm[5])>>8; TL0=-(ms2_5Con-pwm[5]); break;

case 13: servo6=1; TH0=-pwm[6]>>8; TL0=-pwm[6]; break;

case 14: servo6=0; TH0=-(ms2_5Con-pwm[6])>>8; TL0=-(ms2_5Con-pwm[6]); break;

case 15: servo7=1; TH0=-pwm[7]>>8; TL0=-pwm[7]; break;

case 16: servo7=0; TH0=-(ms2_5Con-pwm[7])>>8; TL0=-(ms2_5Con-pwm[7]); break;

default:TH0=0xff; TL0=0x80; pwm_flag=0;

}

pwm_flag++;

}

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

如有问题可再咨询

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

#include<reg52h>typedef unsigned int uint;typedef unsigned char uchar;sbit pwm=P0^3;//输出PWM信号uchar count=0;uint pwm_value=1500;//初值为15msuint value[]={1500,1000,1500,2000,1500};//void delay_ms(uint x){uint i;while(x--)for(i=0;i<125;i++);}void InitTimer(void){TMOD=0x11;//开定时器0,1TH0=-20000/256;//定时20MS,20MS为一个周期TL0=-20000%256;TH1=-1500/256;//定时15MS,这时舵机处于0度TL1=-1500%256;EA=1;//开总断TR0=1;//开定时器0ET0=1;TR1=1;//开定时器1ET1=1;}void timer0(void) interrupt 1//定时器0中断函数{pwm=1;TH0=-20000/256;TL0=-20000%256;TR1=1;count++;}void timer1(void) interrupt 3//定时器1中断函数{pwm=0;TH1=-pwm_value/256;TL1=-pwm_value%256;TR1=0;}void main(void)//主函数{uchar i;InitTimer();pwm_value=1500;while(1){for(i=0;i<5;i++){pwm_value=value[i];//通过数组就可以改变舵机的转角度delay_ms(1000);}}}

文库里面有一篇文献,就是讲51单片机控制舵机动作的,你去看看吧:

>

控制舵机旋转方法:

1、控制信号(如图H)是一种脉宽调制(PWM)信号,凡是微控制器能轻松的产生这种信号。在此文中,我用的是常用的Arduino开发环境下的微控制器。

2、 脉冲的高电平持续1到2毫秒(ms),也就是1000到2000微秒(µs)。在1000µs时,舵机左满舵。在2000µs时,右满舵。不过你可以通过调整脉宽来实现更大或者更小范围内的运动。

3、控制脉冲的低电平持续20毫秒。每经过20毫秒(50次每秒),就要再次跳变为高电平,否则舵机就可能罢工,难以保持稳定。不过你要是想让它一瘸一拐的跳舞,倒可以采取这种方法。

1、什么是舵机:在机器人机电控制系统中,舵机控制效果是性能的重要影响因素。舵机可以在微机电系统和航模中作为基本的输出执行机构,其简单的控制和输出使得单片机系统非常容易与之接口。舵机是一种位置(角度)伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。目前在高档遥控玩具,如航模,包括飞机模型,潜艇模型;遥控机器人中已经使用得比较普遍。舵机是一种俗称,其实是一种伺服马达。

2、工作原理:控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。它内部有一个基准电路,产生周期为20ms,宽度为15ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱动芯片决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。当然我们可以不用去了解它的具体工作原理,知道它的控制原理就够了。就象我们使用晶体管一样,知道可以拿它来做开关管或放大管就行了,至于管内的电子具体怎么流动是可以完全不用去考虑的。

清单

STM32F103C8T6 1个,Jlink下载线 1根

MG90S舵机 1个

12V电源 1个,12V转5V降压模块(给舵机供电) 1个

杜邦线数根

MG90S舵机

如图所示,舵机有三根线,红色接5V正极,黑色接地;**为信号线,接收PWM信号

实物图

输出PWM控制舵机

STM32控制舵机,总的来说是向舵机信号线发送周期为20ms的PWM(Pulse Width Modulation 脉冲宽度调制)信号来控制舵机转角,PWM脉冲的占空比决定了舵机的转角位置,对应关系如下图;

STM32靠定时器TIM实现PWM信号的输出,STM32有多个定时器,分为通用定时器和高级定时器,每个通用定时器都可以输出4路PWM,本文采用TM2_CH4,及定时器2的第4路PWM;对应STM32F103C8T6上的PB11引脚;

创建工程输出PWM

本文使用STM32CubeMX创建工程,更加简单高效,即便对单片机不熟悉也可 *** 作成功;

一、打开STM32CubeMX,新建一个工程,搜索并选择STM32F103C8,然后start project;

二、进行基本设置,配置RCC、SYS、HCLK

RCC -> 设置高速外部时钟HSE 选择外部时钟源

SYS -> 选择Debug方式 serial wire

HCLK -> 设置为72MHZ

三、设置定时器

选择TIM2

选择内部时钟源

设置Channel4为PWM模式

右侧对应管脚自动设置为复用模式

设置定时器参数

控制舵机我们需要设置PWM输出一个周期时间为20ms的信号,定时器时钟为72Mhz

预分频Prescaler设置为720-1,则单周期为72M/(Prescaler + 1) = 100Khz(001ms)

以20ms为周期,则Counter Period为20ms/001ms - 1 = 1999

此处可设定默认脉冲宽度为05ms,及05/202000 = 50

四、接下来设置输出格式

添加工程名PWM

修改IDE为MDK-ARM V5

在Code Genetator中设置包含库与工程格式

至此STM32CubeMX已设置完成,接下来GENERATE CODE,并打开文件;

在main函数中启动定时器,并输出一定的脉冲的PWM信号即可驱动舵机;

五、修改代码

在mainc文件相应位置处添加如下代码

启动PWM输出

输出PWM信号

/ USER CODE BEGIN Includes /

#include "stdioh"

/ USER CODE END Includes /

/ USER CODE BEGIN 2 /

HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_4); //启动定时器

int compareValue = 150; //将compareValue设置为50、150、250分别对应0°、90°、180°

/ USER CODE END 2 /

/ Infinite loop /

/ USER CODE BEGIN WHILE /

while (1)

{

/ USER CODE END WHILE /

/ USER CODE BEGIN 3 /

__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_4, compareValue); //输出PWM信号

HAL_Delay(10);

}

/ USER CODE END 3 /

}

登录后复制

添加完以上代码之后,编译,然后通过JLink将程序LOAD到STM32F103C8T6,将舵机信号线连接PB11(TIM2_CHANNEL4)口,并接上电源,舵机即可转动到指定角度;由以上定时器设定可知,compareValue值50、150、250 对应 05ms、15ms、25ms 对应 0°、90°、180°;若想让舵机连续转动,在50~250内循环改变compareValue值即可;

六、接线

开始时用单片机的5V输出给舵机供电,舵机哒哒哒响,但是不转,怀疑是供电不给力,单独供电后驱动成功;

JIink连接电脑和单片机,下载程序到单片机并给单片机供电

舵机**信号线接STM32F103C8T6引脚PB11,接收PWM信号

舵机红色电源线接稳压板5V输出正极,舵机黑色地线需与单片机地相连

调试

实 *** 中可能会出现各种各样的问题,以下有几种调试方法

一、舵机测试

调试模块一端接电,一段接舵机,手动模式下,舵机会跟着旋钮同步旋转,可以用来测试舵机是否健康;

二、串口调试助手

可下载串口调试助手,用ttl转USB模块连接电脑,在特定位置进行打印输出,检查程序是否按预设运行

stm32

以上就是关于求51单片机直接控制舵机转动角度的程序全部的内容,包括:求51单片机直接控制舵机转动角度的程序、急求51单片机控制舵机C语言程序,舵机可以根据设定旋转任意角度!急求啊,大神帮帮忙!非常感谢!、用51单片机产生pwm信号来控制舵机转动的程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存