- 必要なコンポーネント
- MCP4725 DACモジュール(デジタル-アナログコンバーター)
- MCP4725でのI2C通信
- 回路図と説明
- デジタルからアナログへの変換のためのSTM32F103C8のプログラミング
- STM32を使用したDACのテスト
マイクロコントローラーはデジタル値でのみ機能することは誰もが知っていますが、現実の世界ではアナログ信号を処理する必要があります。そのため、 ADC(Analog to Digital Converters) は、マイクロコントローラーが信号を処理できるように、実世界のアナログ値をデジタル形式に変換するためにあります。しかし、デジタル値からのアナログ信号が必要な場合はどうでしょうか 。DAC(デジタル-アナログコンバーター)が登場します。
デジタル-アナログコンバーターの簡単な例 は、アーティストの歌手がマイクを使用して歌を歌っているスタジオで曲を録音することです。これらのアナログ音波はデジタル形式に変換されてからデジタル形式のファイルに保存され、保存されたデジタルファイルを使用して曲が再生されると、これらのデジタル値はスピーカー出力用のアナログ信号に変換されます。したがって、このシステムではDACが使用されます。
DACは 、モーター制御、LEDライトの明るさの制御、オーディオアンプ、ビデオエンコーダー、データ収集システムなど、多くのアプリケーションで使用できます。
MCP4725DACモジュールはすでにArduinoとインターフェースしています。今日は、同じMCP4725 DAC ICを使用して、STM32F103C8マイクロコントローラーを使用したデジタル-アナログコンバーターを設計します。
必要なコンポーネント
- STM32F103C8
- MCP4725 DAC IC
- 10kポテンショメータ
- 16x2LCDディスプレイ
- ブレッドボード
- 接続線
MCP4725 DACモジュール(デジタル-アナログコンバーター)
MCP4725 ICは、( 0〜5V)の 出力アナログ電圧を生成するために使用される12ビットデジタル-アナログコンバータモジュールであり、I2C通信を使用して制御されます。また、オンボードの不揮発性メモリEEPROMが付属しています。
このICの分解能は12ビットです。これは、(0〜4096)を入力として使用して、基準電圧に対する電圧出力を提供することを意味します。最大基準電圧は5Vです。
出力電圧を計算する式
O / P電圧=(基準電圧/分解能)xデジタル値
たとえば 、基準電圧として5Vを使用し、デジタル値が2048であると仮定すると、DAC出力を計算します。
O / P電圧=(5/4096)x 2048 = 2.5V
MCP4725のピン配置以下は、ピン名を明確に示したMCP4725の画像です。
MCP4725のピン |
使用する |
アウト |
アナログ電圧を出力 |
GND |
出力用GND |
SCL |
I2Cシリアルクロックライン |
SDA |
I2Cシリアルデータライン |
VCC |
入力基準電圧5Vまたは3.3V |
GND |
入力用GND |
MCP4725でのI2C通信
このDACICは、I2C通信を使用して任意のマイクロコントローラーとインターフェースできます。I2C通信には、SCLとSDAの2本のワイヤのみが必要です。デフォルトでは、MCP4725のI2Cアドレスは0x60です。リンクをたどって、STM32F103C8のI2C通信の詳細を確認してください。
STM32F103C8のI2Cピン:
SDA: PB7またはPB9、PB11。
SCL:PB6またはPB8、PB10。
回路図と説明
STM32F103C8と16x2LCD間の接続
LCDピン番号 |
LCDピン名 |
STM32ピン名 |
1 |
グラウンド(Gnd) |
地面(G) |
2 |
VCC |
5V |
3 |
VEE |
コントラストのためにポテンショメータの中心からピンで留めます |
4 |
レジスタ選択(RS) |
PB11 |
5 |
読み取り/書き込み(RW) |
地面(G) |
6 |
有効(EN) |
PB10 |
7 |
データビット0(DB0) |
接続なし(NC) |
8 |
データビット1(DB1) |
接続なし(NC) |
9 |
データビット2(DB2) |
接続なし(NC) |
10 |
データビット3(DB3) |
接続なし(NC) |
11 |
データビット4(DB4) |
PB0 |
12 |
データビット5(DB5) |
PB1 |
13 |
データビット6(DB6) |
PC13 |
14 |
データビット7(DB7) |
PC14 |
15 |
LEDポジティブ |
5V |
16 |
LEDネガティブ |
地面(G) |
MCP4725 DACICとSTM32F103C8間の接続
MCP4725 |
STM32F103C8 |
マルチメータ |
SDA |
PB7 |
NC |
SCL |
PB6 |
NC |
アウト |
PA1 |
ポジティブプローブ |
GND |
GND |
ネガティブプローブ |
VCC |
3.3V |
NC |
ポテンショメータも接続されており、中央のピンはSTM32F10C8のPA1アナログ入力(ADC)に接続され、左のピンはGNDに接続され、右端のピンはSTM32F103C8の3.3Vに接続されています。
このチュートリアルでは、MCP4725 DAC ICをSTM32に接続し、10kポテンショメータを使用してSTM32ADCピンPA0にアナログ入力値を提供します。次に、ADCを使用してアナログ値をデジタル形式に変換します。その後、それらのデジタル値をI2Cバス経由でMCP4725に送信します。次に、DAC MCP4725 ICを使用してこれらのデジタル値をアナログに変換し、STM32の別のADCピンPA1を使用して、ピンOUTからのMCP4725のアナログ出力をチェックします。最後に、ADCとDACの両方の値を電圧とともに16x2LCDディスプレイに表示します。
デジタルからアナログへの変換のためのSTM32F103C8のプログラミング
コードをSTM32F103C8にアップロードするために、FTDIプログラマーは必要ありません。STM32のUSBポート経由でPCに接続し、ARDUINOIDEでプログラミングを開始するだけです。Arduino IDEでのSTM32のプログラミングの詳細については、このリンクにアクセスしてください。このSTM32DACチュートリアルの完全なプログラムは、最後に記載されています。
まず、I2CやLCD使用するためのライブラリが含まwire.h、SoftWire.hとliquidcrystal.hライブラリを。STM32マイクロコントローラのI2Cについて詳しくは、こちらをご覧ください。
#include
次に、STM32F103C8に接続されているLCDピンに従って、LCDピンを定義して初期化します。
const int rs = PB11、en = PB10、d4 = PB0、d5 = PB1、d6 = PC13、d7 = PC14; LiquidCrystal lcd(rs、en、d4、d5、d6、d7);
次に、MCP4725 DACICのI2Cアドレスを定義します。MCP4725DACのデフォルトのI2Cアドレスは0x60です
#define MCP4725 0x60
void setup()で
まず、STM32F103C8のピンPB7(SDA)およびPB6(SCL)でI2C通信を開始します。
Wire.begin(); // I2C通信を開始します
次に、LCDディスプレイを16x2モードに設定し、ウェルカムメッセージを表示します。
lcd.begin(16,2); lcd.print( "CIRCUIT DIGEST"); delay(1000); lcd.clear(); lcd.setCursor(0,0); lcd.print( "STM32F103C8"); lcd.setCursor(0,1); lcd.print( "DAC with MCP4725"); delay(2000); lcd.clear();
void loop()で
1.最初にバッファに制御バイト値(0b01000000)を入れます。
(010-MCP4725を書き込みモードに設定します) buffer = 0b01000000;
2.次の文は、ADCは、変数で12ビットの分解能とストアであるように0 to4096の範囲のデジタル値にピンPA0と変換し、それからのアナログ値を読み出す ADC 。
adc = analogRead(PA0);
3.この次のステートメントは、3.3Vの基準電圧でADC入力値(0〜4096)から電圧を計算するために使用される式です。
float ipvolt =(3.3 / 4096.0)* adc;
4. ADC変数で4ビットを右にシフトして最上位ビット値をバッファーに入れ、 adc 変数で4ビットを左にシフトして最下位ビット値をバッファーに入れます。
バッファ= adc >> 4; バッファ= adc << 4;
5.次のステートメントは、DAC出力であるSTM32のADCピンPA1(MCP4725 DAC ICのOUTPUTピン)からアナログ値を読み取ります。このピンをマルチメータに接続して、出力電圧をチェックすることもできます。
unsigned int Analogread = AnalogRead(PA1);
6.さらに、変数 analogread からの電圧値は、次のステートメントの式を使用して計算されます。
float opvolt =(3.3 / 4096.0)*アナログ読み取り;
7.同じ voidループ() には、以下で説明する他のステートメントがいくつかあります。
MCP4725で送信を開始します。
Wire.beginTransmission(MCP4725);
制御バイトをI2Cに送信します
Wire.write(バッファ);
MSBをI2Cに送信します
Wire.write(バッファ);
LSBをI2Cに送信します
Wire.write(バッファ);
送信を終了します
Wire.endTransmission();
次に、lcd.print()を使用してこれらの結果をLCD16x2ディスプレイに表示します。
lcd.setCursor(0,0); lcd.print( "A IP:"); lcd.print(adc); lcd.setCursor(10,0); lcd.print( "V:"); lcd.print(ipvolt); lcd.setCursor(0,1); lcd.print( "D OP:"); lcd.print(analogread); lcd.setCursor(10,1); lcd.print( "V:"); lcd.print(opvolt); delay(500); lcd.clear();
STM32を使用したDACのテスト
ポテンショメータを回転させて入力ADC値と電圧を変化させると、出力DAC値と電圧も変化します。ここでは、LCDディスプレイの最初の行に入力値が表示され、2番目の行に出力値が表示されます。マルチメータもMCP4725出力ピンに接続され、アナログ電圧を確認します。
デモビデオ付きの完全なコードを以下に示します。