STM32F103RCT6驱动SG90舵机-完成正反转角度控制

这篇具有很好参考价值的文章主要介绍了STM32F103RCT6驱动SG90舵机-完成正反转角度控制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、SG90舵机介绍

SG90是一种微型舵机,也被称为伺服电机。它是一种小型、低成本的直流电机,通常用于模型和机器人控制等应用中。SG90舵机可以通过电子信号来控制其精确的位置和速度。它具有体积小、重量轻、响应快等特点,因此在各种小型机械设备上得到了广泛应用。

SG90舵机通常用于各种小型机械设备中,例如:

模型控制:SG90舵机可以用于遥控汽车、飞机、船只和其他模型的转向、加速和刹车等控制。

机器人控制:SG90舵机也广泛应用于机器人领域,例如可以控制机器人的头部旋转、臂部移动等。

相机云台:SG90舵机可以用于控制相机的运动,例如实现云台的左右旋转和上下移动。

自动化系统:在一些自动化系统中,SG90舵机可以用来控制小型机械臂或手指的运动。

总之,SG90舵机适用于需要精确定位和紧凑设计的应用场景。

STM32F103RCT6驱动SG90舵机-完成正反转角度控制

STM32F103RCT6驱动SG90舵机-完成正反转角度控制

二、普通IO口模拟PWM驱动SG90舵机

以下是一个简单的示例代码,用于通过PB5普通IO口产生模拟PWM信号来控制SG90舵机正向旋转和反向旋转:

#include "stm32f10x.h"

#define PWM_FREQ 50  // 设置PWM信号频率为50Hz
#define SERVO_MIN_PULSE_WIDTH 500  // 舵机最小脉宽500us
#define SERVO_MAX_PULSE_WIDTH 2500  // 舵机最大脉宽2500us

void delay_us(uint32_t us) {
  uint32_t count = us * (SystemCoreClock / 1000000) / 9;
  while(count--);
}

void servo_rotate(uint16_t pulse_width) {
  GPIO_SetBits(GPIOB, GPIO_Pin_5);  // 设置PB5输出高电平
  delay_us(pulse_width);  // 延时等待脉宽结束
  GPIO_ResetBits(GPIOB, GPIO_Pin_5);  // 设置PB5输出低电平
  delay_us(20000 - pulse_width);  // 延时保持50Hz的PWM周期
}

int main(void)
{
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);  // 使能GPIOB时钟

  GPIO_InitTypeDef GPIO_InitStructure;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;  // PB5口
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  // 推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  // 最大输出频率为50Mhz
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  while(1) {
    // 控制舵机正向旋转360°
    for (int i = SERVO_MIN_PULSE_WIDTH; i <= SERVO_MAX_PULSE_WIDTH; i += 10) {
      servo_rotate(i);
    }
    for (int i = SERVO_MAX_PULSE_WIDTH; i >= SERVO_MIN_PULSE_WIDTH; i -= 10) {
      servo_rotate(i);
    }
    
    // 控制舵机反向旋转360°
    for (int i = SERVO_MAX_PULSE_WIDTH; i >= SERVO_MIN_PULSE_WIDTH; i -= 10) {
      servo_rotate(i);
    }
    for (int i = SERVO_MIN_PULSE_WIDTH; i <= SERVO_MAX_PULSE_WIDTH; i += 10) {
      servo_rotate(i);
    }
  }
}

在这个代码中,我们首先定义了PWM频率以及舵机的最小和最大脉宽。然后,我们实现了一个延时函数delay_us(),用于产生指定微秒数的延时。接下来,我们实现了一个servo_rotate()函数,用于控制舵机的旋转。

servo_rotate()函数中,我们将PB5口设置为高电平,并延时等待一段时间,使得舵机旋转到相应的角度;然后将PB5口设置为低电平,延时保持PWM周期的长度,以达到模拟PWM信号的效果。

在主函数中,我们通过循环控制舵机旋转360度,并在正向和反向旋转之间进行切换。具体来说,我们通过循环执行servo_rotate()函数,并改变脉宽的值,实现舵机的旋转。

需要注意的是,这个示例代码只是一个简单的演示,实际使用中可能需要根据舵机的具体型号和应用场景进行调整。同时,由于使用的是延时产生模拟PWM信号,因此控制的精度可能会受到其他因素的影响,如果需要更高的控制精度,可以考虑使用硬件定时器来产生PWM信号。

三、通过定时器输出PWM控制SG90舵机

(1)配置定时器4的通道1为PWM模式,并且设置频率为50Hz,占空比为5%~10%。

代码如下:

// 开启TIM4时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);

// 定时器4 PWM模式配置
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Period = 1999;   // 72M / (2*2000) = 18KHz
TIM_TimeBaseStructure.TIM_Prescaler = 35;  // 分频系数36
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);

// 定时器4通道1 PWM输出配置
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCStructInit(&TIM_OCInitStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 100;           // 初始值
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM4, &TIM_OCInitStructure);

// 开启定时器4
TIM_Cmd(TIM4, ENABLE);

(2)使用定时器4的通道1输出PWM信号,使舵机正向旋转360°,即将占空比由5%10%逐渐增加至12.5%2.5%。代码如下:

for (int i = 100; i <= 250; i += 10) {
    TIM_SetCompare1(TIM4, i);
    delay_ms(50);
}

(3)使用定时器4的通道1输出PWM信号,使舵机反向旋转360°,即将占空比由12.5%2.5%逐渐减小至5%10%。代码如下:

for (int i = 250; i >= 100; i -= 10) {
    TIM_SetCompare1(TIM4, i);
    delay_ms(50);
}

