【STM32F103】PWM驱动舵机(SG90&MG995)

PWM

关于如何发出PWM可以参考我之前的文章。

【STM32F103】TIM定时器&PWM-CSDN博客

SG90&MG995

以这两款舵机为例是因为我手上碰巧只有这两款舵机。不过实际上舵机的操作基本上差不了多少,基本上都是给频率为50Hz的PWM,然后就可以让舵机旋转不同角度。

下面是我截取自某宝卖家给的说明书的关于舵机的介绍

1.       什么是舵机:

    在机器人机电控制系统中,舵机控制效果是性能的重要影响因素。舵机可以在微机电系统和航模中作为基本的输出执行机构,其简单的控制和输出使得单片机系统非常容易与之接口。

   舵机是一种位置(角度)伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。目前在高档遥控玩具,如航模,包括飞机模型,潜艇模型;遥控机器人中已经使用得比较普遍。舵机是一种俗称,其实是一种伺服马达。  

2.     其工作原理是:

控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。它内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱动芯片决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。当然我们可以不用去了解它的具体工作原理,知道它的控制原理就够了。就象我们使用晶体管一样,知道可以拿它来做开关管或放大管就行了,至于管内的电子具体怎么流动是可以完全不用去考虑的。

3.     舵机的控制:

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

   0.5ms--------------0度;

   1.0ms------------45度;

   1.5ms------------90度;

   2.0ms-----------135度;

   2.5ms-----------180度;

我们只需要知道我们要操作舵机,那么就给它频率为50Hz,占空比大于等于2.5%并且小于等于12.5%的PWM就可以控制舵机旋转角度了。占空比越大旋转的角度越大。

一些电气参数什么的随便找个网店,商家都会贴出来。

简单来说就是SG90和MG995都是只能旋转180度,它们之间的区别就在于MG995更贵,MG995的扭矩以及旋转速度什么的更快,总之就是性能更好一点。

没什么可说的,那就简单测评一下吧。

SG90

SG90就长得这个样子,很小巧一个玩意儿。接出来三根线,黄色红色棕色。

一般来说红色接VCC,棕色接GND,黄色接PWM(一般来说的,具体还是要看商家)。

工作电压为:4.8-7.2V。我们一般接个5V就可以了。

运行速度为:0.3秒/60度

尺寸:23mmX12.2mmX29mm

重量:9克

扭矩:1.5kg/cm

当然,上面都是商家给的参数。

我们还是自己实测一下。

没给他通电的时候我们也是可以自己扭动它的。

SG90直接给它掰的话是可以掰差不多两百多度的。

然后不通电的时候扭动它用的力度差不多等于扭开一个已经开过的瓶盖,还是比较轻松的。

MG995

MG995长得这样样子,跟SG90相比属于是大块头了。

尺寸:40.7*19.7*42.9mm

重量 :66.2克

反应转速:无负载速度0.17秒/60度(4.8V);0.13秒/60度(6.0V)

工作电压;3.0V-7.2V。3V我试过了,基本上没有啥用,我们还是接5V即可。

工作扭矩:13KG/cm

测试发现最多可以掰差不多270度左右,但是它还是只能自己旋转180度。

掰动这个明显比掰动SG90要多费点力。差不多是扭开一瓶没开过的矿泉水瓶的程度。

STM32F103驱动代码

#include "stm32f10x.h"                  // Device header
#include "Delay.h"

