简介

通过使用STM32控制SG90舵机进行转动
PWM输出:PC6
定时器:TM3,通道1
接线如下:

控制原理及PWM配置

舵机的控制一般需要一个20ms的时基脉冲,该脉冲的高电平部分一般为0.5ms~2.5ms范围内的角度控制脉冲部分

PWM周期为20ms = (7200*200)/72000000=0.02
所以TIM_Period = 199,TIM_Prescaler = 7199

占空比 = t / T 相关参数如下:
t = 0.5ms——————-舵机会转动 0 °
t = 1.0ms——————-舵机会转动 45°
t = 1.5ms——————-舵机会转动 90°
t = 2.0ms——————-舵机会转动 135°
t = 2.5ms——————-舵机会转动180°

PWM占空比是指在一个周期内,信号处于高电平的时间占据整个信号周期的百分比,由于PWM周期为20ms,所以(以舵机会转动 45°为例),占空比就应该为1ms/20ms = 5%,所以TIM_SetCompare1的 TIMx 捕获比较 1 寄存器值就为200-200*5% = 190

参考代码

#include "pwm.h"/*******************************************************************************
* 函 数 名         : pwm_init
* 函数功能         : IO端口及TIM3初始化函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void pwm_init()
{GPIO_InitTypeDef GPIO_InitStructure;   //声明一个结构体变量,用来初始化GPIOTIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//声明一个结构体变量,用来初始化定时器TIM_OCInitTypeDef TIM_OCInitStructure;//根据TIM_OCInitStruct中指定的参数初始化外设TIMx/* 开启时钟 */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);/*  配置GPIO的模式和IO口 */GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;// PC6GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出GPIO_Init(GPIOC,&GPIO_InitStructure);//TIM3定时器初始化TIM_TimeBaseInitStructure.TIM_Period = 199; //PWM 频率=72000/(199+1)=36Khz//设置自动重装载寄存器周期的值TIM_TimeBaseInitStructure.TIM_Prescaler = 7199;//设置用来作为TIMx时钟频率预分频值TIM_TimeBaseInitStructure.TIM_ClockDivision = 0;//设置时钟分割:TDTS = Tck_timTIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;    //TIM向上计数模式TIM_TimeBaseInit(TIM3, & TIM_TimeBaseInitStructure);GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);//改变指定管脚的映射  //pC6//PWM初始化     //根据TIM_OCInitStruct中指定的参数初始化外设TIMxTIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//PWM输出使能TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;TIM_OC1Init(TIM3,&TIM_OCInitStructure);//注意此处初始化时TIM_OC1Init而不是TIM_OCInit,否则会出错。因为固件库的版本不一样。TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);//使能或者失能TIMx在CCR1上的预装载寄存器TIM_Cmd(TIM3,ENABLE);//使能或者失能TIMx外设
}

#include "public.h"
#include "pwm.h"int main()
{     pwm_init();    //PWM初始化while(1){delay_ms(100);TIM_SetCompare1(TIM3, 195);//0度delay_ms(100);TIM_SetCompare1(TIM3, 190);//45度delay_ms(100);TIM_SetCompare1(TIM3, 185);//90度delay_ms(100);TIM_SetCompare1(TIM3, 180);//135度delay_ms(100);TIM_SetCompare1(TIM3, 175);//180度delay_ms(100); }
}

参考

51单片机PWM双舵机控制详解
MG995舵机工作原理及基于STM32的驱动源代码

