STM32控制SG90舵机
简介
通过使用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舵机相关推荐
- STM32的SG90舵机驱动
今天来讲一下如何使用STM32来驱动SG90舵机 舵机:舵机是一种位置(角度)伺服的驱动器,适用那些需要角度不断变化并可以保持的控制系统.舵机只是一种通俗的叫法,其实质是一个伺服马达. 驱动SG90舵 ...
- 树莓派-10-安装jupyter并控制SG90舵机
1 开发工具jupyter notebook 1.1 安装jupyter #(1)安装jupyter notebook $ sudo pip3 install jupyter $ sudo pip3 ...
- 51单片机控制SG90舵机、MG90S舵机
舵机的控制信号为周期是20ms 的脉宽调制(PWM)信号,其中脉冲宽度从0.5ms-2.5ms,相对应舵盘的位置为0-180度,呈线性变化.也就是说,给它提供一定的脉宽,它的输出轴就会保持在一个相对应 ...
- mblock控制SG90舵机模块
[1.关于SG90舵机] SG90舵机是Arduino中常用的一种舵机.这是一种模拟舵机,和数字舵机不同,模拟舵机需要持续发送控制脉冲,才能使舵机旋转到某个角度并保持. Arduino中使用SG90舵 ...
- 51单片机控制sg90舵机
1.PWM PWM,英文名Pulse Width Modulation,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就 ...
- STM32F103单片机控制SG90舵机
前言 在智能衣柜系统中,试用SG90旋转0°-180°,模拟衣柜的开关门,舵机正转开门,180°-0°反转模拟一个关门的现象. 一,SG90舵机 1.1SG90链接: [淘宝]https://m.tb ...
- STM32驱动sg90舵机失败
背景: 十月份参加学校举办的Robomaster校内赛,使用sg90舵机驱动机械臂夹取小球. 遇到问题: 使用STM32单片机的定时器输出PWM来驱动舵机,一直无法使舵机运 ...
- 基于STM32驱动SG90舵机
1.舵机介绍 这边对SG90舵机进行一个简短的文字介绍: 舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms-2.5ms范围,总间隔为2ms.脉冲的宽度将决定马达转动的距 ...
- 树莓派控制多个舵机_树莓派控制SG90舵机
SG90舵机硬件接口: SG90 一共三根线,红线接5v电源,棕线GND,黄线为数据控制线,接到GPIO上舵机参数: SG90 脉冲周期为20ms,脉宽0.5ms-2.5ms对应的角度-90到+90, ...
- Arduino ESP8266控制SG90舵机输出PWM信号
1. 什么是舵机: 在机器人机电控制系统中,舵机控制效果是性能的重要影响因素.舵机可以在微机电系统和航模中作为基本的输出执行机构,其简单的控制和输出使得单片机系统非常容易与之接口. 舵机是一种位置(角 ...
最新文章
- asp.net 取得上一页的url
- 自学python的书籍-不可错过的十本Python好书
- 四种ASP网页跳转代码
- WIndows via C/C++ 学习(12)权限上下文
- matlab ceil,matlab中的fix、round、floor、ceil的区别与含义
- printf的两个需要注意的问题:无符号整数和64位整数
- Android平台和java平台 DES加密解密互通程序及其不能互通的原因
- 通过建站学运维1901-08任务
- webstorm 添加php插件,webstorm常用插件分享
- 话里话外:明白比智慧更重要
- VIM设置-发现VIM的美
- tp3.2 相同应用绑定多个入口文件,不同的入口文件可以绑定不同的模块
- OSChina 周二乱弹 —— 我国领先世界的IT技术
- 原创 C++应用程序在Windows下的编译、链接:第二部分COFF/PE文件结构
- 牛顿莱布尼茨公式 几何解释
- 【年终总结】我的2015
- JAVA 守护线程 Deamon
- 妈妈帮上云之路:云上平台架构与运维实践
- 监控突然显示服务器故障,网络监控出现服务器故障怎么办
- 摆渡人 --如果命运是一条孤独的河流,谁会是你的灵魂摆渡人
热门文章
- 黑色炫酷网址安全跳转GO跳转PHP源码
- IDEA 代码分析工具
- Android仿微信朋友圈发动态功能(相册图片多选)
- r语言 面板数据回归_在R语言中进行面板数据分析
- oracle怎么查询临时表空间大小,如何查看oracle临时表空间当前使用了多少空间的大小...
- 计算机新建里没有word,为什么右键新建没有word,右键没有新建word文档
- 2021年web前端开发视频教程零基础自学HTML/VUE/JS全栈项目实战全套课程
- cat 几行_CAT工具教程与解疑—SDL Trados 2021来了,分享一些简单测评体验
- 文件共享锁溢出 请增加MaxLocksperFile注册表项值
- Java初级程序员面试中应该如何准备?一般公司对Java开发的要求有哪些?