- 必要な材料
- STM8S103F3P6のADC
- STM8SでADC値を読み取り、LCDで表示するための回路図
- STM8S103F3P6用のADCライブラリ
- アナログ電圧を読み取り、LCDに表示するSTM8Sプログラム
- STM8Sを使用して2つのポテンショメータからアナログ電圧を読み取る
STM8Sマイクロコントローラーチュートリアルをフォローしている常連の読者であれば、前回のチュートリアルで、16x2LCDをSTM8とインターフェースする方法を学んだことをご存知でしょう。ここで、このチュートリアルを進めて、STM8S103F3P6マイクロコントローラーでADC機能を使用する方法を学習します。ADCは、変動する電圧、電流、温度、湿度などの一定の変化にある単位を測定するために組み込みプログラマーによってよく使用されるマイクロコントローラーの非常に便利な周辺機器です。
私たちが知っているように、「私たちはデジタルデバイスを備えたアナログの世界に住んでいます」。つまり、風速、光の強さ、温度などの周囲のすべて、および速度、速度、圧力などのように扱うすべてのものは、本質的にアナログです。しかし、当社のマイクロコントローラーとマイクロプロセッサーはデジタルデバイスであり、アナログ-デジタルコンバーター(ADC)と呼ばれる重要な周辺機器がないとこれらのパラメーターを測定できません。したがって、この記事では、COMICCコンパイラを使用してSTM8SマイクロコントローラでADCを使用する方法を学びましょう。
必要な材料
この記事では、2つのポテンショメータから2つのアナログ電圧値を読み取り、そのADC値を16x2LCDディスプレイに表示します。これを行うには、次のコンポーネントが必要になります。
- STM8S103F3P6開発ボード
- ST-LinkV2プログラマー
- 16x2 LCD
- ポテンショメータ
- 接続線
- 1k抵抗
STM8S103F3P6のADC
ADCには多くの種類があり、各マイクロコントローラには独自の仕様があります。STM8S103F3P6には、5チャネルと 10ビットの分解能を持つADCがあります。 10ビットの分解能で、0から1024までのデジタル値を測定できます。5チャネルADCは、ADCをサポートできるマイクロコントローラーに5つのピンがあることを示します。これらの5つのピンは下の図で強調表示されています。
ご覧のとおり、これら5つのピン(AIN2、AIN3、AIN4、AIN5、およびAIN6)はすべて他の周辺機器と多重化されています。つまり、ADCピンとして機能するだけでなく、これらのピンは、たとえば次のような他の通信の実行にも使用できます。 、ピン2と3(AIN5とAIN 6)は、ADCだけでなく、シリアル通信やGPIO機能にも使用できます。 3つの目的すべてに同じピンを使用することはできないため、ADCにこれらの2つのピンを使用している場合、シリアル通信を実行できないことに注意してください。STM8S103P36のその他の重要なADC特性は、データシートから抜粋した以下の表に記載されています。
上記の表で、Vddは動作電圧を表し、Vssはグランドを表します。したがって、開発ボードの場合、マイクロコントローラーは3.3Vで動作しています。STM8Sチュートリアルの開始から、開発ボードの回路図を確認できます。動作電圧として3.3Vを使用すると、ADCクロック周波数を1〜4MHzに設定でき、変換電圧範囲は0V〜3.3Vになります。これは、0V(Vss)が提供されると10ビットADCが0を読み取り、3.3V(Vdd)が提供されると最大1024を読み取ることを意味します。必要に応じてMCUの動作電圧を変更することで、この0〜5Vを簡単に変更できます。
STM8SでADC値を読み取り、LCDで表示するための回路図
このプロジェクトで使用される完全な回路図を以下に示します。これは、前に説明したSTM8SLCDチュートリアルと非常によく似ています。
ご覧のとおり、LCD以外の追加コンポーネントは、2つのポテンショメータ POT_1 と POT_2だけ です。これらのポットは、ポートPC4およびPD6に接続されています。これらは、前述のピン配置画像で説明したように、ANI2およびANI6ピンです。
ポテンショメータは、ポテンショメータを変化させると、アナログピンで0〜5Vが得られるように接続されています。このアナログ電圧をデジタル値(0から1024)で読み取り、LCD画面に表示するようにコントローラーをプログラミングします。次に、等価電圧値を計算してLCDに表示します。コントローラーは3.3Vから電力を供給されるため、ADCピンに5Vを供給しても、0Vから3.3Vまでしか読み取れないことに注意してください。 。
接続が完了すると、私のハードウェアは次のようになります。右側に2つのポテンショメータがあり、左側にSTリンクプログラマがあります。
STM8S103F3P6用のADCライブラリ
STM8SでADC機能をプログラムするために、SPLライブラリとともにCosmicCコンパイラを使用します。ただし、プロセスを簡単にするために、GitHubにある別のヘッダーファイルを以下のリンクで作成しました。
STM8S103F3P6用のADCライブラリ
何をしているのかがわかっている場合は、上記のコードを使用してヘッダーファイルを作成し、プロジェクトページの「インクルードファイル」ディレクトリに追加できます。それ以外の場合は、STM8Sチュートリアルの開始に従って、プログラミング環境とコンパイラーのセットアップ方法を確認してください。セットアップの準備ができたら、IDEには次のヘッダーファイルがあります。少なくとも赤で囲まれているものです。
上記のヘッダーファイルは、 ADC_Read() という関数で構成されています。この関数をメインプログラムで呼び出して、任意のピンのADC値を取得できます。たとえば、 ADC_Read(AN2) は、結果としてピンAN2のADC値を返します。機能を以下に示します。
unsigned int ADC_Read(ADC_CHANNEL_TypeDef ADC_Channel_Number){unsigned int result = 0; ADC1_DeInit(); ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS、ADC_Channel_Number、ADC1_PRESSEL_FCPU_D18、ADC1_EXTTRIG_TIM、DISABLE、ADC1_ALIGN_RIGHT、ADC1_SCHMITTTRIG_ALL、DISABLE); ADC1_Cmd(ENABLE); ADC1_StartConversion(); while(ADC1_GetFlagStatus(ADC1_FLAG_EOC)== FALSE); 結果= ADC1_GetConversionValue(); ADC1_ClearFlag(ADC1_FLAG_EOC); ADC1_DeInit();
ご覧のとおり、この関数に8つのパラメーターを渡すことができます。これにより、ADCの構成方法が定義されます。上記のライブラリコードでは、変換モードを連続に設定してから、パラメータを渡してチャネル番号を取得しています。次に、コントローラーのCPU周波数を設定する必要があります。デフォルトでは(外部クリスタルを接続していない場合)、STM8Sは16Mhzの内部発振器で動作します。そのため、プリスケーラ値として「 ADC1_PRESSEL_FCPU_D18 」について説明しました。この関数内では、 SPLstm8s_adc1.h ヘッダーファイルで定義されている他のメソッドを使用しています。まず、ADCピンを非初期化し、次に ADC1_Init() を使用してADCペリフェラルを初期化します。 SPLユーザーマニュアルからのこの機能の定義を以下に示します。
次に、タイマーを使用して外部トリガーを設定し、ここでは使用しないため、外部トリガーを無効にします。次に、配置を右に設定し、最後の2つのパラメーターを使用してシュミットトリガーを設定しますが、このチュートリアルでは無効にします。つまり、簡単に言うと、ADCは、外部トリガーとシュミットトリガーを無効にして、必要なADCピンで連続変換モードで動作します。外部トリガーまたはシュミットトリガーオプションの使用方法について詳しくは、データシートを確認してください。このチュートリアルでは説明しません。
アナログ電圧を読み取り、LCDに表示するSTM8Sプログラム
main.c ファイルで使用されている完全なコードは、このページの下部にあります。必要なヘッダーファイルとソースファイルを追加すると、メインファイルを直接コンパイルできるようになります。メインファイルのコードの説明は次のとおりです。前のチュートリアルですでに説明したので、STM8SLCDプログラムについては説明しません。
コードの目的は、2つのピンからADC値を読み取り、それを電圧値に変換することです。また、ADC値と電圧値の両方をLCDに表示します。そこで、整数形式の変数を取り込んで文字に変換し、LCDに表示する LCD_PrintVar という関数を使用しました。以下に示すように、単純なモジュラス(%)および除算(/)演算子を使用して、変数から各桁を取得し、d1、d2、d3、およびd4などの変数を入力しました。次に、 LCD_Print_Char 関数を使用して、これらの文字をLCDに表示できます。
void LCD_Print_Var(int var){char d4、d3、d2、d1; d4 = var%10 + '0'; d3 =(var / 10)%10 + '0'; d2 =(var / 100)%10 + '0'; d1 =(var / 1000)+ '0'; Lcd_Print_Char(d1); Lcd_Print_Char(d2); Lcd_Print_Char(d3); Lcd_Print_Char(d4); }
次に、main関数の下で、4つの変数が宣言されています。それらのうちの2つはADC値(0から1024)を保存するために使用され、他の2つは実際の電圧値を取得するために使用されます。
unsigned int ADC_value_1 = 0; unsigned int ADC_value_2 = 0; int ADC_voltage_1 = 0; int ADC_volatile_2 = 0;
次に、アナログ電圧を読み取るためのGPIOピンとクロック構成を準備する必要があります。ここでは、それぞれPC4ピンとPD6ピンであるAIN2ピンとAIN6ピンからアナログ電圧を読み取ります。以下に示すように、これらのピンをフローティング状態で定義する必要があります。また、ADCのクロックペリフェラルを有効にします。
CLK_PeripheralClockConfig(CLK_PERIPHERAL_ADC、ENABLE); // ADCのペリフェラルクロックを有効にするGPIO_Init(GPIOC、GPIO_PIN_4、GPIO_MODE_IN_FL_IT); GPIO_Init(GPIOC、GPIO_PIN_4、GPIO_MODE_IN_FL_IT);
ピンの準備ができたので、アナログ電圧を読み取るために無限のwhileループに入る必要があります。ヘッダーファイルがあるので、以下の行を使用してピンAIN2とAIN6からアナログ電圧を簡単に読み取ることができます。
ADC_value_1 = ADC_Read(AIN2); ADC_value_2 = ADC_Read(AIN6);
次のステップは、このADC読み取り値(0〜1023)をアナログ電圧に変換することです。このようにして、ピンAIN2とAIN6に与えられた正確な電圧値を表示できます。アナログ電圧を計算する式は次の式で与えられます-
アナログ電圧= ADC読み取り値*(3300/1023)
STM8S103F3コントローラーの場合、10ビット分解能のADCがあるため、 1023(2 ^ 10)を使用しました 。また、私たちの開発では、3300である3.3Vでコントローラーに電力を供給しているため、上記の式で3300を1023で除算しました。約3300/1023で3.226が得られるため、プログラムでは、ADC電圧を使用して実際のADC電圧を測定するための次の行があります。
ADC_voltage_1 = ADC_value_1 *(3.226); //(3300/1023 = 〜3.226)ADC値1を0から3300mVに変換ADC_voltage_2 = ADC_value_2 *(3.226); // ADC値1を0〜3300mVに変換
コードの残りの部分は、これら4つの値をLCD画面に表示するためにのみ使用されます。また、500ミリ秒ごとにLCDが更新されるように、500ミリ秒の遅延があります。より高速な更新が必要な場合は、これをさらに減らすことができます。
STM8Sを使用して2つのポテンショメータからアナログ電圧を読み取る
コードをコンパイルして、開発ボードにアップロードします。コンパイルエラーが発生した場合は、前述のようにすべてのヘッダーファイルとソースファイルを追加したことを確認してください。コードがアップロードされると、「ADC on STM8S」という小さなウェルカムメッセージが表示され、次の画面が表示されます。
値D1とD2は、それぞれピンAin2とAIN6からのADC値を示します。右側には、同等の電圧値も表示されています。この値は、ピンAIN2とAIN6にそれぞれ現れる電圧と等しくなければなりません。マルチメータを使用して同じことを確認できます。また、ポテンショメータを変更して、電圧値もそれに応じて変化するかどうかを確認できます。
完全な作業は、以下のビデオでもご覧いただけます。チュートリアルを楽しんで、何か役立つことを学んだことを願っています。質問がある場合は、下のコメントセクションに残してください。フォーラムを使用して、ディスカッションを開始したり、その他の技術的な質問を投稿したりすることもできます。