STM32控制SG90舵机相关推荐

  1. STM32的SG90舵机驱动

    今天来讲一下如何使用STM32来驱动SG90舵机 舵机:舵机是一种位置(角度)伺服的驱动器,适用那些需要角度不断变化并可以保持的控制系统.舵机只是一种通俗的叫法,其实质是一个伺服马达. 驱动SG90舵 ...

  2. 树莓派-10-安装jupyter并控制SG90舵机

    1 开发工具jupyter notebook 1.1 安装jupyter #(1)安装jupyter notebook $ sudo pip3 install jupyter $ sudo pip3 ...

  3. 51单片机控制SG90舵机、MG90S舵机

    舵机的控制信号为周期是20ms 的脉宽调制(PWM)信号,其中脉冲宽度从0.5ms-2.5ms,相对应舵盘的位置为0-180度,呈线性变化.也就是说,给它提供一定的脉宽,它的输出轴就会保持在一个相对应 ...

  4. mblock控制SG90舵机模块

    [1.关于SG90舵机] SG90舵机是Arduino中常用的一种舵机.这是一种模拟舵机,和数字舵机不同,模拟舵机需要持续发送控制脉冲,才能使舵机旋转到某个角度并保持. Arduino中使用SG90舵 ...

  5. 51单片机控制sg90舵机

    1.PWM PWM,英文名Pulse Width Modulation,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就 ...

  6. STM32F103单片机控制SG90舵机

    前言 在智能衣柜系统中,试用SG90旋转0°-180°,模拟衣柜的开关门,舵机正转开门,180°-0°反转模拟一个关门的现象. 一,SG90舵机 1.1SG90链接: [淘宝]https://m.tb ...

  7. STM32驱动sg90舵机失败

    背景:        十月份参加学校举办的Robomaster校内赛,使用sg90舵机驱动机械臂夹取小球. 遇到问题:        使用STM32单片机的定时器输出PWM来驱动舵机,一直无法使舵机运 ...

  8. 基于STM32驱动SG90舵机

    1.舵机介绍 这边对SG90舵机进行一个简短的文字介绍: 舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms-2.5ms范围,总间隔为2ms.脉冲的宽度将决定马达转动的距 ...

  9. 树莓派控制多个舵机_树莓派控制SG90舵机

    SG90舵机硬件接口: SG90 一共三根线,红线接5v电源,棕线GND,黄线为数据控制线,接到GPIO上舵机参数: SG90 脉冲周期为20ms,脉宽0.5ms-2.5ms对应的角度-90到+90, ...

  10. Arduino ESP8266控制SG90舵机输出PWM信号

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

最新文章

  1. asp.net 取得上一页的url
  2. 自学python的书籍-不可错过的十本Python好书
  3. 四种ASP网页跳转代码
  4. WIndows via C/C++ 学习(12)权限上下文
  5. matlab ceil,matlab中的fix、round、floor、ceil的区别与含义
  6. printf的两个需要注意的问题:无符号整数和64位整数
  7. Android平台和java平台 DES加密解密互通程序及其不能互通的原因
  8. 通过建站学运维1901-08任务
  9. webstorm 添加php插件,webstorm常用插件分享
  10. 话里话外:明白比智慧更重要
  11. VIM设置-发现VIM的美
  12. tp3.2 相同应用绑定多个入口文件,不同的入口文件可以绑定不同的模块
  13. OSChina 周二乱弹 —— 我国领先世界的IT技术
  14. 原创 C++应用程序在Windows下的编译、链接:第二部分COFF/PE文件结构
  15. 牛顿莱布尼茨公式 几何解释
  16. 【年终总结】我的2015
  17. JAVA 守护线程 Deamon
  18. 妈妈帮上云之路:云上平台架构与运维实践
  19. 监控突然显示服务器故障,网络监控出现服务器故障怎么办
  20. 摆渡人 --如果命运是一条孤独的河流,谁会是你的灵魂摆渡人

热门文章

  1. 黑色炫酷网址安全跳转GO跳转PHP源码
  2. IDEA 代码分析工具
  3. Android仿微信朋友圈发动态功能(相册图片多选)
  4. r语言 面板数据回归_在R语言中进行面板数据分析
  5. oracle怎么查询临时表空间大小,如何查看oracle临时表空间当前使用了多少空间的大小...
  6. 计算机新建里没有word,为什么右键新建没有word,右键没有新建word文档
  7. 2021年web前端开发视频教程零基础自学HTML/VUE/JS全栈项目实战全套课程
  8. cat 几行_CAT工具教程与解疑—SDL Trados 2021来了,分享一些简单测评体验
  9. 文件共享锁溢出 请增加MaxLocksperFile注册表项值
  10. Java初级程序员面试中应该如何准备?一般公司对Java开发的要求有哪些?