STM32控制SG90舵机

2019-08-23来源: eefocus关键字: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;   //声明一个结构体变量,用来初始化GPIO


TIM_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;// PC6

GPIO_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_tim

TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式

TIM_TimeBaseInit(TIM3, & TIM_TimeBaseInitStructure);


GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);//改变指定管脚的映射 //pC6


//PWM初始化   //根据TIM_OCInitStruct中指定的参数初始化外设TIMx

TIM_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);

}

}

关键字:STM32  控制SG90  舵机

编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic472316.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:用PWM控制舵机(以是stm32为例)
下一篇:STM32学习日志--使用DMA功能自动更新PWM的输出

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM8S学习01——SPI&IIC

1、温习IIC总线协议1)I2C 总线的一些特征1> 只要求两条总线线路 一条串行数据线 SDA 一条串行时钟线 SCL2> 每个连接到总线的器件都可以通过唯一的地址和一直存在的简单的主机 从机关系软件设定地址 主机可以作为主机发送器或主机接收器3> 它是一个真正的多主机总线 如果两个或更多主机同时初始化数据传输可以通过冲突检测和仲裁,防止数据被破坏4> 串行的 8 位双向数据传输位速率在标准模式下可达 100kbit/s 快速模式下可达 400kbit/s 高速模式下可达 3.4Mbit/s5> 片上的滤波器可以滤去总线数据线上的毛刺波 保证数据完整6> 连接到相同总线的 IC 数量只受到总线的
发表于 2019-09-16

STM8S学习02——ADC

一、ADC_转换模式1、ADC支持5种转换模式:单次模式,连续模式,带缓存的连续模式,单次扫描模式,连续扫描模式。2、单次模式在单次转换模式中, ADC仅在由ADC_CSR寄存器的CH[3:0]选定的通道上完成一次转换。该模式是在当CONT位为0时通过置位ADC_CR1 寄存器的ADON位来启动的。一旦转换完成,转换后的数据存储在ADC_DR寄存器中, EOC(转换结束)标志被置位,如果EOCIE被置位将产生一个中断。3、连续和带缓存的连续模式在连续转换模式中,ADC在完成一次转换后就立刻开始下一次的转换。当CONT位被置位时即将ADC设为连续模式,该模式是通过置位ADC_CR1寄存器的 ADON 位来启动的。(1)如果缓冲功能没有
发表于 2019-09-16

STM8S学习05——EEPROM读写操作C语言程序

/*这两天项目开发中,用到STM8的EEPROM功能,几个数据要掉电保存,在网上也查了一下EEPROM操作,发现网上出现的问题主要有两点:1、EEPROM读写不成功;2、EEPROM读写的时间太长;看了一下ST的库函数,自己测试了一下,没有发现什么问题,比较正常;在读写EEPROM期间,也有动态扫描LED数码管,没有发现数码管有闪烁。操作过程中:1、开发平台:STM8S105K4T6 IAR6.3 ST库版本 V2.1.02、操作EEPROM,使用到的库函数:  FLASH_Unlock(FLASH_MEMTYPE_DATA);  while (FLASH_GetFlagSt
发表于 2019-09-16

STM8S学习04——网关学习

连接到另一个网络的“关口”。也就是网络关卡。网关(Gateway)又称网间连接器、协议转换器。默认网关在网络层上以实现网络互连,是最复杂的网络互连设备,仅用于两个高层协议不同的网络互连。网关的结构也和路由器类似,不同的是互连层。网关既可以用于广域网互连,也可以用于局域网互连。说明:由于历史的原因,许多有关TCP/IP的文献曾经把网络层使用的路由器称为网关,在今天很多局域网采用都是路由来接入网络,因此通常指的网关就是路由器的IP!在OSI中,网关有两种:一种是面向连接的网关,一种是无连接的网关。当两个子网之间有一定距离时,往往将一个网关分成两半,中间用一条链路连接起来,我们称之为半网关。(OSI是Open Syst
发表于 2019-09-16

STM8S学习03——寄存器版本的一些程序

();while(1){GPIO_WriteReverse(GPIOG, GPIO_PIN_0);Delay(50000);}}void Delay(unsigned int t){while(t--);}#ifdef USE_FULL_ASSERT;void assert_failed(u8 *file, u32 line){while(1){}}#endif/* stm8s_it.c 中的代码如下: *//*...INTERRUPT_HANDLER(CLK_IRQHandler,2){//清除中断标志位CLK_ClearITPendingBit(CLK_IT_SWIF);//完成切换CLK_ClockSwitchCmd(ENABLE
发表于 2019-09-16

解决stm8会卡在串口中断的问题

原因串口进入了OR(过载错误)中断解决方法必须添加if(UART1_GetITStatus(UART1_IT_RXNE )!= RESET),若不添加,会导致UART1->DR被异常读取,不断进入中断处理函数若UART的RXNE状态位已经被置1,串口又收到数据,将会进入OR(过载错误)中断,需要先读取UART_SR,再读取UART_DR才可把OR位中断状态清零,调用UART1_GetITStatus(UART1_IT_RXNE )即是读取UART_SR在调用UART1_ReceiveData8()读取了UART1->DR后即可清除中断UART1_IT_RXNE标志位INTERRUPT_HANDLER
发表于 2019-09-16

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved