• 方案介紹
    • 一、前言
    • 二、SG90電機(jī)介紹
    • 三、實現(xiàn)代碼
  • 附件下載
  • 相關(guān)推薦
申請入駐 產(chǎn)業(yè)圖譜

通過51單片機(jī)控制SG90舵機(jī)按角度正反轉(zhuǎn)轉(zhuǎn)動

21小時前
287
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

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

共1個文件

一、前言

本文介紹如何通過51單片機(jī)控制SG90舵機(jī)實現(xiàn)角度的正反轉(zhuǎn)轉(zhuǎn)動。SG90舵機(jī)是一種常用的微型舵機(jī),具有體積小、重量輕、結(jié)構(gòu)簡單等特點,被廣泛應(yīng)用于機(jī)器人、遙控模型和各種自動控制系統(tǒng)中。

使用51單片機(jī)(STC89C52)作為控制器,利用其強(qiáng)大的IO口和定時器功能來實現(xiàn)對SG90舵機(jī)的控制。通過編程控制,可以精確地控制舵機(jī)按指定的角度進(jìn)行正轉(zhuǎn)或反轉(zhuǎn)運(yùn)動。

舵機(jī)的控制是通過脈沖寬度調(diào)制PWM)來實現(xiàn)的。在控制舵機(jī)時,需要向舵機(jī)發(fā)送一系列的脈沖信號,脈沖的寬度決定了舵機(jī)的角度位置。通常情況下,SG90舵機(jī)的控制脈沖周期為20毫秒,脈沖寬度在0.5毫秒到2.5毫秒之間,對應(yīng)的角度范圍為0度到180度。

為了實現(xiàn)舵機(jī)的正反轉(zhuǎn)轉(zhuǎn)動,需要控制脈沖的寬度在不同的范圍內(nèi),以達(dá)到不同的角度位置。通過調(diào)整脈沖的寬度和周期,我們可以控制舵機(jī)按照我們的要求進(jìn)行旋轉(zhuǎn)。

下面將介紹如何通過51單片機(jī)的IO口和定時器來生成適用于SG90舵機(jī)的PWM信號。編寫相應(yīng)的程序,通過調(diào)整脈沖寬度來實現(xiàn)舵機(jī)的正反轉(zhuǎn)轉(zhuǎn)動,并提供示例代碼。

image-20230810162124895

image-20230810162054785

二、SG90電機(jī)介紹

SG90電機(jī)是一種微型舵機(jī),常用于模型、機(jī)器人和其他小型機(jī)械裝置中。

1. 工作原理: SG90電機(jī)基于直流電機(jī)的原理,通過PWM(脈寬調(diào)制)信號控制舵機(jī)轉(zhuǎn)動角度。它由一個電機(jī)、減速齒輪組和一個位置反饋電路組成。該反饋電路使用了一個電位器來檢測舵機(jī)的當(dāng)前位置并將其反饋給控制電路

2. 特點:

  • 尺寸小巧:SG90電機(jī)非常小巧,體積輕盈,適合于空間有限的應(yīng)用。
  • 轉(zhuǎn)動角度范圍廣:通常情況下,SG90電機(jī)可以轉(zhuǎn)動約180度左右,但具體轉(zhuǎn)動范圍可以通過控制信號調(diào)整。
  • 高精度:SG90電機(jī)具有較高的轉(zhuǎn)動精度和穩(wěn)定性,適用于需要精確控制的應(yīng)用。
  • 低功耗:SG90電機(jī)功耗較低,可以在低電壓下工作。
  • 相對經(jīng)濟(jì):相比大型舵機(jī)或步進(jìn)電機(jī),SG90電機(jī)價格相對較低,適合在預(yù)算有限的項目中使用。

3. 控制方式: 控制SG90電機(jī)需要提供PWM信號。以下是控制SG90電機(jī)的基本步驟:

  • 將SG90電機(jī)的VCC引腳連接到正電源(通常為5V),將GND引腳連接到地。
  • 將信號線(例如,控制舵機(jī)角度的引腳)連接到微控制器或其他控制設(shè)備的數(shù)字輸出引腳。
  • 在控制設(shè)備上設(shè)置指定的PWM輸出引腳,并使用相應(yīng)的編程語言或庫發(fā)送PWM信號。PWM的工作周期通常為20ms,并且脈寬的范圍可以在0.5ms到2.5ms之間調(diào)整。
  • 根據(jù)所發(fā)送的PWM信號,SG90電機(jī)會轉(zhuǎn)動到相應(yīng)的角度位置。一般來說,0.5ms的脈寬對應(yīng)最左端角度,2.5ms的脈寬對應(yīng)最右端角度,1.5ms的脈寬對應(yīng)中間位置。具體的脈寬范圍和對應(yīng)的角度可以根據(jù)電機(jī)型號和要求進(jìn)行調(diào)整。

