设计分享 | STM32F103RCT6利用PWM驱动SG90舵机并用按键控制

wx:嵌入式工程师成长日记

https://mp.weixin.qq.com/s?__biz=Mzg4Mzc3NDUxOQ==&mid=2247484157&idx=1&sn=3f856d17fc0aa04fcbcb9a45a46bdbfe&chksm=cf4307a5f8348eb3455f67a9a39def9e8aa24d3cefa534fbb41926b6a34f6dc255cc5f18f088&token=1690205545&lang=zh_CN#rdicon-default.png?t=M85Bhttps://mp.weixin.qq.com/s?__biz=Mzg4Mzc3NDUxOQ==&mid=2247484157&idx=1&sn=3f856d17fc0aa04fcbcb9a45a46bdbfe&chksm=cf4307a5f8348eb3455f67a9a39def9e8aa24d3cefa534fbb41926b6a34f6dc255cc5f18f088&token=1690205545&lang=zh_CN#rd

具体功能实现

当第一次按下按键KEY0时,OLED上的角度显示30,舵机转动30°;每按下一次按键OLED和舵机都改变30°,最后一次按下时,舵机直接转动180°回到最初的位置

STM32F103RCT6原理图

01

器件

STM32F103RCT6,OLED屏,七根杜邦线 ,SG90舵机

02

前后展示图

前展示图(开始位置0°)

此时,OLED屏上显示0°,舵机处在0°的位置

后展示图(转动至60°)

此时,OLED上显示60°,舵机处在60°的位置

知识介绍

TIM_Cmd

使能和失能外围设备(开启定时器时钟)

TIM_CtrlPWMOutputs()

使用PWM时,仅高级定时器必须开启这个,使能主输出,否则PWM将不能正常输出。其中高级定时器有TIM1和TIM8

SG90舵机控制原理

引脚定义及复用

以下三个图时STMF103系列的引脚定义图

举个例子:本文我们驱动GPIOA的Pin_1口,对应的时钟是TIM2,通道是CH1

PWM各参数值计算公式

PSC:预分频值

CCR:输出比较寄存器

TIM_RepetitionCounter()

只有在高级定时器才能用到

基本定时器:TIM6,TIM7

通用定时器:TIM2~TIM5

高级定时器:TIM1,TIM8

其中TIM1和TIM8的时钟是由APB2输出产生,其他则是由APB1输出产生

主函数代码(C语言)KEIL5实现

#include "stm32f10x.h"        // Device header

#include "Delay.h"

#include "OLED.h"

#include "Servo.h"

#include "Key.h"

uint8_t KeyNum;

float Angle;

int main(void)

{

OLED_Init();

Servo_Init();

Key_Init();

OLED_ShowString(1, 1, "Angle:");

while (1)

{

KeyNum = Key_GetNum();

if (KeyNum == 1)

{

Angle += 30;

if (Angle > 180)

{

Angle = 0;

}

}

Servo_SetAngle(Angle);

OLED_ShowNum(1, 7, Angle, 3);

}

}

工程文件请在前面vx处领取~

问题解答

Q

PWM调制定理需要用到哪些函数?

A

GPIO_InitTypeDef

TIM_TimeBaseInitTypeDef

TIM_OCInitTypeDef

TIM_SetCompare2

https://mp.weixin.qq.com/s?__biz=Mzg4Mzc3NDUxOQ==&mid=2247484157&idx=1&sn=3f856d17fc0aa04fcbcb9a45a46bdbfe&chksm=cf4307a5f8348eb3455f67a9a39def9e8aa24d3cefa534fbb41926b6a34f6dc255cc5f18f088&token=1690205545&lang=zh_CN#rdicon-default.png?t=M85Bhttps://mp.weixin.qq.com/s?__biz=Mzg4Mzc3NDUxOQ==&mid=2247484157&idx=1&sn=3f856d17fc0aa04fcbcb9a45a46bdbfe&chksm=cf4307a5f8348eb3455f67a9a39def9e8aa24d3cefa534fbb41926b6a34f6dc255cc5f18f088&token=1690205545&lang=zh_CN#rd

### SG90舵机原理图 SG90舵机是一种常见的小型舵机,广泛应用于各种机器人项目和DIY电子制作中。该舵机内部主要由直流电机、减速齿轮组、电位器以及控制电路组成。 #### 舵机构造概述 舵机外壳内含有一个微型直流电动机作为动力源,通过一组精密设计的齿轮来放大扭矩并降低速度。为了能够精确反馈当前位置给控制系统,在输出轴上安装有一个可旋转的电位计(Variable Resistor),它随着输出轴一起转动并将位置信息转换成电压信号返回给内部控制芯片[^1]。 #### 控制机制解析 对于像SG90这样的模拟舵机而言,其接收来自外部控制器发出的标准PWM (Pulse Width Modulation) 信号来进行操作。具体来说就是利用不同宽度的正脉冲去指示目标角度: - 当接收到持续时间为`0.5 ms` 的高电平时,表示要转向最左边的位置 (`0°`); - `1 ms` 对应中间偏左一点(`45°`); - 中间位置则对应于大约`1.5 ms` 高电平; - 同样地, `2 ms` 和 `2.5 ms` 分别代表接近右侧极限处(`135°`, `180°`) [^4]. 这种基于时间间隔变化而非频率改变的方式使得即使供电电压有所波动也不会影响到最终定位精度. #### 接线说明 通常情况下,SG90舵机会有三条引脚用于连接电源与信号输入: |颜色 | 功能 | |-----|------------| |棕色/黑色| GND 地线 | |红色 | VCC 正极 (+5V) | |橙色/黄色| PWM 输入端 | 这些引脚可以直接接入Arduino或其他微控制器板子上的相应管脚以便编程控制舵机动作[^3]. ```c++ // 示例代码展示如何使用Arduino库函数servo.h 来操控SG90舵机 #include <Servo.h> Servo myservo; void setup() { myservo.attach(9); // 将伺服对象绑定至数字引脚9 } void loop() { for (int pos = 0; pos <= 180; pos += 1) { // 执行一次完整的扫动周期 myservo.write(pos); delay(15); } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值