- ADCとは何ですか?
- ARM7のADC-LPC2148
- ARM7-LPC2148のADCピン
- ARM7-LPC2148のADCレジスタ
- LPC2148のADxCRレジスタ
- ADxGDR:ADCグローバルデータレジスタ
- 必要なコンポーネント
- 回路図
- ADC用のARM7-LPC2148のプログラミング
エレクトロニクスの世界では、温度、速度、変位、圧力などを測定するために使用される多くの種類のアナログセンサーが市場に出回っています。アナログセンサーは、時間とともに絶えず変化する出力を生成するために使用されます。アナログセンサーからのこれらの信号は、数マイクロボルト(uV)から数ミリボルト(mV)まで値が非常に小さい傾向があるため、何らかの形の増幅が必要です。マイクロコントローラでこれらのアナログ信号を使用するには、マイクロコントローラがデジタル信号のみを理解して処理するため、アナログ信号をデジタル信号に変換する必要があります。そのため、ほとんどのマイクロコントローラーには、ADC(アナログ-デジタルコンバーター)と呼ばれる重要な機能が組み込まれています。当社のマイクロコントローラARM7-LPC2148にもADC機能があります。
このチュートリアルでは、アナログピンに可変電圧を供給してARM7-LPC2148でADCを使用し、アナログからデジタルへの変換後に16x2LCD画面に表示する方法を説明します。それでは、ADCについての簡単な紹介から始めましょう。
ADCとは何ですか?
前述のように、ADCはアナログ-デジタル変換の略で、アナログ値を実世界から1や0などのデジタル値に変換するために使用されます。では、これらのアナログ値は何ですか?これらは、温度、速度、明るさなどの日常生活で見られるものです。これらのパラメータは、それぞれのセンサーによってアナログ電圧として測定され、マイクロコントローラーのデジタル値に変換されます。
ADCの範囲が0V〜3.3Vで、10ビットのADCがあると仮定します。これは、入力電圧0〜3.3ボルトが1024レベルの離散アナログ値(2 10 = 1024)に分割されることを意味します。意味1024は10ビットADCの解像度であり、同様に8ビットADCの解像度は512(28)であり、16ビットADCの解像度は65,536(216)です。LPC2148には10ビット分解能のADCがあります。
これにより、実際の入力電圧が0Vの場合、MCUのADCは0として読み取り、3.3Vの場合、MCUは1024を読み取り、1.65vのような中間の場合、MCUは512を読み取ります。以下を使用できます。 ADCの分解能と動作電圧に基づいてMCUによって読み取られるデジタル値を計算するための式。
(ADC分解能/動作電圧)=(ADCデジタル値/実際の電圧値)
たとえば、基準電圧が3vの場合のように:
ADCについては前回の記事で詳しく説明しました。
ARM7のADC-LPC2148
- LPC2148には、2つのアナログ-デジタルコンバーターが含まれています。
- これらのコンバーターは、単一の10ビット逐次比較アナログ-デジタルコンバーターです。
- ADC0には6つのチャネルがありますが、ADC1には8つのチャネルがあります。
- したがって、LPC2148で使用可能なADC入力の総数は14です。
- 入力電圧を(0〜3.3V)の範囲でのみ変換します。電圧リファレンスの3.3Vを超えてはなりません。ICを損傷し、不確実な値を提供するため。
LPC2148のADCのいくつかの重要な機能
- 各コンバーターは、1秒あたり400000を超える10ビットサンプルを実行できます。
- すべてのアナログ入力には、割り込みオーバーヘッドを削減するための専用の結果レジスタがあります。
- 単一または複数の入力のバースト変換モード。
- 入力ピンまたはタイマー一致信号の遷移時のオプションの変換。
- 両方のコンバーターのグローバル開始コマンド。
また、他のマイクロコントローラーでADCを使用する方法も確認してください。
- Arduino UnoでADCを使用する方法は?
- ADC0808と8051マイクロコントローラーのインターフェース
- PICマイクロコントローラーのADCモジュールの使用
- Raspberry PiADCチュートリアル
- MSP430G2でADCを使用する方法-アナログ電圧の測定
- STM32F103C8でADCを使用する方法
ARM7-LPC2148のADCピン
先に述べたように、ARM7-LPC2148には、6つのアナログ入力ピンを備えたADC0と8つのアナログ入力ピンを備えたADC1の2つのチャネルがあります。したがって、アナログ入力用に合計14ピンがあります。次の図は、アナログ入力に使用できるピンを示しています。
ADC入力ピンは他のGPIOピンと多重化されているためです。PINSELレジスタを設定してADC機能を選択することにより、それらを有効にする必要があります。
以下の表は、LPC2148のADCのピンと尊重されるADCチャネル番号を示しています。AD0はチャネル0で、AD1はチャネル1です。
LPC2148ピン |
ADCチャンネル番号 |
P0.28 |
AD0.1 |
P0.29 |
AD0.2 |
P0.30 |
AD0.3 |
P0.25 |
AD0.4 |
P0.4 |
AD0.6 |
P0.5 |
AD0.7 |
P0.6 |
AD1.0 |
P0.8 |
AD1.1 |
P0.10 |
AD1.2 |
P0.12 |
AD1.3 |
P0.13 |
AD1.4 |
P0.15 |
AD1.5 |
P0.21 |
AD1.6 |
P0.22 |
AD1.7 |
ARM7-LPC2148のADCレジスタ
レジスタは、LPC2148のA / D変換機能を使用するためのプログラミングで使用されます。
以下は、A / D変換のためにLPC2148で使用されるレジスタのリストです。
1. ADCR:アナログ-デジタル制御レジスタ
用途:このレジスタは、LPC2148でA / Dコンバータを構成するために使用されます
2. ADGDR:アナログ-デジタルグローバルデータレジスタ
用途:このレジスタにはA / Dコンバータ用のDONEビットがあり、変換の結果がここに格納されます。
3. ADINTERN:アナログ-デジタル割り込みイネーブルレジスタ
用途:これは割り込みイネーブルレジスタです。
4. ADDR0 – ADDR7:アナログ-デジタルチャネルデータレジスタ
用途:このレジスタには、それぞれのチャネルのA / D値が含まれています。
5. ADSTAT:アナログ-デジタルステータスレジスタ。
用途:このレジスタには、それぞれのADCチャネルのDONEフラグと、それぞれのADCチャネルのOVERRUNフラグが含まれています。
このチュートリアルでは、ADCRおよびADGDRレジスタのみを使用します。それらについて詳しく見てみましょう
LPC2148のADxCRレジスタ
チャネル0とチャネル1のそれぞれのAD0CRとAD1CR。これは32ビットレジスタです。以下の表は、ADCRレジスタのビットフィールドを示しています。
31:28 |
27 |
26:24 |
23:22 |
21 |
20 |
19:17 |
16 |
15:8 |
7:0 |
予約済み |
縁 |
開始 |
予約済み |
PDN |
予約済み |
CLKS |
バースト |
CLCKDIV |
SEL |
個々のレジスタを構成する方法について見てみましょう
1. SEL:(0〜7)のビットは、ADC変換用のチャネルを選択するために使用されます。各チャネルに1ビットが割り当てられます。たとえば、ビット0を設定すると、ADCは変換のためにAD0.1をサンプリングします。また、ビット-1を設定すると、AD0.1になります。同様にビット7を設定すると、AD0.7の変換が行われます。重要なステップは、使用しているポートに応じてPINSELを用意することです。たとえば、PLC2148のPORT0にはPINSEL0を使用します。
2. CLCKDIV:(8〜15)のビットはクロック除数用です。ここで、APBクロック(ARMペリフェラルバスクロック)をこの値に1を加えた値で除算して、A / Dコンバータに必要なクロックを生成します。これは、LPC2148で逐次比較法を使用しているため、4.5MHz以下である必要があります。
3. BURST:ビット16はBURST変換モードに使用されます。
設定1:ADCは、SELビットで選択されたすべてのチャネルに対して変換を行います。
設定0:BURST変換モードを無効にします。
4. CLCKS:連続A / D変換モードであるため、バーストモードでのA / D変換の分解能とクロック数の選択には、(17〜19)3ビットのビットが使用されます。
ビットの値(17〜19) |
ビット(精度) |
時計の数 |
000 |
10 |
11 |
001 |
9 |
10 |
010 |
8 |
9 |
011 |
7 |
8 |
100 |
6 |
7 |
101 |
5 |
6 |
110 |
4 |
5 |
111 |
3 |
4 |
5. PDN:ビット21は、LPC2148でADCのパワーダウンモードを選択するためのものです。
- A / DはPDNモードです。
- A / Dは動作モードです
6. START:(24から26)までのビットはSTART用です。0を設定してBURST変換モードがOFFの場合、これらのSTARTビットはA / D変換を開始するときに役立ちます。STARTは、エッジ制御変換にも使用されます。これは、LPC2148のCAPまたはMATピンに入力がある場合、A / Dが変換を開始します。下の表を確認しましょう
ビットの値(24から26) |
LPC2148のピン |
ADCの機能 |
000 |
ADCをPDNモードに設定するために使用されます スタートなし |
|
001 |
A / D変換を開始します |
|
010 |
CAP0.2 / MAT0.2 |
LPC2148のCAP / MATピンのピン27(立ち上がりまたは立ち下がり)で選択されたEDGEでA / D変換を開始します。 |
011 |
CAP0.0 / MAT0.0 |
|
100 |
MAT0.1 |
|
101 |
MAT0.3 |
|
110 |
MAT1.0 |
|
111 |
MAT1.1 |
7. EDGE: 27番目のビットはEDGE用で、STARTビットに010-111が含まれている場合にのみ使用されます。上記の表にあるCAPまたはMAT入力があると、変換が開始されます。
設定:0-立ち下がりエッジ
1-ライジングエッジ
ADxGDR:ADCグローバルデータレジスタ
ADCチャネル0およびADCチャネル1のAD0GDRおよびAD1GDR。
これは32ビットレジスタであり、A / D変換の結果と、A / D変換が行われたことを示すDONEビットが含まれています。以下の表は、ADGDRレジスタのビットフィールドを示しています。
31 |
30 |
29:27 |
26:24 |
23:16 |
15:6 |
5:0 |
完了 |
オーバーラン |
予約済み |
CHN |
予約済み |
結果 |
予約済み |
1.結果:これらのビット(6〜15)には、ADCRSELレジスタで選択されたチャネルのA / D変換の結果が含まれます。値はA / D変換が完了した後にのみ読み取られ、これはDONEビットで示されます。
例: 10ビットADCの結果の場合、保存される値は(0から1023)まで変化します。
2.チャンネル:これらのビット24〜26には、A / D変換が行われるチャンネル番号が含まれています。変換されたデジタル値はRESULTビットに存在します。
例:000はADCチャネル0用、001はADCチャネル1用などです。
3. OVERRUN:OVERRUNの30番目のビットはバーストモードで使用されます。セット1の場合、前に変換されたADC値は、新しく変換されたADC値によって上書きされます。レジスタが読み取られると、OVERRUNビットがクリアされます。
4. DONE: 31番目のビットはDONEビット用です。
セット1:A / D変換が完了したとき。
セット0:レジスタが読み取られ、ADCRが書き込まれるとき。
LPC2148のADCで使用される重要なレジスタについて見てきました。それでは、ARM7でADCの使用を開始しましょう。
必要なコンポーネント
ハードウェア
- ARM7-LPC2148マイクロコントローラー
- 3.3V電圧レギュレータIC
- 5V電圧レギュレータIC
- 10Kポテンショメータ–2個
- LED(任意の色)
- LCDディスプレイ(16X2)
- 9V電池
- ブレッドボード
- 接続線
ソフトウェア
- 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) |
ARM 7 –LPC2148でのLCDの使用の詳細をご覧ください。
重要:ここでは、2つの電圧レギュレータICを使用しています。1つは5V LCDディスプレイ用で、もう1つはポテンショメータで変更できるアナログ入力用の3.3Vです。
LCDとARM7スティックを備えた5V電圧レギュレータ間の接続
5V電圧レギュレータIC |
ピン機能 |
LCD&ARM-7 LPC2148 |
1.左ピン |
+バッテリーからのVe9V入力 |
NC |
2.センターピン |
-バッテリーからのVe |
LCDのVSS、R / W、K ARM7のGND |
3.右ピン |
調整された+ 5V出力 |
LCDのVDD、A + 5VのARM7 |
LCD付きポテンショメータ
ポテンショメータは、LCDディスプレイのコントラストを変化させるために使用されます。ポットには3つのピンがあり、左側のピン(1)は+ 5Vに接続され、中央(2)はLCDモジュールのVEEまたはV0に接続され、右側のピン(3)はGNDに接続されます。つまみを回してコントラストを調整できます。
LPC2148と3.3V電圧レギュレータを備えたポテンショメータ間の接続
3.3V電圧レギュレータIC |
ピン機能 |
ARM-7 LPC2148 |
1.左ピン |
-バッテリーからのVe |
GNDピン |
2.センターピン |
調整された+ 3.3V出力 |
ポテンショメータ入力およびポテンショメータの出力をP0.28に |
3.右ピン |
+バッテリーからのVe9V入力 |
NC |
ADC用のARM7-LPC2148のプログラミング
ARM7-LPC2148をプログラムするには、keil uVision&FlashMagicツールが必要です。USBケーブルを使用してマイクロUSBポート経由でARM7スティックをプログラムしています。Keilを使用してコードを記述し、16進ファイルを作成してから、FlashMagicを使用してHEXファイルをARM7スティックにフラッシュします。keiluVisionとFlashMagicのインストールとその使用方法の詳細については、「ARM7 LPC2148マイクロコントローラー入門」リンクをたどり、KeiluVisionを使用してプログラムしてください。
このチュートリアルでは、LPC2148のADCを使用してアナログ入力電圧(0〜3.3V)をデジタル値に変換し、LCDディスプレイ(16x2)にアナログ電圧を表示します。ポテンショメータを使用して、入力アナログ電圧を変化させます。
LCDとARM7-LPC21484ビットモードとのインターフェースの詳細については、このリンクをたどってください。
ARM 7でADCを使用するための完全なコードは、このチュートリアルの最後にあります。ここでは、そのいくつかの部分について説明します。
LPC2148-ADCプログラミングに関連するステップ
1. PINSELレジスタは、LPC2148のポートピンを選択するために使用され、ADCはアナログ入力として機能します。
PINSEL1 = 0x01000000; //AD0.1としてP0.28を選択します
2. ADxCR(ADC制御レジスタ)に値を書き込んで、変換するクロックとビットの精度を選択します。
AD0CR = 0x00200402; //変換用にADC動作を10ビット/ 11 CLKに設定(000)
3. ADxCRのSTARTビットに値を書き込んで、変換を開始します。
ここでは、AD0CRレジスタの24番目のビットに書き込みました。
AD0CR = AD0CR-(1 << 24);
4.これで、対応するADxDRy(ADCデータレジスタ)のDONEビット(31番目)が0から1に変化するの を 確認する必要が あり ます。したがって、 while ループを使用 して 、データレジスタの31番目のビットで変換が行われるかどうかを常に確認します。
while(!(AD0DR1&0x80000000));
5.完了ビットが1に設定された後、変換は成功します。次に、同じADCデータレジスタAD0DR1から結果を読み取り、その値を変数に格納します。
adcvalue = AD0DR1;
次に、我々はという名前の変数に電圧と店にデジタル値に変換するための式を使用 電圧 。
電圧=((adcvalue / 1023.0)* 3.3);
5.以下の行は、アナログからデジタルへの変換後のデジタル値(0〜1023)を表示するために使用されます。
adc = adcvalue; sprintf(displayadc、 "adcvalue =%f"、adc); LCD_DISPLAY(displayadc); // ADC値を表示します(0〜1023)
6.以下の行は、アナログからデジタルへの変換後およびステップ5の後の入力アナログ電圧(0〜3.3V)を表示するために使用されます。
LCD_SEND(0xC0); sprintf(voltvalue、 "Voltage =%。2f V"、電圧); LCD_DISPLAY(voltvalue); //表示(入力アナログ電圧)
7.次に、LCDディスプレイに入力電圧とデジタル値を表示する必要があります。その前に、LCDディスプレイを初期化し、表示するメッセージを送信するための適切なコマンドを使用する必要があります。
以下のコードは、LCDを初期化するために使用されます
void LCD_INITILIZE(void)// LCDを準備する関数 { IO0DIR = 0x0000FFF0; //ピンP0.12、P0.13、P0.14、P0.15、P0.4、P0.6をOUTPUT delay_ms(20); として設定します。LCD_SEND(0x02); // 4ビット動作モードでlcdを初期化します LCD_SEND(0x28); // 2行(16X2) LCD_SEND(0x0C); //カーソルをオフに表示 LCD_SEND(0x06); //カーソルを自動インクリメント LCD_SEND(0x01); //クリア LCD_SEND(0x80);を 表示します //最初の行の最初の位置}
以下のコードは、LCDに値を表示するために使用されます
文字を印刷するボイドLCD_DISPLAY(CHAR * MSG)//関数は、1つずつ送信{ I = 0 uint8_t。 while(msg!= 0) { IO0PIN =((IO0PIN&0xFFFF00FF)-((msg&0xF0)<< 8)); //上位ニブルを 送信IO0SET = 0x00000050; // RS HIGH& ENABLEHIGHで データを出力IO0CLR = 0x00000020; // RW LOW書き込みモードdelay_ms(2); IO0CLR = 0x00000040; // EN = 0、RSおよびRWは変更されていません(つまり、RS = 1、RW = 0) delay_ms(5); IO0PIN =((IO0PIN&0xFFFF00FF)-((msg&0x0F)<< 12)); //下位ニブルを 送信IO0SET = 0x00000050; // RS&EN HIGH IO0CLR = 0x00000020; delay_ms(2); IO0CLR = 0x00000040; delay_ms(5); i ++; } }
以下の関数は遅延を作成するために使用されます
void delay_ms(uint16_t j)//ミリ秒単位で遅延を作成する関数 { uint16_t x、i; for(i = 0; i
デモビデオ付きの完全なコードを以下に示します。