ADCの説明。 ADCプロトコルの説明

22.12.2023 モニター

STM32 マイクロコントローラーには、非常に優れたパフォーマンスと興味深い機能を備えた強力な ADC モジュールが搭載されています。

  • 18 入力チャンネル (外部 16 チャンネル、内部 2 チャンネル)
  • 解像度12ビット
  • さまざまな変換モード:
    1. 一度
    2. 継続的な
    3. トリガーによって
    4. タイマーで
  • 結果ビットの便利な位置合わせ
  • もちろん、DMA 用のあらゆる種類の割り込みと信号を生成します。
  • デジタル化速度 - プログラム可能なキャプチャと変換時間で最大 0.9 MSPS
  • 自動校正
  • 入力リストスキャンモード
  • アナログウォッチドッグ

このモジュールの必要性が頻繁に生じるのは、単に私たちの周囲の自然が離散的ではなく連続的であり、あらゆる種類のセンサーが通常アナログ信号を生成するためです。 これは特にオーディオに当てはまりますが、たとえばオシロスコープでも同じことができます。人気のある中国の USB オシロスコープ DSO Nano は、STM32F103 専用に作られています。

内部構造

測定電圧と基準電圧

デジタル化の原理は非常に単純です。入力電圧が基準電圧 V_REF- および V_REF+ と比較されます。

  • V_REF - グランドに接続する必要があります
  • V_REF+ オプション: プロセッサ電源 (フローティングでノイズが多いため、このオプションは不正確な測定にのみ適しています)、または外部基準電圧源 (REV) のいずれかに接続します。

ただし、これらの脚をグランドおよび電源に直接接続するようにプログラムで構成することは可能です。

入力電圧 V_In は V_REF- および V_REF+ を基準にして測定され、変換の結果は次の比率で出力レジスタに追加されます。

たとえば、ADC に 3.3 V から電力を供給する場合、1.2 V は 1490 に変換されます。

STM32 の ADC レジスタ

SR - ステータスレジスタ

ビット 0: AWD (アナログ ウォッチドッグ) フラグ。 入力信号が LTR または HTR レジスタの値を超えています。

1 ビット: EOC (変換終了) フラグ。 変換完了後、1に切り替わります。手動またはDRレジスタ読み出し時にリセットされます。

ビット 4: STRT (開始) フラグ。 変換の開始を知らせます。

CR1 - 最初の設定レジスタ

0..4 ビット: AWDCH (アナログ ウォッチドッグ チャネル) 値。 ウォッチドッグによる追跡のチャネル番号を設定します。

5 ビット: EOCIE (変換終了割り込みイネーブル)。 変換終了時の割り込みを有効にします。

6 ビット: AWDIE (アナログ ウォッチドッグ割り込みイネーブル)。 アナログウォッチドッグ割り込みを有効にします。

7ビット: ジョーシー。

8ビット:スキャン。 レジスタ SQR1、SQR2、SQR3 のリストに従ってチャネル スキャン モードを有効にします。

9 ビット: AWDSGL (アナログ ウォッチドッグ シングル)。 SCAN モードでトリガーするウォッチドッグのタイプを設定します: 1 つのチャネル (1) またはすべて (0)。

10ビット:JAUTO。

11 ビット: DISCEN (不連続モード有効)。 「不規則」動作モードを有効にします。ADC は外部トリガーによってオンになります。

12ビット:JDISCEN。

13..15 ビット: DISCNUM (不連続モードのチャネル数)。 「torn」モードで変換するチャネルの数。

16..19 ビット: DUALMOD (デュアル モード選択)。 2 つの ADC の共同動作のモードを設定します。

22ビット:ジョーデン。

23 ビット: AWDEN (アナログ ウォッチドッグ有効)。 アナログウォッチドッグを搭載。

CR2 - 第 2 設定レジスタ

0ビット:ADON(アナログ/デジタルコンバータのオン/オフ)。 ADC を有効にします。

1ビット:CONT(連続カバー)。 シングル (0) またはループ測定モード (1) を有効にします。

