- サーボモーター
- LPC2148PWMおよびADCを使用したサーボモーターの制御
- ARM7-LPC2148のPWMおよびADCピン
- 必要なコンポーネント
- 回路図と接続
- サーボモーター制御用のARM7-LPC2148のプログラミング
前のチュートリアルでは、ステッピングモーターをARM7-LPC2148に接続しました。このチュートリアルでは、ARM7-LPC2148を使用してサーボモーターを制御します。サーボモーターは、ステッピングモーターに比べて消費電力が少ないという利点があります。サーボモーターは目的の位置に到達すると消費電力を停止しますが、ステッピングモーターは継続的に電力を消費してシャフトを目的の位置に固定します。サーボモーターは、その精度と取り扱いの容易さから、主にロボット工学プロジェクトで使用されています。
このチュートリアルでは、サーボモーターとサーボをARM7-LPC2148とインターフェースする方法について学習 します。サーボモーターのシャフトの位置を変えるためのポテンショメーターと、角度値を表示するためのLCDも接続されています。
サーボモーター
サーボモーターは、DCモーター、位置制御システム、およびギアの組み合わせです。サーボモーターの回転は、PWM信号を印加することで制御され、PWM信号の幅によってモーターの回転角と方向が決まります。ここでは 、このチュートリアルでSG90サーボモーターを使用 します。これは、人気があり、最も安価なものの1つです。SG90は180度のサーボです。したがって、このサーボを使用すると、軸を0〜180度の範囲で配置できます。
- 動作電圧:+ 5V
- ギアタイプ:プラスチック
- 回転角:0〜180度
- 重量:9gm
- トルク:2.5kg / cm
サーボモーターのプログラミングを開始する前に、サーボモーターを制御するために送信する信号の種類を知っておく必要があります。サーボモーターの信号線にPWM信号を送信するようにMCUをプログラムする必要があります。下の図に示すように、PWM信号のデューティサイクルを読み取り、サーボモーターシャフトをそれぞれの場所に配置する制御回路がサーボモーター内にあります。
20ミリ秒ごとに、サーボモーターがパルスをチェックします。そのため、信号のパルス幅を調整してモーターのシャフトを回転させます。
- サーボを0度に回転させるための1ms(1ミリ秒)のパルス幅
- 90度まで回転する場合のパルス幅1.5ms (ニュートラル位置)
- サーボを180度回転させるための2msのパルス幅。
サーボをARM7-LPC2148に接続する前に 、このサーボモーターテスター回路を使用してサーボをテストできます。また、サーボモーターを他のマイクロコントローラーと接続する方法も確認してください。
- Arduinoを使用したサーボモーター制御
- 8051マイクロコントローラーとインターフェースするサーボモーター
- MATLABを使用したサーボモーター制御
- RaspberryPiによるサーボモーター制御
- サーボモーターとMSP430G2のインターフェース
- サーボモーターとSTM32F103C8のインターフェース
LPC2148PWMおよびADCを使用したサーボモーターの制御
サーボモーターは、PWMを使用してLPC2148で制御できます。サーボのPWMピンに20msの周期と50Hzの周波数でPWM信号を供給することにより、サーボモーターのシャフトを約180度(-90〜 + 90)に配置することができます。
ポテンショメータは、PWM信号のデューティサイクルを変化させ、サーボモーターのシャフトを回転させるために使用されます。この方法は、LPC2148のADCモジュールを使用して実装されます。したがって、このチュートリアルでは、PWMとADCの両方の概念を実装する必要があります。したがって、ARM7-LPC2148のPWMとADCについては、以前のチュートリアルを参照してください。
- ARM7でPWMを使用する方法-LPC2148
- ARMでADCを使用する方法-LPLC2148
ARM7-LPC2148のPWMおよびADCピン
以下の画像は、LPC2148のPWMピンとADCピンを示しています。黄色のボックスは(6)PWMピンを示し、黒いボックスは(14)ADCピンを示します。
必要なコンポーネント
ハードウェア
- ARM7-LPC2148
- LCD(16x2)ディスプレイモジュール
- サーボモーター(SG-90)
- 3.3V電圧レギュレータ
- 10kポテンショメータ(2個)
- ブレッドボード
- 接続線
ソフトウェア
- Keil uVision5
- フラッシュマジックツール
回路図と接続
次の表は、サーボモーターとARM7-LPC2148の間の接続を示しています。
サーボピン |
ARM7-LPC2148 |
赤(+ 5V) |
+ 5V |
ブラウン(GND) |
GND |
オレンジ(PWM) |
P0.1 |
ピンP0.1はLPC2148のPWM出力です。
以下の表は、LCDとARM7-LPC2148間の回路接続を示しています。
ARM7-LPC2148 |
LCD(16x2) |
P0.4 |
RS(登録選択) |
P0.6 |
E(有効) |
P0.12 |
D4(データピン4) |
P0.13 |
D5(データピン5) |
P0.14 |
D6(データピン6) |
P0.15 |
D7(データピン7) |
GND |
VSS、R / W、K |
+ 5V |
VDD、A |
次の表は、ARM7LPC2148と3.3V電圧レギュレータを備えたポテンショメータ間の接続を示しています。
3.3V電圧レギュレータIC |
ピン機能 |
ARM-7LPC2148ピン |
1.左ピン |
-GNDからのVe |
GNDピン |
2.センターピン |
調整された+ 3.3V出力 |
LPC2148のP0.28へのポテンショメータ入力およびポテンショメータ出力へ |
3.右ピン |
+ 5VからのVe 入力 |
+ 5V |
注意点
1.ここでは、3.3Vの電圧レギュレータを使用して、LPC2148のADCピン(P0.28)にアナログ入力値を提供します。5Vの電力を使用しているため、3.3Vの電圧レギュレーターで電圧を調整する必要があります。
2.ポテンショメータを使用して電圧を(0V〜3.3V)の間で変化させ、LPC2148ピンP0.28にアナログ入力(ADC)を提供します。
3. LPC2148のピンP0.1は、サーボモーターにPWM出力を提供して、モーターの位置を制御します。
4.アナログ入力(ADC)値に応じて、サーボモーターの位置がLPC2148のP0.1のPWM出力ピンを介して(0から180度)に変化します。
サーボモーター制御用のARM7-LPC2148のプログラミング
ARM7-LPC2148をプログラムするには、keil uVision&FlashMagicツールが必要です。USBケーブルを使用してマイクロUSBポート経由でARM7スティックをプログラムしています。Keilを使用してコードを記述し、16進ファイルを作成してから、FlashMagicを使用してHEXファイルをARM7スティックにフラッシュします。keiluVisionとFlashMagicのインストールとその使用方法の詳細については、「ARM7 LPC2148マイクロコントローラー入門」リンクをたどり、KeiluVisionを使用してプログラムしてください。
サーボモーターを制御するためのPWMおよびADC用のLPC2148の構成に関連する手順
ステップ1: -LPC2148のコーディングに必要なヘッダーファイルをインクルードします
#include
ステップ2:-次に、プログラマーの必要に応じてLPC2148のシステムクロックとペリフェラルクロックを設定するため、クロック生成用にPLLを構成します。LPC2148の最大クロック周波数は60Mhzです。次の行は、PLLクロック生成を構成するために使用されます。
void initilizePLL (void)//クロック生成にPLLを使用する関数 { PLL0CON = 0x01; PLL0CFG = 0x24; PLL0FEED = 0xAA; PLL0FEED = 0x55; while(!(PLL0STAT&0x00000400)); PLL0CON = 0x03; PLL0FEED = 0xAA; PLL0FEED = 0x55; VPBDIV = 0x01; }
ステップ3:-次に行うことは、PINSELレジスタを使用してLPC2148のPWMピンとPWM機能を選択することです。LPC2148のPWM出力にP0.1を使用するため、PINSEL0を使用します。
PINSEL0- = 0x00000008; // LPC2148のピンP0.1をPWM3として設定
ステップ4:-次に、PWMTCR(タイマー制御レジスタ)を使用してタイマーをリセットする必要があります。
PWMTCR = 0x02; // PWMのカウンタをリセットして無効にします
次に、PWMの分解能を決定するプリスケール値を設定します。
PWMPR = 0x1D; //レジスタ値をプリスケールします
ステップ5:-次に、PWMMCR(PWM一致制御レジスタ)を設定して、リセット、PWMMR0およびPWMMR3の割り込みなどの動作を設定します。
PWMMCR = 0x00000203; // MR0の一致でリセットして割り込み、MR3の一致で割り込み
ステップ6: -PWMチャネルの最大周期はPWMMR0を使用して設定され、PWMデューティサイクルのトンは最初に0.65ミリ秒に設定されます
PWMMR0 = 20000; // PWM波の期間、 20ミリ秒PWMMR3 = 650; // PWM波のトン0.65ミリ秒
ステップ7:-次に、PWMLERを使用してラッチイネーブルを対応するマッチレジスタに設定する必要があります
PWMLER = 0x09; // PWM3とPWM0のラッチイネーブル
(PWMMR0とPWMMR3を使用します)したがって、PWMLERで1を設定して、対応するビットを有効にします。
ステップ8:-ピンへのPWM出力を有効にするには、PWMTCRを使用してPWMタイマーカウンターとPWMモードを有効にする必要があります。
PWMPCR = 0x0800; // PWM3と PWM0を有効にし、シングルエッジ制御のPWM PWMTCR = 0x09; // PWMとカウンタを有効にします
ステップ9:-次に、ADCピンP0.28からPWMのデューティサイクルを設定するためのポテンショメータ値を取得する必要があります。そのため、LPC2148のADCモジュールを使用して、ポテンショメータのアナログ入力(0〜3.3V)をADC値(0〜1023)に変換します。
ステップ10: -のために LPC2148にADCピンP0.28を選択し、 我々の使用
PINSEL1 = 0x01000000; //P0.28をADC入力として設定AD0CR =(((14)<< 8)-(1 << 21)); // A / D変換用のクロックとPDNの設定
次の行 は、アナログ入力(0〜3.3V) をキャプチャし、それをデジタル値(0〜1023)に変換します。そして、このデジタル値を4で割って (0〜255)に変換し 、最後 にLPC2148のP0.1ピンにPWM出力として供給し ます。ここでは 、LPC2148のPWMの分解能が8ビットであるため(28)、値を4で除算して0-1023から0-255に変換しています。
AD0CR-=(1 << 1); // ADCレジスタでAD0.1チャネルを選択delaytime (10); AD0CR-=(1 << 24); // A / D変換 を 開始しますwhile((AD0DR1&(1 << 31))== 0); // ADCデータレジスタのDONEビットを確認しますadcvalue =(AD0DR1 >> 6)&0x3ff; // ADCデータレジスタから結果を取得します dutycycle = adcvalue / 4; //デューティサイクル値を(0〜255)から取得する式 PWMMR1 = Dutycycle; //デューティサイクル値をPWM一致レジスタに 設定PWMLER-=(1 << 1); //デューティサイクル値でPWM出力を有効にします
ステップ11:-次に、これらの値をLCD(16X2)ディスプレイモジュールに表示します。そこで、LCDディスプレイモジュールを初期化するために次の行を追加します
Void LCD_INITILIZE(void)// LCDを準備する関数 { IO0DIR = 0x0000FFF0; //ピンP0.12、P0.13、P0.14、P0.15、P0.4、P0.6をOUTPUT delaytime (20); として設定します。LCD_SEND(0x02); // 4ビット動作モードでlcdを初期化します LCD_SEND(0x28); // 2行(16X2) LCD_SEND(0x0C); //カーソルをオフに表示 LCD_SEND(0x06); //カーソルを自動インクリメント LCD_SEND(0x01); //クリア LCD_SEND(0x80);を 表示します //最初の行の最初の位置}
LCDを4ビットモードでLPC2148に接続したので、ニブルごとに表示される値を送信する必要があります(上部ニブルと下部ニブル)。したがって、次の行が使用されます。
void LCD_DISPLAY(char * msg)//送信された文字を1つずつ出力する関数 { uint8_t i = 0; while(msg!= 0) { IO0PIN =((IO0PIN&0xFFFF00FF)-((msg&0xF0)<< 8)); //上位ニブルを 送信IO0SET = 0x00000050; // RS HIGH& ENABLEHIGHで データを出力IO0CLR = 0x00000020; // RW LOW書き込みモードdelaytime(2); IO0CLR = 0x00000040; // EN = 0、RSおよびRWは変更されていません(つまり、RS = 1、RW = 0) delaytime(5); IO0PIN =((IO0PIN&0xFFFF00FF)-((msg&0x0F)<< 12)); //下位ニブルを 送信IO0SET = 0x00000050; // RS&EN HIGH IO0CLR = 0x00000020; delaytime(2); IO0CLR = 0x00000040; delaytime(5); i ++; } }
これらのADCとPWMの値を表示するには、 int main() 関数で次の行を使用します 。
LCD_SEND(0x80); sprintf(displayadc、 "adcvalue =%f"、dutycycle); LCD_DISPLAY(displayadc); // ADC値(0〜1023)を表示します angle =(adcvalue / 5.7); // ADC値を角度( o〜180 度)に変換する式LCD_SEND(0xC0); sprintf(anglevalue、 "ANGLE =%。2f deg"、angle); LCD_DISPLAY(anglevalue);
チュートリアルの完全なコードとビデオの説明を以下に示します