• 方案介紹
  • 附件下載
  • 相關(guān)推薦
申請入駐 產(chǎn)業(yè)圖譜

STM32F103RCT6驅(qū)動(dòng)SG90舵機(jī)-完成正反轉(zhuǎn)角度控制

03/14 11:27
1307
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

更多詳細(xì)資料請聯(lián)系.docx

共1個(gè)文件

一、SG90舵機(jī)介紹

SG90是一種微型舵機(jī),也被稱為伺服電機(jī)。它是一種小型、低成本的直流電機(jī),通常用于模型和機(jī)器人控制等應(yīng)用中。SG90舵機(jī)可以通過電子信號來控制其精確的位置和速度。它具有體積小、重量輕、響應(yīng)快等特點(diǎn),因此在各種小型機(jī)械設(shè)備上得到了廣泛應(yīng)用。

SG90舵機(jī)通常用于各種小型機(jī)械設(shè)備中,例如:

模型控制:SG90舵機(jī)可以用于遙控汽車、飛機(jī)、船只和其他模型的轉(zhuǎn)向、加速和剎車等控制。

機(jī)器人控制:SG90舵機(jī)也廣泛應(yīng)用于機(jī)器人領(lǐng)域,例如可以控制機(jī)器人的頭部旋轉(zhuǎn)、臂部移動(dòng)等。

相機(jī)云臺(tái):SG90舵機(jī)可以用于控制相機(jī)的運(yùn)動(dòng),例如實(shí)現(xiàn)云臺(tái)的左右旋轉(zhuǎn)和上下移動(dòng)。

自動(dòng)化系統(tǒng):在一些自動(dòng)化系統(tǒng)中,SG90舵機(jī)可以用來控制小型機(jī)械臂或手指的運(yùn)動(dòng)。

總之,SG90舵機(jī)適用于需要精確定位和緊湊設(shè)計(jì)的應(yīng)用場景。

image-20230411101929057

img

二、普通IO口模擬PWM驅(qū)動(dòng)SG90舵機(jī)

以下是一個(gè)簡單的示例代碼,用于通過PB5普通IO口產(chǎn)生模擬PWM信號來控制SG90舵機(jī)正向旋轉(zhuǎn)和反向旋轉(zhuǎn):

#include "stm32f10x.h"

#define PWM_FREQ 50  // 設(shè)置PWM信號頻率為50Hz
#define SERVO_MIN_PULSE_WIDTH 500  // 舵機(jī)最小脈寬500us
#define SERVO_MAX_PULSE_WIDTH 2500  // 舵機(jī)最大脈寬2500us

void delay_us(uint32_t us) {
  uint32_t count = us * (SystemCoreClock / 1000000) / 9;
  while(count--);
}

void servo_rotate(uint16_t pulse_width) {
  GPIO_SetBits(GPIOB, GPIO_Pin_5);  // 設(shè)置PB5輸出高電平
  delay_us(pulse_width);  // 延時(shí)等待脈寬結(jié)束
  GPIO_ResetBits(GPIOB, GPIO_Pin_5);  // 設(shè)置PB5輸出低電平
  delay_us(20000 - pulse_width);  // 延時(shí)保持50Hz的PWM周期
}

int main(void)
{
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);  // 使能GPIOB時(shí)鐘

  GPIO_InitTypeDef GPIO_InitStructure;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;  // PB5口
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  // 推挽輸出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  // 最大輸出頻率為50Mhz
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  while(1) {
    // 控制舵機(jī)正向旋轉(zhuǎn)360°
    for (int i = SERVO_MIN_PULSE_WIDTH; i <= SERVO_MAX_PULSE_WIDTH; i += 10) {
      servo_rotate(i);
    }
    for (int i = SERVO_MAX_PULSE_WIDTH; i >= SERVO_MIN_PULSE_WIDTH; i -= 10) {
      servo_rotate(i);
    }
    
    // 控制舵機(jī)反向旋轉(zhuǎn)360°
    for (int i = SERVO_MAX_PULSE_WIDTH; i >= SERVO_MIN_PULSE_WIDTH; i -= 10) {
      servo_rotate(i);
    }
    for (int i = SERVO_MIN_PULSE_WIDTH; i <= SERVO_MAX_PULSE_WIDTH; i += 10) {
      servo_rotate(i);
    }
  }
}