ビット 2: CAL (校正)。 1 に設定するとキャリブレーションが有効になります。 キャリブレーションが完了すると、0 にリセットされます。最初にレジスタをリセットする必要があります。

ビット 3: RSTCAL (キャリブレーションのリセット)。 キャリブレーションレジスタをリセットするには、同様に1に設定し、リセットを待ちます。

8ビット: DMA。 DMA を有効にします。

11 ビット: 整列。 データをケースの右端 (0) または左端 (1) に配置します。

12..14 ビット: JEXTSEL。

15ビット:JEXTRIG。

17..19 ビット: EXTSEL (外部イベント選択)。 トリガーするイベント番号を割り当てます (TIM1 CC1、TIM1 CC2、TIM1 CC3、TIM1 CC4、TIM3 TRGO、TIM4 CC4、EXTI_11、SWSTART)。

20 ビット: EXTTRIG (外部トリガー)。 外部トリガーによって変換をトリガーできるようにします。

21ビット: JSWSTART。

22 ビット: SWSTART (変換開始)。 変換を開始します。 終了後はリセットされます。

23 ビット: TSVREFE (温度センサーと V_REF が有効)。 温度センサーとIONを内蔵。

DR - 測定結果レジスタ

SMPR1、SMPR2 - 変換時間

各チャンネルの変換時間設定レジスタです。

HTR および LTR - ウォッチドッグ制限

アナログ ウォッチドッグの上限と下限は DR レジスタと同様です。

SQR1、SQR2、SQR3 - スキャンするチャンネルのリスト

SCAN モード (CR1 レジスタの SCAN ビット)

練習: ADC をオンにする

ADC を使用する最も単純なケースでは、中断や複雑なモードを使用せず、ADC を取得してサイクルで測定するだけです。

初期化

  1. ADCモジュールのクロッキングをオンにする
  2. モジュールパラメータの設定
  3. ADCモジュールをオンにします
  4. 入力の設定(ADCチャンネル番号)
  5. 校正を実施します

クリスタルレッグは設定されていない、つまりデフォルトの「アナログ入力」状態にあると仮定します。 これはまさに私たちが必要とする体制です。

一部の STM32 レッグのみが ADC 入力として機能でき、シンボル ANx (x = 0..15、この数字はチャネル番号) で指定されます。 STM32Cube プログラムでこれを推定すると便利です。

Void adc_init() ( RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); // ADC 設定 ADC_InitTypeDef ADC_InitStructure; ADC_StructInit(&ADC_InitStructure); ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; // 動作モード - シングル、独立 ADC_InitStruc ture.ADC_ScanConvMode = DISABLE; // チャンネルをスキャンしません、1 つのチャネルを測定するだけ ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; // 1 回限りの測定 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // 外部トリガーなし ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; // ビット アラインメントの結果 - 右に押します ADC_InitStructure.ADC_Nbr OfChannel = 1; // チャネル数 - 1 個 ADC_Init(ADC1, &ADC_InitStructure); ADC_Cmd(ADC1, ENABLE); // チャネル設定 ADC_ RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_55Cycles5); // ADC キャリブレーション ADC_ResetCalibration(ADC1); while ( ADC_GetResetCalibrationStatus(AD C1)); ADC_StartCalibration( ADC1); while (ADC_GetCalibrationStatus(ADC1)); )

この機能を実行すると、ADC1 が設定、校正され、8 番目のチャネルでの測定の準備が整います。

測定

測定は簡単です。

  1. 変革の開始
  2. デジタル化の終了を待っています (フラグ EOC = 変換終了を確認してください)
  3. DR レジスタからの結果の読み取り
uint16_t get_adc_value() ( ADC_SoftwareStartConvCmd(ADC1, ENABLE); while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); return ADC_GetConversionValue(ADC1); )

これらの関数の最も簡単な使用法は次のとおりです。

Void main() ( adc_init(); uint16_t 値 = 0; while(1) 値 = get_adc_value(); )

