每周模块(sg90舵机)

tb6612 发布于 2025-02-12


一,基本原理

舵机是一种可以精确控制角度的电机,它内部通常包含电机、齿轮组、控制电路等部分。通过接收 PWM(脉冲宽度调制)信号,舵机能够根据信号的占空比来确定旋转的角度。简单来说,PWM 信号的高电平持续时间决定了舵机的转动角度。

二,SG90舵机特点

  1. 体积小巧:SG90 舵机体积非常小,这使得它在小型机器人、航模等对空间要求较高的项目中具有很大优势。
  2. 价格亲民:价格相对较低,对于初学者和预算有限的爱好者来说是性价比极高的选择。
  3. 控制简单:只需要通过简单的 PWM 信号就能轻松控制其角度,容易上手。
  4. 扭矩适中:虽然扭矩不算特别大,但对于一些小型的机械结构和简单动作来说,完全能够满足需求。

三,硬件参数

工作扭矩:1.6kg/cm

反应转速:0.12-0.13s/60°

转动角度:180/360

使用电压:3v-7.2v

四,接线

红色线接电源正极5v

棕色电源负极gnd

橙色信号线输出pwm

五,在stm32f103c8t6中的应用代码

#include "stm32f10x.h"

// 使能TIM1和GPIOA时钟,配置PA8为复用推挽输出
void TIM1_PWM_Init(void) {
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_OCInitTypeDef TIM_OCInitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;

    // 使能TIM1和GPIOA时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 | RCC_APB2Periph_GPIOA, ENABLE);

    // 配置PA8为复用推挽输出
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    // 定时器基本配置
    TIM_TimeBaseStructure.TIM_Period = 1999;  // 自动重装载值,决定PWM周期,2000 * 1us = 2ms
    TIM_TimeBaseStructure.TIM_Prescaler = 71;  // 预分频器,72MHz / 72 = 1MHz,计数频率为1MHz
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

    // PWM模式配置
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_Pulse = 0;  // 初始占空比为0
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OC1Init(TIM1, &TIM_OCInitStructure);

    // 使能TIM1
    TIM_Cmd(TIM1, ENABLE);
}

// 设置舵机角度函数
void Set_Servo_Angle(float angle) {
    float pulse_width;
    pulse_width = angle / 180.0 * 2000 + 500;  // 角度转换为脉冲宽度,0.5ms - 2.5ms对应0 - 180度
    TIM_SetCompare1(TIM1, (uint16_t)pulse_width);  // 设置比较值,改变占空比
}

int main(void) {
    TIM1_PWM_Init();  // 初始化TIM1 PWM

    while (1) {
        Set_Servo_Angle(0);  // 设置舵机角度为0度
        delay(1000);  // 延时1秒
        Set_Servo_Angle(90);  // 设置舵机角度为90度
        delay(1000);  // 延时1秒
        Set_Servo_Angle(180);  // 设置舵机角度为180度
        delay(1000);  // 延时1秒
    }
}

// 简单的延时函数
void delay(uint32_t count) {
    for (uint32_t i = 0; i < count * 1000; i++) {
        __NOP();
    }
}

上述代码中,首先初始化了 TIM1 定时器用于产生 PWM 信号,然后定义了一个函数Set_Servo_Angle用于根据输入的角度值设置舵机的脉冲宽度,从而控制舵机的角度。在main函数中,通过循环调用Set_Servo_Angle函数,让舵机在 0 度、90 度和 180 度之间切换。

结言

舵机是个相对好控制的东西,只需要接正负极后给pwm就行,根据不同pwm舵机会转不同的角度,在实际应用中根据所需角度不断调整pwm占空比,可以做个简易机械臂什么的,好用且好玩捏~

不告诉你
最后更新于 2025-02-12