基于STM32的SG90舵机使用

舵机简介

上有三根线引出,黄线:PWM信号;红线:VCC;灰线:GND。其中可接收的PWM波的频率不能太高,大约50HZ,即周期=1/频率=1/50=0.02s,20ms左右。

如何确定周期/频率

根据公式:
在这里插入图片描述
若周期为20ms,则PSC=7199,ARR=199,Tclk=72M。

角度控制

  • 0.5ms-------------0度; 2.5% 对应函数中CCRx为5。
  • 1.0ms------------45度; 5.0% 对应函数中CCRx为10。
  • 1.5ms------------90度; 7.5% 对应函数中CCRx为15。
  • 2.0ms-----------135度; 10.0% 对应函数中CCRx为20。
  • 2.5ms-----------180度; 12.5% 对应函数中CCRx为25。

编程实现

舵机每隔1s,转动一个角度:0度 --> 45度 --> 90度 --> 135度 --> 180度 --> 0度。

工程配置

其他配置与常规配置并没有不同的地方,所以不再赘述。在这里我们主要就是把定时器给配置好。
选用定时器TIM4,通道CH3的配置如下:
在这里插入图片描述
在这里插入图片描述

改写main.c

在STM32CubeMX中完成配置后,打开工程文件,进入Keil5中。因为相关的配置代码都已经自动生成完毕。所以我们只需要在主函数里面,加上相关代码,实现功能。
首先启用定时器:

HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_3);

每隔1s,加入延时函数:

HAL_Delay(1000);

以转动角度为0度为例,代码如下:

__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_3, 5);

依此类推转动其他角度,代码类似。
为了能循环角度转动,将相关代码加入while(1)循环体中。最后进行编译、下载入单片机观察现象即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32是一种32位微控制器,SG90舵机是一种小型舵机,常用于模型、机器人等小型项目中。在STM32控制SG90舵机时,需要使用PWM信号来控制舵机的位置。 以下是一个简单的STM32控制SG90舵机的代码示例: ```c #include "stm32f10x.h" #define SG90_PORT GPIOA #define SG90_PIN GPIO_Pin_1 void Delay(__IO uint32_t nCount); int main(void) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); GPIO_InitStructure.GPIO_Pin = SG90_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(SG90_PORT, &GPIO_InitStructure); TIM_TimeBaseStructure.TIM_Period = 19999; TIM_TimeBaseStructure.TIM_Prescaler = 719; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 1500; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM2, &TIM_OCInitStructure); TIM_Cmd(TIM2, ENABLE); while (1) { // 控制舵机旋转到指定位置 TIM_SetCompare1(TIM2, 1000); // 最小位置 Delay(1000000); TIM_SetCompare1(TIM2, 1500); // 中间位置 Delay(1000000); TIM_SetCompare1(TIM2, 2000); // 最大位置 Delay(1000000); } } void Delay(__IO uint32_t nCount) { for (; nCount != 0; nCount--); } ``` 该代码使用STM32的定时器TIM2和PWM信号来控制SG90舵机的位置。在主函数中,使用了`TIM_SetCompare1`函数来设置PWM信号的占空比,从而控制舵机的位置。同时在函数`Delay`中添加了延时函数,以保证舵机能够到达指定的位置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值