プログラムを実行し、ブレークポイントで停止し、デバッガで測定値を読み取るだけです。

投稿の閲覧数: 309

ADC は、Neo-Modus" Direct Connect (NMDC) に似た、クライアント/サーバー ネットワーク用のテキストベースのプロトコルです。目標は、クライアントにもサーバーにも負担をかけず、拡張可能なシンプルなプロトコルを作成することです。 NMDC プロトコルの不十分なソリューションの一部は修正されますが、すべてが修正されるわけではありません。

クライアントとクライアント、およびクライアントとサーバーという同じ対話が考慮されます。 このドキュメントは 2 つの部分に分かれています。 最初の部分ではプロトコルの構造について説明し、2 番目の部分ではこの構造を使用するためのプロトコル システムの特異性について説明します。 Advanced Direct Connect は最初のバージョンであり、徐々に改善される予定です。

プロトコルのアイデアのほとんどは DCTNG プロジェクト (Jan Vidar Krey の) から来ています。開発の主な参加者: Dustin Brody、Walter Doekes、Timmo Stange、Fredrik Ullner、Fredrik Stenberg など。Jon Hess は作成者として貢献しました。 NMDC プロトコル。

プロトコルの利点

  • SID およびプロトコル コマンドの名前は、大文字の 4 つのラテン文字で構成されます。 このプロトコルは、SI 言語での実装に非常に適しています。 SI 言語標準によれば、sizeof(char) == 1、つまり 4 文字が 4 バイトを占めるか、4 バイトの整数として表すことができます。 文字列を数値に変換し、その逆に変換すると、コマンドの操作が大幅に簡素化および最適化され、コマンドを共用体として保存できるようになります。

プロトコルの欠点

  • プロトコル区切り文字は非常に一般的な文字 (スペースとハイフン) であり、\s と \n に置き換える必要があります。 これらの文字はチャット メッセージで非常に一般的であるため、置換の数は常に多くなりますが、NMDC プロトコルの場合はそうではありませんでした。
  • NMDC プロトコルと比較して、ADC プロトコルには UserCommand の特定のメニューを削除する機能があります。 ただし、特定のメニューを削除するオプションはまだありません 特定の文脈で.

バージョン履歴

このドキュメントの後続のバージョン、および中間および古いバージョンは、次の場所から入手できます。 このバージョンは改訂のために提出されています:

バージョン 1.0.1、2008-05-02

  • 拡張機能は別のドキュメントで強調表示されます。
  • 仕様は、SourceForge 上の別のプロジェクトに分割されています。

バージョン 1.0、2007-12-01

  • 最初のリリース

