STM32控制SG90舵机原理及代码

一.SG90舵机原理

舵机的运用还是比较广泛的,那么舵机工作原理是什么呢,一般来说我们给舵机一个信号他就能工作了,那么这个信号是什么,以及如何产生的呢。这里我们需要给舵机一个PWM信号,频率是50HZ,即周期是20ms(产品手册上这样说的。)。在这个条件下不同的占空比就是不同的信号。不同的信号就能控制舵机转动角度。注意舵机只有在改变信号时才会转动,一直维持一种信号的情况舵机是不会转动。

二.控制SG90舵机

那么我们如何控制舵机呢,我们需要单片机产生一个20ms的信号PWM(产品手册上这样说的。)然后我们可以设置占空比来控制舵机如何转动。这里怎么产生PWM波和设置占空比可以参考博主的一篇文章,写的很详细。pwm详解

三.代码实例

我这里使用的是stm32f103ZET6的定时器8的通道一 PC8引脚

3.1 配置定时器


void TIM8_PWM_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
 	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8,ENABLE);	// 开启定时器时钟,即内部时钟CK_INT=72M

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
  	GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6;
  	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//设置输出速度
 	GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOC_Pin_9
	 //周期为72M/(200*7200)us=20ms
	TIM_TimeBaseStructure.TIM_Period= (200-1);							 //自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断
	TIM_TimeBaseStructure.TIM_Prescaler= (7200-1);					 //驱动CNT计数器的时钟 = Fck_int/(psc+1)
	TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;		 //时钟分频因子 ,用于配置死区时间,没用到,随意
	TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//计数器计数模式,设置为向上计数
	TIM_TimeBaseStructure.TIM_RepetitionCounter=0;					 //重复计数器的值,没用到,可以随意设置
	TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);					 //初始化定时器
	
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;						 //配置为PWM模式1
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//输出使能
	TIM_OCInitStructure.TIM_Pulse = 0;													 //设置占空比大小,在主函数compare中又设置一遍
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;		 //输出通道电平极性配置
	TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;	 //输出通道空闲电平极性配置
	TIM_OC1Init(TIM8, &TIM_OCInitStructure);			   						 //初始化通道1
	TIM_OC1PreloadConfig(TIM8, TIM_OCPreload_Enable);						 //使能通道1输出
	
	TIM_Cmd(TIM8, ENABLE);						//使能计数器
	TIM_CtrlPWMOutputs(TIM8, ENABLE);	// 主输出使能,当使用的是通用定时器时,这句不需要
}

3.2 main 函数

/* 主函数 */
int main(void)
{	
	delay_init();							//延时初始化
	TIM8_PWM_Init(); 					//舵机初始化             	 
	while(1)
	{  
	  //解释一下,这里只要产生一个周期的信号即(20ms)舵机就能转动
	  //如果一直保持这个信号,舵机也不会再转动。
	  //这里延时只是为了观察现象。转动后,过1s再转动。
        TIM_SetCompare1(TIM8,5);//转到0度位置
        delay_ms(1000);
	
        TIM_SetCompare1(TIM8,15);//转到90度位置
        delay_ms(1000);	
	
        TIM_SetCompare1(TIM8,25);//转到180度位置
        delay_ms(1000);	
	}
}

四.实验现象

舵机实验

  • 6
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
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信号来控制舵机的转动角度,并在主循环中控制舵机的转动。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

VersionGod

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值