STM32之SG90舵机控制(附视频讲解)

06-01 1512阅读

目录

前言:

一、硬件准备与接线

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舵机。

视频讲解链接:

STM32之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 外观

STM32之SG90舵机控制(附视频讲解)

 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°。

    STM32之SG90舵机控制(附视频讲解)

    STM32之SG90舵机控制(附视频讲解)

    1.5 特点

    优点:

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

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

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

      缺点:

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

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

        1.6 常见问题

        1)舵机抖动或不转动:

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

        • 检查PWM信号是否正确。

          2) 舵机发热严重:

          • 检查是否超负荷运行。

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

            3) 角度不准确:

            • 校准PWM信号脉冲宽度。

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

              三、 单片机简介

              STM32F103C8T6最小系统板:

              STM32之SG90舵机控制(附视频讲解)

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

              四、 程序设计 

              4.1 定时器配置

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

              1) 时钟配置:

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

              • APB1总线预分频系数为2。

              • TIM3时钟源为APB1总线(36*2=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):2000 * 7.5% = 150 → CCR = 150 - 1 = 149。

                    定时器初始化代码如下:

                    void SG90_PWM_Init(u16 arr, u16 psc)
                    {
                          GPIO_InitTypeDef GPIO_InitStructure;
                          TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
                          TIM_OCInitTypeDef TIM_OCInitStructure;
                          // 使能定时器TIM3时钟,注意TIM3时钟为APB1,而非APB2
                          RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
                          // 使能PWM输出GPIO口时钟
                          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
                          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;       // 定时器TIM3的PWM输出通道3,TIM3_CH3
                          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出
                          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
                          GPIO_Init(GPIOB, &GPIO_InitStructure); // 初始化GPIO
                     
                          TIM_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舵机角度。关键在于正确配置定时器的预分频值和自动重装载值,并合理映射角度到脉宽。本方案成本低、可靠性高,适合机器人、智能家居等应用场景。

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

目录[+]

取消
微信二维码
微信二维码
支付宝二维码