舵机的PWM调节

舵机的PWM调节,第1张

这个我做过

脉冲周期是可以变化的

我用50hz

即20ms

控制过

100hz即10ms

也控制过

200hz

5ms

也控制过

不过200hz的

不稳定

颤抖

最后我用的是100hz

不管用哪个脉冲频率

15ms

时是在中间的

这个是不精确的

因为好一点的舵机

像FUTABA

3XXX的

都标的是xxxxus的

例如有一款直升飞机模型上的舵机标的是1520us

说明1520us的高电平就可以使它在中间的位置

周期10ms,高电平1ms

可想而知

是在45度附近的

舵机最好一直有信号控制他

要不有电磁干扰的时候会出现危险

以前我在帮研究生做自控直升机的时候

好几万的设备在天上

掉下来就没有啦

当然了低成本的就不怕了

有疑问百度HI我

我QQ309099548

//12MHz

#include <reg51h>

void InitTimer0(void)

{

TMOD = 0x01;

TH0 = 0x0B1;

TL0 = 0x0E0;

EA = 1;

ET0 = 1;

TR0 = 1;

}

void delay(void) //误差 0us 延时1ms 此处可以修改高电平周期

//修改此处的延时可以更改舵机转的角度 ,45度具体是多少 你可以试试

{

unsigned char a,b,c;

for(c=1;c>0;c--)

for(b=142;b>0;b--)

for(a=2;a>0;a--);

}

void main(void)

{

InitTimer0();

P1_2=0;

while(1);

}

void Timer0Interrupt(void) interrupt 1

{

//20ms中断

TH0 = 0x0B1;

TL0 = 0x0E0;

P1_2=1;

delay();

P1_2=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的P0口要是做IO口的话需要上拉10K电阻,或者你拿其他IO口。舵机只要有点源就嗡嗡响,如果你信号脉宽和周期没错的话应该是IO口没上拉的原因。模拟舵机的信号端上电瞬间就是会转动一下,这个没什么问题,如果手转舵机没阻力就是没信号,反之就是有信号的。

time()函数是定时器1的init初始化函数,在主函数里,应该在while函数的前面;

从程序来看,pwm = 1,是一个定时器周期,PWM = 0是18个周期。

定期起中断入口程序应该这样写:void time1_isr() interrupt 3 using 1

PWM = Pulse Width Modulation, 脉宽调制, 就是在一个周期内,一部分时间是高电平,另一部分时间是低电平。有个术语叫占空比。PWM 驱动舵机你要看一下步进电机的原理,快慢不是跟电压有关的,而是跟加的 PWM 波形有关。如果不考虑高电压烧毁电机,提高电压只能提高电机的驱动能力,不能提高转速。当然,电压过低磁力不够,驱动力会弱,电机也可能走不动。一般驱动舵机会有专门的驱动新芯片,通过 A+, A-,B+, B-,两组信号来驱动。

//TMOD &= 0xF0;

TMOD = 0x01;

TMOD |=0x01;

是或等于

以下你只申明没有定义

void ClosePWM();

unsigned int i;

舵机频率50hz就是说一周期是20ms,占空比在百分之25到125可以从-90转到90度

单片机内部有工作的晶振频率,定时器就是基于这个频率计时,根据程序可以知道,20ms计时20000,所以计时器每加一的时间为1us,这个程序的意思就是先工作定时器0,20ms后输出置为1并打开定时器1,定时器1计时到15ms后触发中断使得输出为0,即占空比为15/20=百分之75,中间位置

定时器的寄存器加到0会触发中断,所以寄存器都写负数,如想要20ms就写-20000,这样往上加到0需要的计数的次数就为20000,一次计数为1us,所以为20ms,而寄存器是由两个八位寄存器组成的,所以20000要分开写

建议有时间可以去看一下郭天祥老师的51单片机视频,能搜到而且不多,貌似第三集是讲的定时器

以上就是关于舵机的PWM调节全部的内容,包括:舵机的PWM调节、单片机控制舵机程序、怎么让舵机定时转等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/zz/10220158.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存