在上面的代码中,delay_ms()函数是一个简单的延时函数,用于控制每次占空比变化后等待一段时间再进行下一步操作。需要自己实现这个函数。

另外,SG90舵机正向旋转和反向旋转的具体占空比可能有所不同,需要根据实际情况调整代码中的占空比值。文章来源地址https://www.toymoban.com/news/detail-439005.html

到了这里,关于STM32F103RCT6驱动SG90舵机-完成正反转角度控制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32F103RCT6 介绍

    ==================================================================================== 2、 LQFP 封装结构 3、 LQFP封装结构 4、芯片资源介绍(很久以前,面试的时候有被别人问到过,还要介绍32 的时钟系统) 4.1 内核 ① 32-bits ARM Cortex-M3 CPU ② 72 Mhz 主频 ③ 256Kb to 512Kb flash(RCT6 是256Kb) 4.2 时钟系统

    2024年02月13日
    浏览(50)
  • 学STM32(STM32F103RCT6)

    第一章 了解STM32 为什么使用STM32而不是8051? 是因为51的频率太低,无法满足计算需求?是51的管脚太少,无法满足众多外设的IO? 是51的功耗太大,电池挺不住?是51的功能太弱,而你要使用SPI、I2C、ADC、DMA? 是51的内存太小而你要存储的东西太多? 当你需要使用STM32某些功能,而51实

    2023年04月09日
    浏览(43)
  • stm32f103rct6引脚功能表格

    脚号 引脚名称 主功能 默认复用 重定义 备注 1             VBAT VBAT -- -- 说明1 2             PC13-TAMPER-RTC PC13 TAMPER-RTC -- 说明3 3             PC14-OSC32_IN PC14 OSC32_IN -- 说明3 4             PC15-OSC32_OUT PC15 OSC32_OUT -- 说明3 5             OSC_IN OSC_IN -- CAN_RX 晶振

    2024年02月06日
    浏览(44)
  • STM32F103RCT6——定时器简单用法

    STM32F10xx参考手册英文和中文版 百度网盘:https://pan.baidu.com/s/1Z2nB0WVJIxvm3VOI9MQiiw 提取码:lxlx STM32F103RCT6数据手册 链接:https://pan.baidu.com/s/1tRchgf-5C1MN4W58vQ9zPg 提取码:lxlx STM32F103RCT6包括,高级控制定时器TIM1和TIM8,通用定时器TIM2-5,基本定时器TIM6和TIM7. 高级控制定时器TIM1,TI

    2024年02月08日
    浏览(54)
  • stm32f103rct6使用内部晶振作为时钟源

    stm32f103rct6(库函数版例程)使用内部晶振8M,倍频64M 参考 https://blog.csdn.net/oHuanCheng/article/details/105112884 http://www.openedv.com/forum.php?mod=viewthreadtid=286233 https://blog.csdn.net/ll148305879/article/details/106138302 修改system_stm32f10x.c文件中的void SystemInit(void)函数 内部时钟用到了FLASH,需要添加s

    2024年02月07日
    浏览(150)
  • 从零开始制作STM32F103RCT6小车(一)

            仅以此系列给实验室的学弟学妹作为小车制作教程来使用,后续的内容我会在这个暑假陆续更新出来,本篇的内容是新建一个适用于STM32F103RCT6的工程         接下来的操作几乎是基于STM32F1xx系列的固件库,这里我给大家列出链接 STM32F1xx系列固件库               

    2023年04月08日
    浏览(57)
  • stm32F103RCT6使用FFT运算分析波形详解(细致教学)

    最近学校电赛队伍招新,出的招新题就是低频示波器的。之前一直没有弄懂FFT,借着这次机会实现了一下,做了一个小示波器 FFT原理简述 FFT,就是快速傅里叶变换,这个操作能够将时域信号转化成频域信号,然后对信号进行分析 这样说可能有点抽象。讲细点就是指能够直观

    2024年02月14日
    浏览(49)
  • STM32F103RCT6 -- 基于FreeRTOS 的USART1 串口通讯

    使用 FreeRTOS 提供的队列(Queue)机制来实现数据的接收和发送 TX - PA9 RX - PA10 波特率:9600 数据位:8bit 校验位:无 停止位:1bit 数据格式: RX: 55 AA 06 00 06 31 02 24 01 FC 80 TX: 55 AA 06 00 06 32 01 24 01 B8 70 55 AA – 帧头 06 - 数据字节数,不包括帧头,不包括校验位 00 06 – 模块 31 02 24

    2024年02月16日
    浏览(42)
  • STM32F103RCT6电路设计及绘制方法和学习体会

    目录 1电路图各部分原理分析 1.1通信-下载板块接口电路 1.1.1 通信模块 1.1.2 显示灯 1.2电源转化电路 1.2.1 电源转化 1.3晶振电路 1.4 OLED显示屏接口电路 1.5 独立按键电路 1.6 JTAG/SWD调试接口电路 1.7 STM32微控制器电路 1.7.1 副芯片原理 1.7.2 主芯片原理 1.8 外扩引脚 1.9 显示灯 2图纸的

    2024年02月14日
    浏览(56)
  • RFID课程设计--基于STM32F103RCT6的智能门禁系统,STM32RCT6+RC522+OLED+DHT11+4*4矩阵键盘

      本次课程设计要求如下,我们团队两人完成了90%的功能。   其中我们设置的是刷卡错误3次不报警,密码输入错3次报警(原理相同,大家根据需要自行修改)   然后暂时只能显示卡号和卡是第几个录入到系统中的,想到身份证号和电话(身份信息)输进去有点长就没

    2024年01月16日
    浏览(78)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包