【PWM】HAL库控制SG90舵机

为什么舵机抖动那么厉害?如何平稳控制舵机?

控制舵机,你需要先了解舵机,上电置位(归0°),舵机参数:f=50hz,t=20ms


        --------------------------
        |0  |45 |90 |135|180|   度|
        -------------------------
        |0.5|1.0|1.5|2.0|2.5| 毫秒|
        --------------------------

占空比 =舵机角度时间/t。

定时器配置:

配置定时器pwm通道,芯片80Mhz,所以要得到周期t=20ms的pwm。配置PSC、ARR。得到是s需要转换ms。由于(舵机参数:f=50hz,t=20ms。)所以:

t=\left ( ARR+1 \right )\ast \left ( PSC+1 \right )\div TCK

TCK为时钟频率,PSC为时钟预分频系数,ARR为自动重装载值。

“4”,设置初始脉冲宽度(暂时不用管),“5”表示高电平有效,对于某些器件是低电平。 

代码:

/* USER CODE BEGIN 2 */
	
	HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);
	//开启pwm通道
	
  /* USER CODE END 2 */

10°到180°来回旋转。

注意:“pwm”变量5到25。 为什么?

对于定时中占空比计算:占空比=pwm\div \left ( ARR+1 \right )

舵机占空比=0.5\div 20

/* USER CODE BEGIN 3 */
		
		/*舵机参数:f=50hz,t=20ms
		--------------------------
		|0   |45 |90 |135|180|   度|
		-------------------------
		|0.5 |1.0|1.5|2.0|2.5| 毫秒|
		--------------------------
		*/
		static uint16_t pwm=10;
		static uint16_t dir=1;
		
		if(dir){
		
		__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, pwm);
		HAL_Delay(100);
			pwm++;
			if(pwm>25)
				dir=0;
			
		}
		else{
			pwm--;
			__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, pwm);
		HAL_Delay(100);
				if(pwm==10)
				dir=1;
		}
		
  }
  /* USER CODE END 3 */

 

  • 7
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
要使用stm32f407的HAL库控制SG90舵机,需要连接舵机的信号线到STM32F407的GPIO引脚上,并使用PWM输出来控制信号。以下是一个简单的代码示例: ```c #include "stm32f4xx_hal.h" #define SG90_PWM_PIN GPIO_PIN_9 // 选择一个GPIO引脚来控制PWM输出 #define SG90_TIM TIM1 // 选择一个定时器来产生PWM信号 void SG90_Init(void) { HAL_TIM_PWM_Init(&htim1); // 初始化定时器 TIM_OC_InitTypeDef sConfigOC; sConfigOC.OCMode = TIM_OCMODE_PWM1; // PWM模式1 sConfigOC.Pulse = 0; // 初始占空比为0 sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, SG90_PWM_PIN); // 配置PWM输出 HAL_TIM_PWM_Start(&htim1, SG90_PWM_PIN); // 启动PWM输出 } void SG90_SetAngle(uint8_t angle) { // 将角度转换为占空比 uint16_t duty_cycle = (uint16_t)(angle * 11.11 + 500); TIM_OC_InitTypeDef sConfigOC; sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = duty_cycle; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, SG90_PWM_PIN); // 修改PWM输出的占空比 } ``` 在上面的代码示例中,`SG90_Init()`函数用于初始化定时器和PWM输出,`SG90_SetAngle()`函数用于设置舵机的转动角度,其中将角度转换为占空比的公式为:`duty_cycle = angle * 11.11 + 500`。注意,SG90舵机控制信号周期为20ms,占空比范围为500-2500us,对应的角度范围为0-180度。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值