SG90電機(jī)的額定工作電壓為4.8V-6V,超過這個范圍可能會損壞電機(jī)。舵機(jī)在運(yùn)行時會產(chǎn)生一定的電流峰值,在使用時應(yīng)確保電源能夠提供足夠的電流。

三、實現(xiàn)代碼

3.1 正反轉(zhuǎn)實現(xiàn)-模擬延時

以下是通過51單片機(jī)控制SG90舵機(jī)按角度正反轉(zhuǎn)轉(zhuǎn)動的實現(xiàn)代碼,封裝子函數(shù)調(diào)用:

#include <reg51.h>

// 定義IO口連接舵機(jī)的引腳
sbit servoPin = P1^0;

// 延時函數(shù)
void delay(unsigned int time) {
    unsigned int i, j;
    for(i = 0; i < time; i++) {
        for(j = 0; j < 1000; j++);
    }
}

// 控制舵機(jī)按指定角度進(jìn)行正轉(zhuǎn)
void rotateClockwise(unsigned int angle) {
    unsigned int pulseWidth = 500 + angle * 11.11;
    unsigned int i;
    for(i = 0; i < 50; i++) {
        servoPin = 1; // 輸出高電平
        delay(pulseWidth);
        servoPin = 0; // 輸出低電平
        delay(20000 - pulseWidth);
    }
}

// 控制舵機(jī)按指定角度進(jìn)行反轉(zhuǎn)
void rotateCounterclockwise(unsigned int angle) {
    unsigned int pulseWidth = 2500 - angle * 11.11;
    unsigned int i;
    for(i = 0; i < 50; i++) {
        servoPin = 1; // 輸出高電平
        delay(pulseWidth);
        servoPin = 0; // 輸出低電平
        delay(20000 - pulseWidth);
    }
}

void main() {
    while(1) {
        // 正轉(zhuǎn)90度
        rotateClockwise(90);
        delay(2000); // 停留2秒

        // 反轉(zhuǎn)90度
        rotateCounterclockwise(90);
        delay(2000); // 停留2秒
    }
}

3.2 正反轉(zhuǎn)角度控制-PWM控制

下面是使用STC89C52的定時器0和GPIO口來模擬產(chǎn)生PWM信號的實現(xiàn)代碼:

#include <reg52.h>

#define FREQ_OSC 11059200UL   // 單片機(jī)工作頻率
#define PWM_FREQ 50           // PWM信號頻率
#define PWM_RESOLUTION 100    // PWM信號分辨率

sbit Servo = P1^0;   // SG90舵機(jī)控制引腳

unsigned int pwmWidth = 0;   // PWM脈寬

// 定時器0初始化函數(shù)
void Timer0Init() {
    EA = 0;   // 關(guān)閉總中斷
    TMOD &= 0xF0;   // 清除T0控制位
    TMOD |= 0x01;   // 設(shè)置T0為工作方式1(16位定時器)
    TH0 = (65536 - (FREQ_OSC / 12 / PWM_FREQ)) / 256;   // 計算并設(shè)置初始計數(shù)值高8位
    TL0 = (65536 - (FREQ_OSC / 12 / PWM_FREQ)) % 256;   // 計算并設(shè)置初始計數(shù)值低8位
    TR0 = 1;   // 啟動定時器0
    ET0 = 1;   // 允許定時器0中斷
    EA = 1;   // 開啟總中斷
}

// 定時器0中斷服務(wù)函數(shù)
void Timer0Interrupt() interrupt 1 {
    if (pwmWidth > PWM_RESOLUTION) {
        Servo = 0;   // 舵機(jī)復(fù)位
    } else {
        Servo = 1;   // 舵機(jī)置位
    }
    TH0 = (65536 - (FREQ_OSC / 12 / PWM_FREQ)) / 256;   // 重新設(shè)置計數(shù)值高8位
    TL0 = (65536 - (FREQ_OSC / 12 / PWM_FREQ)) % 256;   // 重新設(shè)置計數(shù)值低8位
    pwmWidth++;   // 每次中斷增加PWM脈寬
}

// 主函數(shù)
void main() {
    Timer0Init();   // 初始化定時器0

    while (1) {
        if (pwmWidth > PWM_RESOLUTION) {
            pwmWidth = 0;
        }
    }
}

代碼中,使用P1^0引腳作為SG90舵機(jī)的控制引腳,并通過定時器0來產(chǎn)生PWM信號。

在Timer0Init函數(shù)中,設(shè)置定時器0為16位定時器工作方式1,計算并設(shè)置初始計數(shù)值,啟動定時器0,并允許定時器0中斷。

在Timer0Interrupt函數(shù)中,每次定時器0中斷時調(diào)整舵機(jī)控制引腳的電平狀態(tài),并更新定時器0的計數(shù)值。

在主函數(shù)中,循環(huán)檢測PWM脈寬是否達(dá)到設(shè)定的分辨率,如果超過則重新從0開始計數(shù)。

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

相關(guān)推薦