【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 */

猜你喜欢

转载自blog.csdn.net/weixin_41865104/article/details/107677948