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

参考

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

  • 83
    点赞
  • 584
    收藏
    觉得还不错? 一键收藏
  • 35
    评论
STM32是一款广泛应用于嵌入式系统的微控制器。SG90舵机是一种小型的舵机,在模型制作、机器人控制等领域有着广泛的应用。 要使用STM32控制SG90舵机,首先需要连接它们之间的电路。通常,SG90舵机控制信号线需要连接到STM32控制器的一个GPIO引脚上。此外,舵机还需要供电,因此还需要为舵机连接一个适配器,并将其电源线连接到电源。 在STM32上编写程序时,可以使用STM32的开发环境,例如Keil或CubeMX等工具。在编写程序之前,首先需要导入相关的库文件,例如HAL库,以便能够使用库中提供的函数来控制GPIO引脚。 接下来,需要定义一个GPIO引脚来作为舵机控制信号引脚。可以使用HAL库提供的函数,如GPIO_Init(),来初始化该引脚。然后,可以使用HAL库提供的函数,如HAL_GPIO_WritePin(),来控制该引脚的输出电平,从而控制舵机的转动角度。 通常,SG90舵机的转动角度是通过控制信号引脚的PWM(脉冲宽度调制)来实现的。在STM32上,可以使用定时器模块和相应的PWM输出通道来生成PWM信号。通过调整PWM信号的占空比,可以控制舵机的转动角度。 最后,需要在主循环中控制舵机的转动。可以使用循环来改变舵机的转动角度,可以根据需要添加延时以控制舵机的转动速度和稳定性。 总结起来,要使用STM32控制SG90舵机,需要连接电路,导入相应的库文件,在程序中初始化GPIO引脚和定时器模块,使用PWM信号来控制舵机的转动角度,并在主循环中控制舵机的转动。
评论 35
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值