基于STM32F103C6T6HAL库控制SG90舵机

本文介绍了舵机的工作原理,重点讲解了STM32F103C6T6如何通过配置RCC时钟和定时器PWM来驱动舵机。在程序中,使用HAL库启动定时器并设置不同的占空比,实现舵机0度到180度的角度控制。通过调整定时器的CCR1寄存器值,实现了舵机角度的切换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

材料:

(1)stm32f103c6t6

(2)舵机

一、组装

舵机原理:

舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms-2.5ms范围内的角度控制脉冲部分,总间隔为2ms。以180度角度伺服为例,那么对应的控制关系是这样的:

0.5ms------------0度;
1.0ms-----------45度;
1.5ms----------90度;
2.0ms-----------135度;
2.5ms-----------180度;

 

二、主要程序

1、STM32CUBEMX配置如下: 

(1) 配置RCC时钟:

 

(2) 时钟的配置:

 

(3) 配置定时器PWM

 

三、程序 

main.c

int main(void)
{
  /* USER CODE BEGIN 1 */
 
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */
 
  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */
 
  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM1_Init();
  MX_TIM2_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
  HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);//定时器初始化
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
	
  while (1){
		
      TIM1->CCR1=250; //20ms有0.5ms高脉冲
      HAL_Delay(1000);//延时一秒

	  TIM1->CCR1=50; //20ms有2.5ms高脉冲
      HAL_Delay(1000);//延时一秒
		
 
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

 

 

 

 

 

 

 

 

控制舵机通常依赖于脉宽调制(PWM)信号,而STM32F1系列微控制器配合HAL可以高效地实现这一功能。舵机控制信号是一个周期为20ms、占空比在5%~10%之间的PWM波形,对应的角度范围一般是0°到180°。 ### 1. 硬件准备 - **MCU型号**:STM32F103系列 - **开发环境**:STM32CubeMX + Keil MDK / STM32CubeIDE - **外设配置**:使用定时器输出PWM信号(如TIM2或TIM3) - **连接方式**:将舵机信号线连接到MCU的PWM输出引脚(如PA0) ### 2. 配置定时器生成PWM信号 使用STM32CubeMX配置定时器: - 选择一个通用定时器(如TIM2) - 设置时钟源为内部时钟 - 设定定时器的预分频器(Prescaler)和自动重载寄存器(ARR),使得PWM频率为50Hz(周期20ms) 例如: - 系统时钟为72MHz - 预分频器设为71,则定时器时钟为1MHz - 自动重载值设为19999(即20ms周期) 通道设置为PWM模式1或模式2[^2],并设定初始比较值(CCR)来控制占空比。 ### 3. HAL代码实现 #### 初始化代码(由CubeMX生成) ```c void MX_TIM2_Init(void) { htim2.Instance = TIM2; htim2.Init.Prescaler = 71; htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 19999; htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1); } ``` #### 设置PWM占空比函数 ```c void set_servo_angle(uint16_t angle) { uint16_t ccr_value; // 计算角度对应的CCR值:5%~10% 对应 0°~180° ccr_value = (angle * 1000 / 180) + 500; // 500us ~ 2500us __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, ccr_value); } ``` 在主循环中调用 `set_servo_angle()` 函数即可控制舵机转动到指定角度。 ### 4. 完整流程总结 1. 使用STM32CubeMX配置定时器为PWM输出模式,并生成初始化代码。 2. 在main函数中启动PWM通道。 3. 编写角度映射函数,将角度转换为对应的PWM占空比。 4. 调用函数控制舵机旋转到目标角度。 通过上述步骤,可以实现基于STM32F1与HAL的精确舵机角度控制。该方法适用于大多数标准模拟舵机,也可扩展用于多舵机系统。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值