一,基本原理
舵机是一种可以精确控制角度的电机,它内部通常包含电机、齿轮组、控制电路等部分。通过接收 PWM(脉冲宽度调制)信号,舵机能够根据信号的占空比来确定旋转的角度。简单来说,PWM 信号的高电平持续时间决定了舵机的转动角度。
二,SG90舵机特点
- 体积小巧:SG90 舵机体积非常小,这使得它在小型机器人、航模等对空间要求较高的项目中具有很大优势。
- 价格亲民:价格相对较低,对于初学者和预算有限的爱好者来说是性价比极高的选择。
- 控制简单:只需要通过简单的 PWM 信号就能轻松控制其角度,容易上手。
- 扭矩适中:虽然扭矩不算特别大,但对于一些小型的机械结构和简单动作来说,完全能够满足需求。
三,硬件参数
工作扭矩: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占空比,可以做个简易机械臂什么的,好用且好玩捏~
Comments NOTHING