欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 名人名企 > STM32之SG90舵机控制

STM32之SG90舵机控制

2025/2/22 2:09:01 来源:https://blog.csdn.net/qq_50749196/article/details/145636471  浏览:    关键词:STM32之SG90舵机控制

目录

前言:

一、硬件准备与接线

1.1 硬件清单

1.2 接线

二、 SG90舵机简介

1.1 外观

 1.2 基本参数

1.3 引脚说明 

1.4 控制原理

1.5 特点

1.6 常见问题

三、 单片机简介

四、 程序设计 

4.1 定时器配置

4.2 角度控制函数

4.3 主函数调用

五、 总结


前言:

STM32F103C8T6 是一款性价比极高的ARM Cortex-M3内核微控制器,广泛应用于嵌入式开发。SG90舵机 则是小型舵机的代表,常用于机器人、智能家居等场景。本文将通过硬件连接、PWM信号配置、代码实现等步骤,详细讲解如何用STM32F103C8T6控制SG90舵机。

一、硬件准备与接线

1.1 硬件清单

器件数量备注
STM32F103C8T6最小系统板1核心控制器
SG90舵机1工作电压4.8-6V,信号线需PWM
5V电源模块1独立供电,避免板载电流不足
杜邦线若干连接电路

1.2 接线

SG90舵机           STM32F103C8T6        外部电源

棕色线(GND)  →    GND引脚            →  GND
红色线(VCC)  →    连外部5V             →  5V
橙色线(信号)   →    PB0(TIM3_CH3)

注意:若需驱动多个舵机,建议使用独立电源供电,避免STM32板载电源过载。

二、 SG90舵机简介

1.1 外观

 1.2 基本参数

参数数值
工作电压4.8V - 6V(典型5V)
电流消耗100mA(空闲),250mA(运行)
扭矩1.2kg·cm(4.8V),1.6kg·cm(6V)
转速0.12秒/60°(4.8V),0.10秒/60°(6V)
重量9克
尺寸22.2mm × 11.8mm × 31mm
转动角度180°(部分型号支持360°)
齿轮材质塑料(部分型号为金属齿轮)
接口类型3针(信号、电源、地)

1.3 引脚说明 

SG90舵机通常有3根线

棕色线(GND):接地。

红色线(VCC):接电源(4.8V-6V)。

橙色线(信号线):接收PWM信号控制角度。

1.4 控制原理

PWM信号控制

  • 信号周期:20ms(50Hz)。

  • 脉冲宽度:0.5ms - 2.5ms,对应角度0° - 180°。

1.5 特点

优点

  • 体积小、重量轻:适合空间受限的项目。

  • 价格低廉:成本低,适合批量使用。

  • 易于控制:标准PWM信号接口,兼容性强。

缺点

  • 扭矩较小:仅适合轻负载场景。

  • 塑料齿轮易磨损:长时间高负载工作可能导致损坏。

1.6 常见问题

1)舵机抖动或不转动

  • 检查电源电压是否足够。

  • 检查PWM信号是否正确。

2) 舵机发热严重

  • 检查是否超负荷运行。

  • 确保转动范围内无机械卡阻。

3) 角度不准确

  • 校准PWM信号脉冲宽度。

  • 检查舵机齿轮是否磨损。

三、 单片机简介

STM32F103C8T6最小系统板:

本文使用的开发板为STM32F103C8T6最小系统板,SG90舵机使用到的引脚为PB0引脚。 

四、 程序设计 

4.1 定时器配置

使用 TIM3的通道3(PB0)生成PWM,步骤如下:

1) 时钟配置

  • 系统时钟设为72MHz(默认配置)。

  • TIM3时钟源为APB12总线(72MHz)。

2) 定时器参数计算

  • PWM频率:50Hz → 周期20ms 。

  • 预分频值(PSC):72MHz / (719 + 1) = 1MHz → 每个计数周期10μs。

  • 自动重装载值(ARR):20,000μs / 10μs = 2000 → ARR = 1999(从0计数)。

3) 脉冲宽度计算(以90°为例):

  • 1.5ms = 1500μs → 占空比 = 1500 / 20000 = 7.5%。

  • 比较寄存器(CCR):1500 → CCR = 1500 - 1 = 1499

定时器初始化代码如下:

void SG90_PWM_Init(u16 arr, u16 psc)
{GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;// 使能定时器TIM3时钟,注意TIM3时钟为APB1,而非APB2RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);// 使能PWM输出GPIO口时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;       // 定时器TIM3的PWM输出通道3,TIM3_CH3GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure); // 初始化GPIOTIM_TimeBaseStructure.TIM_Period = arr;//自动重装值TIM_TimeBaseStructure.TIM_Prescaler =psc; //时钟预分频数TIM_TimeBaseStructure.TIM_ClockDivision = 0;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//TIM向上计数模式TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //初始化TIM3//初始化TIM3_CH3的PWM模式TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStructure.TIM_Pulse = 0;TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;TIM_OC3Init(TIM3, &TIM_OCInitStructure);TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);//使能通道的预装载寄存器TIM_ARRPreloadConfig(TIM3, ENABLE); //使能重装寄存器TIM_Cmd(TIM3, ENABLE);//使能定时器TIM3,准备工作 
}

初始化参数如下: 

SG90_PWM_Init(1999,719);  //初始化舵机

4.2 角度控制函数

将角度转换为对应的占空比,角度最大为180° 。

void SG90_Set_Angle(uint8_t angle)
{if (angle > 180)angle = 180;uint16_t duty = 10 * (angle + 45) / 9; // 角度转化为占空比TIM_SetCompare3(TIM3, duty); // 设置占空比    
}  

4.3 主函数调用

SG90_Set_Angle(0);  //占空比2.5%,0度
delay_ms(1000);
SG90_Set_Angle(90);  //占空比7.5%,90度
delay_ms(1000);

五、 总结

        通过STM32F103C8T6的定时器PWM功能,可精准控制SG90舵机角度。关键在于正确配置定时器的预分频值和自动重装载值,并合理映射角度到脉宽。本方案成本低、可靠性高,适合机器人、智能家居等应用场景。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词