伺服電機(jī)的工作原理是脈沖寬度調(diào)制(PWM),其旋轉(zhuǎn)角度由施加到其控制引腳的脈沖持續(xù)時(shí)間控制。在本教程中,我們將使用 PWM 技術(shù)通過(guò) ATtiny13 微控制器控制伺服電機(jī)。因此,在繼續(xù)之前,我們將首先了解PWM、伺服電機(jī)以及如何使用 Arduino Board 對(duì) ATtiny13 進(jìn)行編程。
脈寬調(diào)制 (PWM)
脈沖寬度調(diào)制(PWM) 被定義為一種使用數(shù)字源生成模擬信號(hào)的方法。PWM 信號(hào)由兩個(gè)主要部分組成——占空比和頻率。這些組件定義了它的行為。占空比描述了信號(hào)處于高電平狀態(tài)的時(shí)間量。它表示為完成一個(gè)周期所需的總時(shí)間的百分比。
占空比=開啟時(shí)間/(開啟時(shí)間+關(guān)閉時(shí)間)
頻率定義了 PWM 完成一個(gè)周期的速度以及信號(hào)在高低狀態(tài)之間切換的速度。100Hz 的頻率意味著每秒 100 個(gè)周期。通過(guò)以一定的占空比快速切換數(shù)字信號(hào)的開和關(guān),輸出將看起來(lái)像一個(gè)恒定電壓的模擬信號(hào)。PWM 的強(qiáng)大優(yōu)勢(shì)之一是功率損耗非常小。
PWM 信號(hào)用于各種控制應(yīng)用。PWM 信號(hào)的主要目的是控制提供給各種電氣設(shè)備的電力,尤其是提供給交流/直流電機(jī)等慣性負(fù)載的電力。它還可用于控制泵、閥門、液壓系統(tǒng)和其他機(jī)械部件。PWM 信號(hào)的頻率取決于被供電設(shè)備的應(yīng)用和響應(yīng)時(shí)間。
使用 PWM 信號(hào)控制伺服電機(jī)
伺服電機(jī)由三根線組成,其中兩根用于電源(正極和負(fù)極),一根控制線用于從微控制器發(fā)送的信號(hào)。伺服電機(jī)基本上由一個(gè)由電位器和一些齒輪控制的直流電機(jī)組成。直流電機(jī)的高速力通過(guò)齒輪轉(zhuǎn)換為扭矩。在直流電機(jī)中,力較小且速度較高,而在伺服電機(jī)中,力較大且速度較慢。電位器連接到伺服電機(jī)的輸出軸以計(jì)算角度并將直流電機(jī)停止在所需的角度。要了解有關(guān)伺服的更多信息,請(qǐng)參閱有關(guān)伺服電機(jī)的詳細(xì)文章。
伺服電機(jī)由脈沖寬度調(diào)制 (PWM) 控制或通過(guò)控制線發(fā)送可變寬度的電脈沖。會(huì)有重復(fù)率、最小脈沖和最大脈沖。伺服電機(jī)可以從中性位置向任一方向轉(zhuǎn)動(dòng) 90度,總共移動(dòng) 180度。電機(jī)的中性位置是伺服在順時(shí)針和逆時(shí)針?lè)较蚓哂邢嗤臐撛谛D(zhuǎn)量的位置。發(fā)送到電機(jī)的 PWM 信號(hào)決定了軸的位置。轉(zhuǎn)子將根據(jù)通過(guò)控制線發(fā)送的脈沖持續(xù)時(shí)間轉(zhuǎn)到所需位置。伺服電機(jī)每 20 毫秒 (ms) 需要一個(gè)脈沖,脈沖的長(zhǎng)度決定了電機(jī)轉(zhuǎn)動(dòng)的距離。
伺服電機(jī)可以從 0 度旋轉(zhuǎn)到 180 度。當(dāng)一個(gè) 1.5ms 的脈沖被提供給控制線時(shí),電機(jī)將轉(zhuǎn)到 90 o位置。當(dāng)給定一個(gè)小于 1.5ms 的脈沖時(shí),電機(jī)將沿逆時(shí)針?lè)较蛳?0 o位置移動(dòng)。如果給出一個(gè)超過(guò) 1.5ms 的脈沖,那么電機(jī)將順時(shí)針?lè)较蜣D(zhuǎn)向 180 o位置。
所有伺服電機(jī)都直接使用 +5V 電源工作,但我們必須注意電機(jī)消耗的電流量。如果我們使用兩個(gè)以上的伺服電機(jī),則應(yīng)設(shè)計(jì)適當(dāng)?shù)乃欧帘巍?/p>
使用 Arduino 編程 ATtiny13
Attiny13 可以使用 Arduino Uno 或任何其他 Arduino 板進(jìn)行編程。如下圖所示將 Attiny13 連接到 Arduino Uno。
Arduino 5V – ATtiny13 引腳 8
Arduino GND – ATtiny13 引腳 4
Arduino 引腳 13 – ATtiny13 引腳 7
Arduino 引腳 12 – ATtiny13 引腳 6
Arduino 引腳 11 – ATtiny13 引腳 5
Arduino 引腳 10 – ATtiny13 引腳 1
Arduino 被設(shè)置為程序員來(lái)編程 ATtiny13。這是通過(guò)將 ArduinoISP 草圖上傳到 Arduino 來(lái)完成的。此 Arduino 草圖可在 Arduino IDE 的示例中找到。打開 Arduino IDE 并轉(zhuǎn)到文件 》 示例 》 ArduinoISP。
現(xiàn)在將彈出 ArduinoISP 的程序。將程序上傳到 Arduino Uno。
Arduino Uno 現(xiàn)在已準(zhǔn)備好對(duì) Attiny13 進(jìn)行編程。但是我們必須通過(guò)安裝其核心文件來(lái)設(shè)置 Attiny。為此,請(qǐng)轉(zhuǎn)到Arduino IDE中的文件》》首選項(xiàng)
然后會(huì)彈出一個(gè)新窗口。并在“ Additional Board Manager URL‘s ”中添加以下鏈接,然后單擊“OK”。
“ https://raw.githubusercontent.com/sleemanj/optiboot/master/dists/package_gogo_diy_attiny_index.json ”
現(xiàn)在在您的 Arduino IDE 中轉(zhuǎn)到Tools》》Board》》Boards Manager
然后會(huì)彈出另一個(gè)窗口,在搜索框中輸入“Attiny”然后你會(huì)得到“DIY ATtiny”然后點(diǎn)擊“安裝”按鈕(我已經(jīng)安裝了它,這就是為什么安裝按鈕是灰色的)
要開始對(duì) ATtiny 13 進(jìn)行編程,我們必須將 Bootloader 燒錄到它。為此,請(qǐng)轉(zhuǎn)到工具 》 板 》 ATtiny13。
現(xiàn)在轉(zhuǎn)到工具 》 處理器版本并檢查是否選擇了正確的 ATtiny 版本。根據(jù)您的芯片選擇 ATtiny13 或 ATtiny13a。
然后單擊工具菜單底部的刻錄引導(dǎo)加載程序按鈕。
燒錄引導(dǎo)加載程序后,現(xiàn)在可以對(duì) ATtiny 進(jìn)行編程了。現(xiàn)在你可以上傳你的程序了。
所需組件
ATtiny13 微控制器
伺服電機(jī)
電位器
+5V 電池
Arduino IDE
連接線
電路圖和工作
下面給出了使用帶有 ATtiny13 的電位器控制伺服電機(jī)的電路圖。
下面是連接
將伺服電機(jī)控制引腳連接到 ATtiny13 的引腳 5
將伺服電機(jī)的接地連接到 ATtiny13 的引腳 4
將伺服電機(jī)的 VCC 連接到 ATtiny13 的引腳 8
將電位器的中間引腳連接到 ATtiny13 的引腳 7
將電位器的第一個(gè)和第三個(gè)引腳連接到 VCC 和 GND。
將 +5V 電池正極連接到 ATtiny13 的引腳 8
將 +5V 電池的負(fù)極連接到 ATtiny13 的引腳 4
電位器連接到 ATtiny13 的引腳 7 (PB2),伺服電機(jī)的控制線連接到引腳 5 (PB0)。
此處讀取電位計(jì)值并將其轉(zhuǎn)換為 0 到 180 之間的值。然后將該角度值轉(zhuǎn)換為微秒,并以計(jì)算出的微秒延遲將脈沖提供給伺服電機(jī)的控制引腳。
#define F_CPU 9600000
int 伺服 = PB0; //連接舵機(jī)到PB0
長(zhǎng)角;
整數(shù)脈寬調(diào)制;
#include
void adc_setup (void)
{
// 將 ADC 輸入設(shè)置為 PB2/ADC1
ADMUX |= (1 << MUX0);
ADMUX |= (1 << ADLAR);
// 將預(yù)分頻器設(shè)置為時(shí)鐘/128 并啟用 ADC
// 在 9.6 MHz 時(shí)為 75 kHz。
ADCSRA |= (1 << ADPS1) | (1 << ADPS0) | (1 << 阿登);
}
int adc_read (void)
{
// 開始轉(zhuǎn)換
ADCSRA |= (1 << ADSC);
// 等待它完成
while (ADCSRA & (1 << ADSC));
返回 ADCH;
pinMode(伺服,輸出);// 將伺服設(shè)置為輸出引腳
}
void loop ()
{
long a;
adc_setup();
a = adc_read(); // 讀取電位器值
angle = (a * 3) / 2; // 將讀數(shù)轉(zhuǎn)換為 0 到 180 之間的角度
。servoPulse(servo, angle); // 調(diào)用servoPulse 函數(shù)。
}
void serverPulse (int 伺服,int 角度)
{
pwm = (angle * 11) + 500; // 將角度轉(zhuǎn)換為微秒
digitalWrite(servo, HIGH);
延遲微秒(pwm);
數(shù)字寫入(伺服,低);
延遲(50);// 伺服刷新周期
}
?
評(píng)論