デジタルとアナログはエレクトロニクスの不可欠な部分です。ほとんどのデバイスにはADCとDACの両方があり、信号をアナログからデジタル、またはデジタルからアナログに変換する必要がある場合に使用されます。また、音や光などの実世界の信号は本質的にアナログであるため、これらの実世界の信号を使用する必要がある場合は常に、デジタル信号をアナログに変換する必要があります。たとえば、スピーカーを使用して音を生成したり、光源を制御したりします。
別のタイプのDACは、パルス幅変調器(PWM)です。PWMはデジタルワードを受け取り、可変パルス幅のデジタルパルスを生成します。この信号がフィルターを通過すると、結果は純粋にアナログになります。アナログ信号は、信号に複数のタイプのデータを含めることができます。
このチュートリアルでは、デジタルからアナログへの変換のために、DACMCP4921をMicrochipPIC16F877Aとインターフェースさせます。
このチュートリアルでは、デジタル信号をアナログ信号に変換し、入力デジタル値と出力アナログ値を16x2LCDに表示します。最後に示すビデオで示されている最終的なアナログ出力として、1V、2V、3V、4V、および5Vを提供します。DACについては、Raspberry Pi、Arduino、およびSTM32ボードとインターフェイスするDACの貴重なチュートリアルでさらに学ぶことができます。
DACは 、モーター制御、LEDライトの輝度制御、オーディオアンプ、ビデオエンコーダー、データ収集システムなど、多くのアプリケーションで使用できます。インターフェイス部分に直接ジャンプする前に、MCP4921の概要を理解することが重要です。
MCP4921 DAC(デジタル-アナログコンバーター)
MCP4921は12ビットDACであるため、MCP4921は12ビットの出力分解能を提供します。DAC分解能とは、アナログ信号に変換できるデジタルビットの数を意味します。これから達成できる値の数は、式に基づいています。12ビットの場合は= 4096です。これは、12ビット解像度のDACが4096の異なる出力を生成できることを意味します。
この値を使用することにより、シングルアナログステップ電圧を簡単に計算できます。ステップを計算するには、基準電圧が必要です。デバイスの論理電圧は5Vであるため、ステップ電圧は5/4095(デジタルの開始点が1ではないため4096-1、0)、つまり0.00122100122ミリボルトです。したがって、1ビットを変更すると、0.00122100122のアナログ出力が変更されます。
だから、それは変換部分でした。MCP4921は、8ピンICです。ピンの図と説明は下記の通りです。
MCP4921 ICは、SPIプロトコルによってマイクロコントローラと通信します。SPI通信の場合、デバイスはマスターである必要があります。マスターは、スレーブとして接続されている外部デバイスにデータまたはコマンドを送信します。SPI通信システムでは、複数のスレーブデバイスを単一のマスターデバイスに接続できます。
データとコマンドを送信するには、コマンドレジスタを理解することが重要です。
次の画像では、コマンドレジスタが示されています。
コマンドレジスタは、16ビットのレジスタです。ビット15からビット12は、構成コマンドに使用されます。データ入力と構成は上の画像に明確に示されています。このプロジェクトでは、MCP4921は次の構成として使用されます-
ビット番号 |
構成 |
構成値 |
ビット15 |
DAC A |
0 |
ビット14 |
バッファなし |
0 |
ビット13 |
1x(V OUT * D / 4096) |
1 |
ビット12 |
出力パワーダウン制御ビット |
1 |
したがって、バイナリは、レジスタのD11〜D0ビットによって決定されるデータとともに0011です。16ビットデータ0011xxxx xxxx xxxxを送信する必要があります。ここで、MSBの最初の4ビットは構成で、残りはLSBです。書き込みコマンドのタイミング図を見ると、より明確になります。
タイミング図とデータシートによると、CSピンはMCP4921へのコマンド書き込み期間全体にわたってローです。
次に、デバイスをハードウェアとインターフェイスさせ、コードを記述します。
必要なコンポーネント
このプロジェクトでは、次のコンポーネントが必要です-
- MCP4921
- PIC16F877A
- 20MHzクリスタル
- ディスプレイ16x2文字のLCD。
- 2k抵抗-1個
- 33pFコンデンサ-2個
- 4.7k抵抗-1個
- 出力電圧を測定するためのマルチメータ
- ブレッドボード
- 5V電源、電話充電器が動作します。
- フックアップワイヤーまたはベルクワイヤーがたくさん。
- プログラマーキットを備えたマイクロチッププログラミング環境とコンパイラーを備えたIDE
回路図
DAC4921をPICマイクロコントローラー とインターフェースするための回路図を 以下に示します。
回路はブレッドボードで構成されています-
コードの説明
PIC16F877A を使用してデジタル信号をアナログに変換するための完全なコードは、記事の最後に記載されています。いつものように、最初にPICマイクロコントローラの構成ビットを設定する必要があります。
// PIC16F877A構成ビット設定 // 'C'ソースライン 構成ステートメント// CONFIG #pragma config FOSC = HS //オシレーター選択ビット(HSオシレーター) #pragma config WDTE = OFF //ウォッチドッグタイマー有効ビット(WDT無効) # pragma config PWRTE = OFF //パワーアップタイマーイネーブルビット(PWRT無効) #pragma config BOREN = ON //ブラウンアウトリセットイネーブルビット(BOR有効) #pragma config LVP = OFF //低電圧(単電源) )インサーキットシリアルプログラミングイネーブルビット(RB3 / PGMピンにはPGM機能があり、低電圧プログラミングが有効) #pragma config CPD = OFF //データEEPROMメモリコード保護ビット(データEEPROMコード保護オフ) #pragma config WRT = OFF //フラッシュプログラムメモリ書き込みイネーブルビット(書き込み保護オフ。すべてのプログラムメモリはEECON制御によって書き込むことができます) #pragma config CP = OFF //フラッシュプログラムメモリコード保護ビット(コード保護オフ)
以下のコード行は、LCDおよびSPIヘッダーファイルを統合するために使用され、XTAL周波数およびDACのCSピン接続も宣言されています。
PIC SPIチュートリアルとライブラリは、所定のリンクにあります。
#include
Funciton SPI_Initialize_Master() は、このプロジェクトに必要な別の構成用にわずかに変更されています。この場合、SSPSTATレジスタは、データ出力時間の終わりにサンプリングされた入力データと、送信として構成されたSPIクロックが、アクティブからアイドルクロック状態モードへの移行時に発生するように構成されます。その他は同じです。
void SPI_Initialize_Master() { TRISC5 = 0; //出力として設定 SSPSTAT = 0b11000000; // pg 74/234 SSPCON = 0b00100000; // pg 75/234 TRISC3 = 0; //スレーブモードの出力として設定 }
また、以下の関数では、 SPI_Write() がわずかに変更されています。SPIを介した完全なデータ送信を保証するために、バッファがクリアされた後にデータ送信が行われます。
void SPI_Write(charcoming) { SSPBUF =着信; //ユーザーが指定したデータをバッファに書き込みます while(!SSPSTATbits.BF); }
プログラムの重要な部分はMCP4921ドライバーです。コマンドとデジタルデータが一緒にパンチされてSPIを介して完全な16ビットデータを提供するため、これは少し注意が必要な部分です。ただし、そのロジックはコードコメントに明確に示されています。
/ * この関数はデジタル値をアナログに変換するためのものです。 * / void convert_DAC(unsigned int value) { / *ステップサイズ= 2 ^ n、したがって12ビット2 ^ 12 = 4096 5Vリファレンスの場合、ステップは5/4095 = 0.0012210012210012Vまたは1mV(約)* / unsignedintコンテナになります; unsigned int MSB; unsigned int LSB; / *ステップ: 1、12 ビットデータをコンテナに格納データが4095、バイナリ1111 1111 1111 * / container = value;であるとします。 / *ステップ:2ダミー8ビットを作成します。したがって、256を除算することにより、上位4ビットがLSB LSB = 0000 1111 * / LSB = container / 256で キャプチャされます。/ *ステップ:34ビットデータをパンチして構成を送信します。 LSB = 00110000または00001111。結果は00111111 * / LSB =(0x30)-LSB; / * Step:4コンテナにはまだ21ビットの値があります。下位8ビットを抽出します。 11111111および11111111111。結果は11111111であり、これはMSB * / MSB = 0xFF&container;です。 / *ステップ:42バイトに分割して16ビットデータを送信します。* / DAC_CS = 0; //データ送信中のCSはローです。データシートによると、 SPI_Write(LSB) が必要です。SPI_Write(MSB); DAC_CS = 1; }
主な機能では、1V、2V、3V、4V、および5Vの出力を作成するためのデジタルデータが作成される「forループ」が使用されます。デジタル値は、出力電圧/0.0012210012210012ミリボルトに対して計算されます。
void main(){ system_init(); Introduction_screen(); int number = 0; int volt = 0; while(1){ for(volt = 1; volt <= MAX_VOLT; volt ++){ number = volt / 0.0012210012210012; clear_screen(); lcd_com(FIRST_LINE); lcd_puts( "DATA Sent:-"); lcd_print_number(number); lcd_com(SECOND_LINE); lcd_puts( "出力:-"); lcd_print_number(volt); lcd_puts( "V"); convert_DAC(number); __delay_ms(300); } } }
PICを使用したデジタルからアナログへの変換のテスト
構築された回路は、マルチメータを使用してテストされます。下の画像では、出力電圧とデジタルデータがLCDに表示されています。マルチメータは詳細な読み取りを示しています。
動作するビデオを含む完全なコードを以下に添付します。