int main(void){
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);     //打开TIM2的外设时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    GPIO_InitTypeDef gitd;
    gitd.GPIO_Mode=GPIO_Mode_AF_PP;                         //配置为复用推挽输出
    gitd.GPIO_Pin=GPIO_Pin_0;
    gitd.GPIO_Speed=GPIO_Speed_2MHz;
    GPIO_Init(GPIOA,&gitd);
    
    TIM_InternalClockConfig(TIM2);                          //选择内部时钟(72MHz)作为时钟源
    TIM_TimeBaseInitTypeDef itd;
    itd.TIM_ClockDivision=TIM_CKD_DIV1;                     //时钟1分频
    itd.TIM_CounterMode=TIM_CounterMode_Up;                 //向上计数模式
    itd.TIM_Period=1000-1;                                   //设置自动重装器的值
    itd.TIM_Prescaler=1440-1;                                 //设置预分频器的值
    itd.TIM_RepetitionCounter=0;                            //重复计数器的值,但是仅高级定时器有效
    TIM_TimeBaseInit(TIM2,&itd);
    
    TIM_OCInitTypeDef itd1;
    itd1.TIM_OCMode = TIM_OCMode_PWM1;                      //比较输出模式为PWM1
    itd1.TIM_OCPolarity = TIM_OCPolarity_High;              //输出极性为高电平
    itd1.TIM_OutputState=TIM_OutputState_Enable;            //使能
    itd1.TIM_Pulse=0;                                       //初始化输出比较的阈值          
    TIM_OC1Init(TIM2,&itd1);
    
    TIM_Cmd(TIM2,ENABLE);                                   //使能定时器
    while(1){
        
        TIM_SetCompare1(TIM2,25);           //占空比为2.5%;角度为0
        Delay_s(1);     
        TIM_SetCompare1(TIM2,50);           //占空比为5%;角度为45
        Delay_s(1);
        TIM_SetCompare1(TIM2,75);           //占空比为7.5%;角度为90
        Delay_s(1);
        TIM_SetCompare1(TIM2,100);          //占空比为10%;角度为135
        Delay_s(1);
        TIM_SetCompare1(TIM2,125);          //占空比为12.5%;角度为180
        Delay_s(1);
        TIM_SetCompare1(TIM2,150);          //占空比为15%;角度还是180,做测试是否真的只能转180度用的.
        Delay_s(1);
    }
    
}

 PWM代码部分我直接复制我之前的博文。

我们主要要做的就是修改PWM的频率和占空比。频率需要为50,因此我设置的自动重装计数器的值为(1000-1),10的整数倍比较好计算占空比的比率。预分频器就设置为(1440-1),这样发出的PWM就是50Hz的了。

代码中我用的TIM2的通道1,因此对应的引脚是GPIOA的0号引脚。因此我这边接线是SG90/MG995的红线接到ST-Link的5V,棕线与STM32共地,黄线接到GPIOA的0号引脚,也就是接收PWM。

这样就可以通过PWM来操作这两个型号的舵机啦,两个舵机共用一套代码都行。

其他型号的舵机改改应该也能用。

