- PWM(パルス幅変調)
- ARM7-LPC2148のPWMピン
- ARM7-LPC2148のPWMレジスタ
- 必要なコンポーネント
- 回路図と接続
- PWM用のARM7-LPC2148のプログラミング
- PWMおよびADC用のLPC2148のプログラミングに関連する手順
私たちが知っているように、マイクロコントローラーはアナログセンサーからアナログ入力を受け取り、ADC(アナログ-デジタルコンバーター)を使用してそれらの信号を処理します。しかし、マイクロコントローラーがサーボモーター、DCモーターなどのアナログ操作デバイスを制御するためのアナログ信号を生成したい場合はどうでしょうか。マイクロコントローラーは、1V、5Vのような出力電圧を生成せず、代わりにアナログデバイスを操作するためにPWMと呼ばれる技術を使用します。PWMの例は、温度に応じて速度を制御する必要があるラップトップの冷却ファン(DCモーター)です。これは、マザーボードでパルス幅変調(PWM)技術を使用して実装されます。
このチュートリアルでは、ARM7-LPC2148マイクロコントローラーのPWMを使用してLEDの輝度を制御します。
PWM(パルス幅変調)
PWMは、モーターの速度やLEDの明るさなどを制御するなど、デジタル値を使用してアナログデバイスを制御するための優れた方法です。PWMは純粋なアナログ出力を提供しませんが、アナログデバイスを制御するための適切なアナログパルスを生成します。PWMは、結果の波の平均値の変動を取得するために、実際には矩形パルス波の幅を変調します。
PWMのデューティサイクル
PWM信号がHIGH(オンタイム)のままである時間のパーセンテージは、デューティサイクルと呼ばれます。信号が常にオンの場合は100%のデューティサイクルであり、常にオフの場合は0%のデューティサイクルです。
デューティサイクル=ターンオン時間/(ターンオン時間+ターンオフ時間)
ARM7-LPC2148のPWMピン
下の画像は、ARM7-LPC2148のPWM出力ピンを示しています。PWMには合計6つのピンがあります。
PWMチャネル |
LPC2148ポートピン |
PWM1 |
P0.0 |
PWM2 |
P0.7 |
PWM3 |
P0.1 |
PWM4 |
P0.8 |
PWM5 |
P0.21 |
PWM6 |
P0.9 |
ARM7-LPC2148のPWMレジスタ
プロジェクトに入る前に、LPC2148のPWMレジスタについて知っておく必要があります。
これは、PWM用のLPC2148で使用されるレジスタのリストです。
1. PWMPR:PWMプリスケールレジスタ
用途:32ビットレジスタです。これには、PWMタイマーカウンターをインクリメントする前にPCLKがサイクルしなければならない回数(マイナス1)が含まれます(実際にはプリスケールカウンターの最大値を保持します)。
2. PWMPC: PWMプリスケーラカウンター
用途:32ビットレジスタです。増分カウンター値が含まれています。この値がPR値に1を加えた値に等しくなると、PWMタイマーカウンター(TC)がインクリメントされます。
3. PWMTCR:PWMタイマー制御レジスタ
用途:これには、カウンターイネーブル、カウンターリセット、およびPWMイネーブル制御ビットが含まれています。8ビットレジスタです。
7:4 |
3 |
2 |
1 |
0 |
予約済み |
PWM有効 |
予約済み |
カウンターリセット |
カウンター有効 |
- PWMイネーブル:(ビット3)
0-PWM無効
1-PWM有効
- カウンターイネーブル:(ビット0)
0-カウンターを無効にする
1-カウンターを有効にする
- カウンターリセット:(ビット-1)
0-何もしません。
1-PCLKの立ち上がりエッジでPWMTCとPWMPCをリセットします。
4. PWMTC:PWMタイマーカウンター
用途:32ビットレジスタです。これには、インクリメントするPWMタイマーの現在の値が含まれています。プリスケーラカウンタ(PC)がプリスケーラレジスタ(PR)の値に1を加えた値に達すると、このカウンタがインクリメントされます。
5. PWMIR: PWM割り込みレジスタ
用途:16ビットレジスタです。これには、PWM一致チャネル0〜6の割り込みフラグが含まれています。そのチャネルで割り込みが発生すると、割り込みフラグが設定されます(MRx割り込み)。ここで、Xはチャネル番号(0〜6)です。
6. PWMMR0-PWMMR6: PWMマッチレジスタ
用途:32ビットレジスタです。 実際、Match Channelグループでは、6つのシングルエッジ制御または3つのダブルエッジ制御のPWM出力を設定できます。7つのマッチチャネルを変更して、PWMPCRの要件に合うようにこれらのPWM出力を構成できます。
7. PWMMCR:PWM一致制御レジスタ
用途:32ビットレジスタです。これには、選択したマッチチャネルを制御する割り込み、リセット、およびストップビットが含まれています。PWM一致レジスタとPWMタイマーカウンタの間で一致が発生します。
31:21 |
20 |
19 |
18 |
.. |
5 |
4 |
3 |
2 |
1 |
0 |
予約済み |
PWMMR6S |
PWMMR6R |
PWMMR6I |
.. |
PWMMR1S |
PWMMR1R |
PWMMR11 |
PWMMR0S |
PWMMR0R |
PWMMR01 |
ここで、xは0から6です。
- PWMMRxI(ビット0)
PWM割り込みを有効または無効にする
0-PWM一致割り込みを無効にします。
1-PWM一致割り込みを有効にします。
- PWMMRxR:(ビット-1)
RESETPWMTC- PWMRxと一致するときはいつでもタイマーカウンター値
0-何もしません。
1-PWMTCをリセットします。
- PWMMRxS:(ビット2)
PWMTCが一致レジスタ値に達したらPWMTCとPWMPCを停止します
0-PWM停止機能を無効にします。
1-PWM停止機能を有効にします。
8. PWMPCR:PWM制御レジスタ
用途:16ビットレジスタです。これには、PWM出力0〜6を有効にし、各出力に対してシングルエッジまたはダブルエッジ制御を選択するビットが含まれています。
31:15 |
14:9 |
8:7 |
6:2 |
1:0 |
未使用 |
PWMENA6-PWMENA1 |
未使用 |
PWMSEL6-PWMSEL2 |
未使用 |
- PWMSELx(x:2〜6)
- PWMxのシングルエッジモード
- 1-PWMxのダブルエッジモード。
- PWMENAx(x:1から6)
- PWMx無効。
- 1-PWMxが有効。
9. PWMLER: PWMラッチイネーブルレジスタ
用途:8ビットレジスタです。これには、各一致チャネルの一致xラッチビットが含まれています。
31:7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
未使用 |
LEN6 |
LEN5 |
LEN4 |
LEN3 |
LEN2 |
LEN1 |
LEN0 |
LENx(x:0〜6):
0-新しい一致値のロードを無効にします
1-タイマーがリセットされたときに、(PWMMRx)PWMMatchレジスタから新しい一致値をロードします。
それでは、ARMマイクロコントローラーのパルス幅変調を実証するためのハードウェアセットアップの構築を始めましょう。
必要なコンポーネント
ハードウェア
- ARM7-LPC2148マイクロコントローラー
- 3.3V電圧レギュレータIC
- 10kポテンショメータ
- LED(任意の色)
- LCD(16x2)ディスプレイモジュール
- ブレッドボード
- 接続線
ソフトウェア
- Keil uVision5
- フラッシュマジックツール
回路図と接続
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 |
LEDとARM7間の接続-LPC2148
LEDのANODEはLPC2148のPWM出力(P0.0)に接続され、LEDのCATHODEピンはLPC2148のGNDピンに接続されます。
ARM7-LPC2148と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)を提供します。
PWM用のARM7-LPC2148のプログラミング
ARM7-LPC2148をプログラムするには、keil uVision&FlashMagicツールが必要です。USBケーブルを使用してマイクロUSBポート経由でARM7スティックをプログラムしています。Keilを使用してコードを記述し、16進ファイルを作成してから、FlashMagicを使用してHEXファイルをARM7スティックにフラッシュします。keiluVisionとFlashMagicのインストールとその使用方法の詳細については、「ARM7 LPC2148マイクロコントローラー入門」リンクをたどり、KeiluVisionを使用してプログラムしてください。
このチュートリアルでは、ADCとPWMの手法を使用してLEDの明るさを制御します。ここで、LPC2148にはADC入力ピンP0.28を介してアナログ入力(0〜3.3V)が与えられ、このアナログ入力はデジタル値(0〜1023)に変換されます。次に、LPC2148のPWM出力の分解能は8ビット(2 8)しかないため、この値は再びデジタル値(0〜255)に変換されます。LEDはPWMピンP0.0に接続されており、LEDの輝度はポテンショメータを使用して制御できます。ARM7-LPC2148のADCの詳細については、リンクをたどってください。
PWMおよびADC用のLPC2148のプログラミングに関連する手順
ステップ1:-プログラマーの必要に応じて、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; }
ステップ2:-次は、PINSELレジスタを使用してLPC2148のPWMピンとPWM機能を選択します。LPC2148のPWM出力にP0.0を使用するため、PINSEL0を使用します。
PINSEL0 = 0x00000002; // PWM出力用にピンP0.0を設定
ステップ3:-次に、PWMTCR(タイマー制御レジスタ)を使用してタイマーをリセットする必要があります。
PWMTCR =(1 << 1); // PWMタイマー制御レジスタをカウンターリセットとして設定
次に、PWMの分解能を決定するプリスケール値を設定します。ゼロに設定しています
PWMPR = 0X00; // PWMプリスケール値の設定
ステップ4:-次に、PWMMR0のリセット、割り込みなどの動作を設定するPWMMCR(PWM一致制御レジスタ)を設定する必要があります。
PWMMCR =(1 << 0)-(1 << 1); // PWM整合制御レジスタの設定
ステップ5: -PWMチャネルの最大周期はPWMMRを使用して設定されます。
PWMMR0 = PWM値; // PWM値を与える最大値
私たちの場合、最大値は255です(最大輝度の場合)
ステップ6:-次に、PWMLERを使用してラッチイネーブルを対応するマッチレジスタに設定する必要があります
PWMLER =(1 << 0); // EnalbePWMラッチ
(PWMMR0を使用します)したがって、PWMLERで1を設定して、対応するビットを有効にします。
ステップ7:-ピンへのPWM出力を有効にするには、PWMTCRを使用してPWMタイマーカウンターとPWMモードを有効にする必要があります。
PWMTCR =(1 << 0)-(1 << 3); // PWMおよびPWMカウンターを有効にする
ステップ8:-次に、ADCピンP0.28からPWMのデューティサイクルを設定するためのポテンショメータ値を取得する必要があります。そのため、LPC2148のADCモジュールを使用して、ポテンショメータのアナログ入力(0〜3.3V)をADC値(0〜1023)に変換します。
ここでは、LPC2148のPWMの分解能が8ビット(2 8)であるため、値を4で除算して0-1023から0-255に変換しています。
手順9: -については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)に変換し、最後にLEDが接続されているLPC2148のP0.0ピンにPWM出力として供給します。
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出力を有効にします
ステップ10:-次に、これらの値を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"、adcvalue); LCD_DISPLAY(displayadc); // ADC値を表示します(0〜1023) LCD_SEND(0xC0); sprintf(ledoutput、 "PWM OP =%。2f"、明るさ); LCD_DISPLAY(ledoutput); //(0〜255)のデューティサイクル値を表示します
チュートリアルの完全なコードとビデオの説明を以下に示します。