プロトコル構造

  • すべてのプロトコル コマンドは 4 文字で始まります。 最初の文字はコマンドの送信方法を決定し、次の 3 文字は何を実行するかを示します。
  • パラメータはスペースで区切られ、各コマンドは改行 (コード 0x0a) で終わります。 エスケープされる要素は、「\s」 - スペース、「\n」 - 改行、「\\」 - バックスラッシュです。 このバージョンのプロトコルでは、他のすべてのエスケープ文字は将来の使用に備えて予約されています。 不明なエスケープ文字を含むコマンドは無視する必要があります。
  • 送信されるすべてのコマンドは、UTF-8 エンコード (C 正規化でエンコードされた Unicode) で送信される必要があります。
  • クライアントは不明なコマンドや無効なコマンドを無視する必要があります。 ハブは無効なコマンドを無視し、そのタイプ (プレフィックス) に応じて不明なコマンドを送信する必要があります。
  • クライアント アドレスは、IPv4 の場合はドット 10 進表記 (「x.x.x.x」)、IPv6 の場合は RFC (1884) 形式で指定する必要があります。 ハブ アドレスは、このプロトコルの詳細を示す「adc」プレフィックスを先頭に持つリンクによって定義する必要があります (「adc://server:port/」)。
  • 数値は浮動小数点標準に従って文字列として送信され、整数の小数部分の間の区切り文字としてドット「.」が使用されます。 。 整数は、小数部や指数加算を含まない数値です。 アプリケーションは、64 ビットの正の数と 64 ビットの浮動小数点数を操作できなければなりません。 否定の接頭辞は「-」記号です。

D(ダイレクトメッセージ)ハブは、指定された SID を持つユーザーにこのコマンドを送信する必要があります。

E (エコーメッセージ)ハブは、sid と my_sid を使用してコマンドをユーザーに送信する必要があります。

F(特集放送)ハブは、この特性をサポートする (+)/サポートしない (-) すべてのクライアントにこのコマンドを送信する必要があります。 特定の機能に対するクライアントのサポートは、クライアントによって送信された INF コマンドに含まれる SU フィールドから決定されます。

H (ハブメッセージ)クライアントは、ハブ専用のコマンドを送信するためにこのタイプを使用する必要があります。

私 (情報メッセージ)ハブは、別のクライアントによって送信されていないコマンドを送信するには、このタイプを使用する必要があります。

U (UDP メッセージ)クライアントは、直接 UDP 接続にのみこのコマンドを使用する必要があります。

ハッシュ関数

一部のコマンドはハッシュ関数を定義するために使用されます。 SUP コマンドを使用して新しい接続が確立されるたびに、ハッシュ関数が交換されます。 接続時に、クライアントは SUP コマンドのパラメータを通じていくつかのハッシュ関数をサーバーに渡します。 サーバーはそれらの 1 つを取得してクライアントに渡し、サーバーから送信される SUP コマンド内の他のハッシュ関数の前に配置します。 クライアントとハブには、プロトコルとファイルの識別に使用される同一のハッシュ関数が少なくとも 1 つ必要です。

クライアントの識別

各クライアントは、セッション識別子 - セッション ID (SID)、個人識別子 - プライベート ID (PID)、およびクライアント識別子 - クライアント ID (CID) の 3 つの異なる識別子によって識別されます。

ファイル

ファイル名は、ユーザーの共有内の相対 (架空の) ルートから数えられます。 「/」 - ディレクトリ区切り文字。 各ファイル名またはディレクトリ名は、大文字と小文字を区別せずに一意である必要があります。 スペースを含むすべての印刷可能な文字をファイル名に使用できます。文字「/」および「\」は文字「\」でエスケープされます。 クライアントは独自のファイル システムに対して名前フィルターを使用する必要があり、他のクライアントから受信したファイル名もこれらのルールに従う必要があります。 特別な名前「。」 「..」をディレクトリ名またはファイル名に含めることはできません。 これらの名前を含む結果のリスト ファイルは無視する必要があります。 すべてのディレクトリ名は「/」で終わる必要があります。

共有ファイルは名前のないルート "/" ("/dir/subdir/filename.ext") を基準にして識別されますが、追加ではルート名を追加できます。 たとえば、TIGR アドオンの「TTH/...」は、ルート名「TTH」を使用して、「Tiger Tree Hash」によってファイルを識別します。 これは、チェックサムによる識別子を持つ共有に含まれる名前のないルートからの名前には受け入れられません。

ルート ファイル名を指定しない場合、「files.xml」は、UTF-8 でエンコードされた XML 形式の完全なシート ファイルを指定します。 クライアントは、アドオンを使用してこのシート ファイルを圧縮することをお勧めします。

アドオンは、通常、名前の繰り返しを避けるために、ファイル名に独自の拡張子を追加できます。

特別なタイプの「list」は、ファイルのリストを表示するために使用されます。 部分的なファイル リストは通常​​のリストと同じ構造ですが、ディレクトリには部分的であることを示す Incomplete="1" 属性でタグ付けできます。 「/」文字で始めることができるのは、ルート ファイルのないディレクトリのみです。 このようなディレクトリの内容は、その後、要求元のクライアントに選択された深さで送信されます (これは、ユーザーが必要とするレベルのみを送信するために必要です)。 「FileListing」フィールドの「Base」属性によって、このファイルがどの特定のディレクトリに属する​​かが決まります。

特徴的な機能:

  • 高速変換時間: 最大 1.4 μs
  • サンプル/フリーズ機能搭載
  • コード損失なし
  • ユーザーによる調整は不要です
  • 単電源+5V
  • 外部クロックは不要
  • マイクロプロセッサへの容易な適応

使用分野:

  • デジタル信号処理
  • 高速データ収集システム
  • 電気通信
  • 高速サーボ制御回路
  • オーディオシステム

機能図:

ピンの位置:

説明:

ADC0820 IC は、ハーフフラッシュ技術を使用して 1.4 µs の変換時間を達成する、マイクロプロセッサ互換の高速 8 ビット アナログ - デジタル コンバータ (ADC) です。 このコンバータは、0 V ~ +5 V のアナログ入力信号範囲と +5 V の単電源を備えています。

最大 100 mV/µs のスルーレートを備えた内蔵サンプル/ホールド システムにより、外部サンプル/ホールド システムが不要になります。

この ADC は、外部マッチング ロジックを必要とせずにメモリ セルまたは I/O ポートとしてアクセスできるため、マイクロプロセッサと容易に互換性があります。 データ出力には 3 つの論理状態と固定レベルを持つバッファ ステージがあり、これにより IC をマイクロプロセッサ データ バスまたはシステム I/O データ ポートに直接接続できます。 ADC オーバーフロー出力は、IC をカスケード接続してより高い分解能レベルを達成する機能を提供します。

マキシムのADC0820は、ナショナルセミコンダクターのADC0820とピン互換性があり、優れた性能を提供します。 この IC は、20 ピン SO、DIP、CERDIP のタイプのパッケージで入手できます。

まず、ファームウェアの作成に使用したコンポーネントを理解する必要があります。 そして、使用したコンポーネントは 1 つだけです - PWM8。 PWMとはPulseWidth Modulatorの略で、パルス幅変調器という意味です。 このデバイスの本質は、マイクロコントローラーによって生成されるパルスの幅を変更できることです。 したがって、周波数に敏感でないデバイスの出力電圧を変更します。
例: マイコンの動作周波数は 1Hz (つまり、パルスの発生周期は 1s)、パルス幅は 0.5s、パルス電圧は 5V です。

この場合、1 秒あたりの平均出力電圧は 2.5 ボルトになります。 この値は、サブパルス領域を加算し、合計時間で割ることによって簡単に取得されます。 念のため、詳しく書いておきます。 1 秒の時間を取得したとします。図から、最初のパルスが 0.5 秒続いたことがわかります。 0.5s * 5V (パルス電圧) を乗算し、これを時間間隔で割ります。 0.5s*5V/1s = 2.5V。 3.33V の出力電圧が必要な場合は、パルス面積を 75% に増やす必要があります。 デューティサイクルという用語は文献によく出てきます。 したがって、デューティ サイクルはゼロ電位の持続時間に対するパルス持続時間の比率です。たとえば、最初のケースでは 50%、2 番目のケースでは 75% です。

理論はすでに十分であり、回路にPWMをインストールすることに問題はなかったと思います。 ただし、コンポーネント自体の設定については、より詳細に検討する価値があります。 これを行うために、変更されたパラメータが強調表示されたスクリーンショットを提供します。

クロックは PWM の動作周波数であり、デジタルまたはアナログ - デジタル ブロックは特定のクロック周波数で動作する必要があります。 これが、分周器とクロックフィールドが発明された理由です。 SysClk は、[グローバル リソース] タブで設定されたシステム周波数です。 興味深いのは、[Clock] ドロップダウン リストに Row_0_Input_0 などのフィールドがあることです。 これは、モジュールのクロック ジェネレーターがチップの外部にあってもよく、Row_0_Input_0 バスを介して同期されることを意味します。

有効 - このブロックの論理ユニット レベル。 通常、高 = 5V と低 = 3V の 2 つの規格が使用されます。 ちなみに、マイクロコントローラー自体も、High モードまたは Low モードのいずれかに切り替えることができます。

CompareOut - パルス幅変調器の出力。

実際にどこでも使用したことがないのに、なぜ上記の理論が与えられたのかという疑問が生じるかもしれません。 その答えは、パルス長と周期時間 (Period および PulseWidth フィールド) のデフォルト値 0 0 を使用したということです。このような値を使用すると、PWM 出力には論理値と等しい固体信号が含まれます。 PWM8_1_WritePeriod() 関数と PWM8_1_WritePulseWidth() 関数を使用して、マイクロコントローラー動作モードで周期時間とパルス幅の値をプログラム的に変更することもできます。

ADCまたはADC

ADC - アナログ - デジタル コンバーター (または ADC アナログ - デジタル コンバーター) は、アナログ信号をデジタル信号に変換できるデバイスです。 物理量 (圧力、速度、回転角、電圧、電流、光の強度) はすべてアナログであり、ADC の役割はそれらをデジタル信号に変換することです。 実際には、通常、デジタル信号に変換するために電圧が使用されます。
ADC の多くの特性のうち、次の 3 つの主要な特性に焦点を当てます。

  1. ビット深度は、ADC によって検出できるアナログ信号の最小単位であり、通常はビット単位で測定されます。
  2. 変換周波数 - SPS (1 秒あたりのサンプル) で測定された 1 秒あたりの測定数
  3. 動作範囲 - このコンバータが動作する値の範囲。

ADC はもはや PWM ほど単純なデバイスではないためです。 マイクロコントローラーのより理論的な側面と、ADC 自体のいくつかの機能を検討する必要があります。

マイコンの一般的な特性

PSoC チップを使用する際に知っておく必要がある概念と名称のリスト (ちなみに、以下のすべてが AVR マイクロコントローラーに当てはまるわけではありません)

データシートの説明や回路図では、Vcc、Vdd、Vss、AGND などの表記がよく出てきます。 そして、それらの違いが最も明らかでない場合もあります。 Vcc はマイクロコントローラーの電源電圧 (cc - コレクター間) で、Vdd と同じです。歴史的に同じ値に 2 つの指定があることが起こりました。 Vss はマイクロコントローラーの最小電位であり、この値が AGND と同等になることがよくあります。 AGNDの略語の「A」は、人工地盤か人工土壌かを示します。 回路上のこの電圧は通常バンドギャップと呼ばれます。 BandGrap は電圧リファレンスです。 基準電圧とは、MK 電源電圧、温度、その他の外部指標に関係なく一定に保たれることを意味します。 Vref は、検討中の個々のモジュールの基準電圧です。 私は長い間、Rail-to-Rail が何なのか理解できませんでした。 そして、「このモジュールはレールツーレールモードで動作します。」のような文脈でこのフレーズを見つけました。 したがって、レールツーレールとは、素子が Vcc から AGND までの電圧範囲全体で動作できることを意味します。

例 2: 電圧測定

タスク: デバッグボードに配線されたポテンショメータの電圧を測定し、その値を画面に表示します。

ここからがさらに面白くなります。 いつものように、デザイナーを起動してプロジェクトを作成します。 [ユーザー モジュール] -> [その他のデータ] -> [LCD] に移動し、左クリックしてマイクロコントローラーにドラッグします。 LCD は非常に便利でシンプルなモジュールであり、その上、デジタル ブロック上のスペースを占有しません。 これは、「ワークスペース エクスプローラー」タブで確認できます。 設定からは、LCDPort = Port_2 を選択するだけです。 次に、main.c ファイルに移動します。このファイルは、ワークスペース エクスプローラー -> [プロジェクト名] -> ソース ファイル -> main.c にあることに注意してください。 そして、次のコードを main() 関数に追加します。

LCD_Start(); LCD_位置(0,0); LCD_PrCString("測定された電圧");

コードをコンパイルし、マイクロコントローラーをフラッシュします。 すべてが正しく行われた場合、上に書かれた行が画面に表示されます。 彼らは画面を制御するこれ以上簡単な方法を思いつきませんでした。 そしてそれは喜ばしいことです。 あとはADC次第です。 [User Modules] -> [Legacy] -> [ADCINC12] を選択し、コントローラに投入します。 「なぜ、ADCINC と ADCINC12 を選択し、さらに Legacy フォルダから選択しなかったのですか? その理由は、モジュールの初期化が複雑であることにあります。ADCINC はより複雑で柔軟なモジュールであるため、より注意が必要です」 「Legacy」フォルダーには、柔軟性に劣りますが、実装が容易な、既に格納されているモジュールが保存されています。次に、何も考えずに、そのフォルダーに移動し、アンプを PGA (Programmable Gain Amplifier) に投入します。プログラマブルオペアンプ 増幅のためではなく、回路内の電流の大きさが測定精度に影響を与えないように、入力インピーダンスを高めるために必要です。
スクリーンショットのように PWM 設定を設定します。

  1. ゲイン - ゲイン係数。
  2. 入力 - デバイス入力。
  3. リファレンス - 基準電圧。

ADC 設定を次のように設定します。

  1. TMR クロック - タイマーのクロック周波数。
  2. 入力 - デバイス入力 (PGA に接続)。
  3. CNT クロック - カウンタ周波数。

通常の操作に最も必要なのは、Ref Mux と呼ばれるグローバル リソースです。 Ref Mux は、アナログ ブロックの動作電圧範囲です。 値 (Vdd/2)+/-(Vdd/2) を設定すると、0 ~ 5V の完全な電圧差が得られます。 しかし、これには決定的な欠点が 1 つあります。 電源電圧を基準電圧としているので。 Vdd 電圧が変動すると、結果の精度に影響します。 この場合、BandGap が役に立ちます。 しかし、今は気にせず、(Vdd/2)+/-(Vdd/2) を設定しましょう。
再確認のために、アナログ ブロックの切り替え結果のスクリーンショットをお送りします。

main.c に移動し、次のコードを main() 関数に追加します。

PGA_Start(PGA_HIGHPOWER); //PGA を開始 ADCINC12_Start(ADCINC12_HIGHPOWER); //ADC を開始 ADCINC12_GetSamples(0); //ADC を連続動作に設定 M8C_EnableGInt ; // グローバル割り込みを有効にするには、この行のコメントを解除します while(1) // メイン ファームウェア ループ ( if (ADCINC12_fIsDataAvailable() != 0) // ADC 内のデータをチェックします ( result = ADCINC12_iGetData() + 2048; ADCINC12_ClearFlag(); LCD_Position( 1,0); //出力の位置を設定 LCD_PrHexInt(result); //結果を 16 進数で出力 ) )

データを符号なしの同等の変数に変換するために、iGetData() 関数のデータに 2048 が追加されます (Google の「C++ 符号付き変数と符号なし変数」を参照してください)。

次のようにポテンショメータをボードに接続します。

マイクロコントローラーをフラッシュし、作業の結果を評価します。

あとはヘクスを電圧に変換し、テスターでデータの正しさをチェックするだけです。 私たちはこの目標を純粋に実験的に達成します。 状況をわかりやすくして、ゼロ電位を ADC 出力の 0x0000 値として考えてみましょう。 次に、すでに作成したプログラムを実行し、ポテンショメータを最大値に設定して、結果の値を確認します。 たとえば、0x0FEC が返されました。 次に、テスターを使用して、ポテンショメータの実際の電圧を測定します。 4.78Vが出ました。 次に、4.78/0x0FEC を除算し (微積分システムに問題がある人には、ポンプアップすることをお勧めします)、量子化ステップ、つまり 1 つの ADC 出力値が対応する電圧単位を取得します。 0.0011727183513248 を取得しました。これが番号です。 ここでは、ADC からの結果にこの値を単純に乗算し、画面に表示します。 これを行うには、グローバル可視性フィールドに変数を追加します (これは main() 関数の外側にあるものすべてです)。