×
单片机 > 单片机程序设计 > 详情

STM32控制SG90舵机

发布时间:2020-05-30 发布时间:
|

简介

通过使用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);

}

}



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
51单片机CO2检测显示程序解析