在這個(gè)代碼中,我們首先定義了PWM頻率以及舵機(jī)的最小和最大脈寬。然后,我們實(shí)現(xiàn)了一個(gè)延時(shí)函數(shù)delay_us(),用于產(chǎn)生指定微秒數(shù)的延時(shí)。接下來,我們實(shí)現(xiàn)了一個(gè)servo_rotate()函數(shù),用于控制舵機(jī)的旋轉(zhuǎn)。

servo_rotate()函數(shù)中,我們將PB5口設(shè)置為高電平,并延時(shí)等待一段時(shí)間,使得舵機(jī)旋轉(zhuǎn)到相應(yīng)的角度;然后將PB5口設(shè)置為低電平,延時(shí)保持PWM周期的長度,以達(dá)到模擬PWM信號的效果。

在主函數(shù)中,我們通過循環(huán)控制舵機(jī)旋轉(zhuǎn)360度,并在正向和反向旋轉(zhuǎn)之間進(jìn)行切換。具體來說,我們通過循環(huán)執(zhí)行servo_rotate()函數(shù),并改變脈寬的值,實(shí)現(xiàn)舵機(jī)的旋轉(zhuǎn)。

需要注意的是,這個(gè)示例代碼只是一個(gè)簡單的演示,實(shí)際使用中可能需要根據(jù)舵機(jī)的具體型號和應(yīng)用場景進(jìn)行調(diào)整。同時(shí),由于使用的是延時(shí)產(chǎn)生模擬PWM信號,因此控制的精度可能會(huì)受到其他因素的影響,如果需要更高的控制精度,可以考慮使用硬件定時(shí)器來產(chǎn)生PWM信號。

三、通過定時(shí)器輸出PWM控制SG90舵機(jī)

(1)配置定時(shí)器4的通道1為PWM模式,并且設(shè)置頻率為50Hz,占空比為5%~10%。

代碼如下:

// 開啟TIM4時(shí)鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);

// 定時(shí)器4 PWM模式配置
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Period = 1999;   // 72M / (2*2000) = 18KHz
TIM_TimeBaseStructure.TIM_Prescaler = 35;  // 分頻系數(shù)36
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);

// 定時(shí)器4通道1 PWM輸出配置
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCStructInit(&TIM_OCInitStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 100;           // 初始值
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM4, &TIM_OCInitStructure);

// 開啟定時(shí)器4
TIM_Cmd(TIM4, ENABLE);

(2)使用定時(shí)器4的通道1輸出PWM信號,使舵機(jī)正向旋轉(zhuǎn)360°,即將占空比由5%10%逐漸增加至12.5%2.5%。代碼如下:

for (int i = 100; i <= 250; i += 10) {
    TIM_SetCompare1(TIM4, i);
    delay_ms(50);
}

(3)使用定時(shí)器4的通道1輸出PWM信號,使舵機(jī)反向旋轉(zhuǎn)360°,即將占空比由12.5%2.5%逐漸減小至5%10%。代碼如下:

for (int i = 250; i >= 100; i -= 10) {
    TIM_SetCompare1(TIM4, i);
    delay_ms(50);
}

在上面的代碼中,delay_ms()函數(shù)是一個(gè)簡單的延時(shí)函數(shù),用于控制每次占空比變化后等待一段時(shí)間再進(jìn)行下一步操作。需要自己實(shí)現(xiàn)這個(gè)函數(shù)。

另外,SG90舵機(jī)正向旋轉(zhuǎn)和反向旋轉(zhuǎn)的具體占空比可能有所不同,需要根據(jù)實(shí)際情況調(diào)整代碼中的占空比值。

  • 更多詳細(xì)資料請聯(lián)系.docx
    下載

相關(guān)推薦