MG90S舵机驱动原理和程序代码

舵机控制原理:

舵机的控制信号为周期是 20ms 的脉宽调制(PWM)信号,其中脉冲宽度从 0.5ms-2.5ms,相对应舵盘的位置为 0-180 度,呈线性变化。也就是说,给它提供一定的脉宽,它的输出轴就会保持在一个相对应的角度上,无论外界转矩怎样改变,直到给它提供一个另外宽度的脉冲信号,它才会改变输出角度到新的对应的位置上

一般而言,舵机的基准信号都是周期为20ms,宽度为1.5ms。这个基准信号定义的位置为中间位置。

其中间位置的脉冲宽度是一定的,那就是1.5ms

角度是由来自控制线的持续的脉冲所产生。这种控制方法叫做脉冲调制。脉冲的长短决定舵机转动多大角度。

当舵机接收到一个小于1.5ms的脉冲,输出轴会以中间位置为标准,逆时针旋转一定角度。接收到的脉冲大于1.5ms情况相反。不同品牌,甚至同一品牌的不同舵机,都会有不同的最大值和最小值。一般而言,最小脉冲为1ms,最大脉冲为2ms。

可以通过调节PWM的占空比控制舵机的转向角度。

文章转载来源:https://blog.csdn.net/avrmcu1/article/details/24384745

#ifndef __STEERING_H
#define __STEERING_H
#include "sys.h"
void TIM4_PWM_Init(u16 arr,u16 psc);//TIM4_CH1
#endif


#include "steering.h"
void TIM4_PWM_Init(u16 arr,u16 psc)
{
	
	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);	
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);  
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 ;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	TIM_TimeBaseStructure.TIM_Period = arr;
	TIM_TimeBaseStructure.TIM_Prescaler =psc;
	TIM_TimeBaseStructure.TIM_ClockDivision = 0; 
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
	TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); 
	
	 
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; 
 	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; 
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; 
	TIM_OC1Init(TIM4,&TIM_OCInitStructure);  
	
	TIM_Cmd(TIM4,ENABLE);  

}
    TIM4_PWM_Init(199,7199);
    while(1)
	{
	    delay_ms(10);
	    TIM_SetCompare1(TIM4,5);	
	    delay_ms(300);
	    TIM_SetCompare1(TIM4,10);
	    delay_ms(300);
	    TIM_SetCompare1(TIM4,15);
	    delay_ms(300);
    }

应为T=20ms,所以对应的f=1/T=50HZ

频率:pwm = 72M / ((arr+1)*(psc+1))(单位:Hz)

占空比:TIM3->CCR1 / arr(单位:%)

注意:如果定时器模式选择为:

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

那么对应的输出比较极性为:

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; 

相反:

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; 
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;

 

要使用MG90S舵机,你可以使用以下代码: ```python from machine import Pin, PWM import time p2 = PWM(Pin(2)) # 创建一个PWM对象,将舵机连接到引脚2 p2.freq(50) # 设置PWM频率为50Hz # 设置舵机角度 p2.duty_u16(1638) # 设置为0度 time.sleep(1) p2.duty_u16(4915) # 设置为90度 time.sleep(1) p2.duty_u16(8192) # 设置为180度 # 逐渐改变舵机角度 for i in range(1638, 8100, 10): p2.duty_u16(i) time.sleep_ms(10) p2.duty_u16(1638) # 设置为0度 p2.deinit() # 关闭引脚上的PWM输出 ``` 这段代码使用MicroPython来控制MG90S舵机。首先,我们导入`Pin`和`PWM`模块,并创建一个PWM对象`p2`,将舵机连接到引脚2。然后,我们设置PWM频率为50Hz,这是舵机的标准频率。接下来,我们使用`duty_u16`方法来设置舵机的角度,其中1638对应0度,4915对应90度,8192对应180度。通过逐渐改变舵机的角度,我们可以实现舵机的平滑运动。最后,我们使用`deinit`方法关闭引脚上的PWM输出。 请注意,这段代码是使用MicroPython编写的,如果你使用的是其他编程语言,可能需要使用相应的库和语法来控制舵机。 #### 引用[.reference_title] - *1* [STM32F407学习笔记——MG90S舵机模块(基本控制)](https://blog.csdn.net/weixin_54121461/article/details/113999518)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [STM32CubeMX(09)MG90S舵机驱动实验](https://blog.csdn.net/qq_45138815/article/details/122002050)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [物联网开发笔记(54)- 使用Micropython开发ESP32开发板之控制MG90S舵机](https://blog.csdn.net/zhusongziye/article/details/128085911)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值