<think>嗯,用户之前让我帮忙设计了一个智能宠物喂食系统的硬件清单和架构,现在他们需要补充所缺的硬件清单,以及接下来要画的电路图,还有具体的绘制方法。首先,我需要回顾之前的对话,确保这次回答与之前的建议一致,并且没有遗漏。 用户提到的已有硬件包括STM32、HX711模块、压力传感器、SG90、MG995、MG996R舵机、ESP32 WiFi图传模块、公母线。之前的补充清单里已经列了电源模块、连接配件、机械结构等。现在需要检查是否有遗漏的硬件,特别是电路图所需的元件。比如,可能需要考虑稳压模块的连接、分线板的使用,以及各模块之间的接口。 接下来,用户需要电路图的具体绘制方法。考虑到用户希望免焊接,所以电路图中应该体现使用端子排、杜邦线连接的方式。需要明确各个模块之间的电源和信号连接,比如STM32与ESP32的UART通信,HX711与STM32的连接,舵机PWM控制,以及电源分配。 用户可能不太熟悉电路图绘制的工具和符号,所以需要推荐一些适合初学者的软件,比如Fritzing,因为它有直观的界面和大量的元件库。同时,要强调模块化设计的重要性,分开电源、控制、执行部分,这样更容易理解和调试。 另外,用户后续可能扩展喂水功能,所以在电路图中需要预留接口,比如水泵的控制引脚、水位传感器的连接。还要注意电源的分配,确保不同电压需求的模块得到正确的供电,比如舵机需要6V,而ESP32STM32需要5V和3.3V。 需要提醒用户注意防反接保护,避免电源接反而损坏元件,可以在电路图中加入二极管。同时,确保所有接地线连接正确,避免噪声干扰,尤其是在称重传感器HX711的连接中,接地要稳定。 可能还需要考虑信号线的长度和干扰,使用屏蔽线或者双绞线,但用户要求尽量简单,所以暂时先保持基础设计。调试接口如串口和SWD也需要在电路图中体现,方便后续的编程和故障排查。 最后,用户可能需要分步骤的指导,先画电源部分,再连接控制器和外设,最后检查所有连接是否正确。提供具体的示例图描述,帮助用户理解各个部分如何连接,并强调使用免焊端子排和杜邦线的方法,确保实际搭建时无需焊接,简化组装过程。</think>--- ### **一、需补充的硬件清单(电路设计相关)** | 模块/配件 | 数量 | 作用说明 | 推荐型号/备注 | |-------------------|------|------------------------------|-----------------------------------| | **电路保护** | | | | | - 自恢复保险丝 | 2 | 防止电源短路 | 0.5A/6V(舵机支路) | | - 防反接二极管 | 1 | 保护电源极性 | 1N4007(贴片或直插) | | **信号调理** | | | | | - 10kΩ上拉电阻 | 4 | HX711/ESP32信号稳定 | 0805贴片或直插 | | - 0.1μF滤波电容 | 5 | 电源去耦 | 贴片陶瓷电容(靠近芯片供电引脚) | | **调试接口** | | | | | - USB转TTL模块 | 1 | STM32/ESP32烧录与调试 | CH340G芯片,带DTR引脚 | | - SWD调试器 | 1 | STM32程序下载 | ST-Link V2 | --- ### **二、电路图设计要点** #### **1. 模块化设计(分块绘制)** - **电源部分**: - 输入:12V → LM2596降压模块 → 输出5V和6V - 5V → AMS1117-3.3V → 给STM32核心板 - **关键连接**: - 所有GND需共地(用粗线表示) - 电源输出端加滤波电容(例如:5V输出端并联0.1μF + 10μF电容) - **控制部分**: - STM32与ESP32通过UART交叉连接(PA9-TX → ESP32-RX,PA10-RX → ESP32-TX) - HX711连接STM32: - DT → PA0,SCK → PA1(需加10kΩ上拉电阻) - 舵机信号线: - MG996R → PB6(PWM通道1),SG90 → PB7(PWM通道2) - **扩展预留**: - 水泵控制引脚:预留PC13(通过MOS管驱动) - 水位传感器:预留PC14(模拟输入) --- #### **2. 电路图绘制步骤** **步骤1:电源分配图** ``` [12V输入] ├─→ LM2596-1(5V输出) → ESP32-VIN, HX711-VCC, SG90-V+ ├─→ LM2596-2(6V输出) → MG996R-VCC, MG995-VCC └─→ AMS1117-3.3V → STM32-3.3V ``` - **注意事项**: - 标注所有电压值和电流限制(例如:6V支路最大电流2A) - 使用**粗线**表示电源主干,细线表示信号线 **步骤2:信号连接图** - **STM32与HX711**: ``` HX711-DT → STM32-PA0 HX711-SCK → STM32-PA1 HX711-GND → STM32-GND ``` - **重点**:DT和SCK线需加10kΩ上拉电阻到3.3V - **STM32舵机**: ``` MG996R-PWMSTM32-PB6(TIM4_CH1) SG90-PWMSTM32-PB7(TIM4_CH2) ``` - **重点**:舵机PWM频率需设置为50Hz,脉宽0.5~2.5ms **步骤3:ESP32与摄像头** - **ESP32-CAM连接**: ``` 摄像头模块 → ESP32引脚 SIOC → GPIO14 SIOD → GPIO15 VSYNC → GPIO13 HREF → GPIO12 PCLK → GPIO11 XCLK → GPIO10 ``` - **重点**:摄像头电源单独从5V分支供电,避免干扰 --- ### **三、电路图绘制工具与技巧** #### **1. 推荐工具** - **Fritzing**(适合初学者): - 提供面包板视图和原理图模式 - 内置常用模块库(ESP32STM32、HX711等) - **KiCad**(专业级开源工具): - 支持分层设计,可导出PCB文件 - 需自行添加STM32/HX711符号库 #### **2. 绘图规范** - **符号标准**: - 电源符号用“箭头+电压值”(如:▼5V) - GND用“倒三角形”符号 - **标注要求**: - 关键信号线标注功能(如“UART1_TX”) - 电阻/电容标注参数(如“10kΩ 0805”) #### **3. 示例图片段** - **STM32与HX711连接**: ``` [HX711] [STM32F103] DT -----10kΩ---- PA0 | 3.3V SCK -----10kΩ---- PA1 VCC -------------- 5V GND -------------- GND ``` --- ### **四、调试与验证清单** 1. **电源测试**: - 上电前用万用表检查各支路电压(5V/6V/3.3V) - 观察LM2596模块指示灯是否正常 2. **信号验证**: - 用逻辑分析仪抓取PWM波形(确认50Hz频率) - 通过串口打印HX711原始数据(测试称重稳定性) 3. **免焊连接检查**: - 逐一摇动端子排和杜邦线,观察是否接触不良 - 重点检查大电流线路(舵机电源)是否发热 --- ### **五、下一步行动建议** 1. **先绘制模块化分图**:电源 → 控制 → 执行 → 通信 2. **优先实现核心功能电路**:HX711 + STM32 + MG996R 3. **预留扩展接口**:在STM32和电源板上留出空余引脚与端子 如果需要具体某个模块的电路图片段(如HX711详细连接),可以进一步说明! 🛠️
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值