stm32 (ADC デジタル - アナログ変換)

ADCの紹介

ADCとは何ですか?正式名称: Analog-to-Digital Converter、アナログ/デジタルコンバーターを指します。

 ADCの性能指標

  • レンジ:測定可能な電圧範囲
  • 分解能: ADC が識別できる最小アナログ量。通常は、出力 2 進数の桁数 (8、10、12、16 ビットなど) で表されます。一般に、桁数が多いほど分解能は高くなります。つまり、解像度が高いほど、変換時間は長くなります
  • 変換時間:変換開始から安定したデジタル出力が得られるまでの時間を変換時間といいます。

ADC特性

  • 変換速度は 12 ビット精度で 1MHZ まで可能
  • 電源電圧: V SSA: 0V、V DDA: 2.4V~3.6V
  • ADC 入力範囲: VREF- ≤ VIN ≤ VREF+
  • サンプリング時間は設定可能で、サンプリング時間が長いほど変換結果の精度は高くなりますが、変換速度は遅くなります。
  • ADC の結果は、16 ビット データ レジスタに左詰めまたは右詰めで保存できます。

ADCチャンネル

合計 2 つの ADC (ADC1、ADC2) があり、各 ADC には 18 個の変換チャネルがあります: 16 個の外部チャネル、2 個の内部チャネル (温度センサー、内部基準電圧)。

 16 個の外部チャネルは、変換時に通常チャネルと注入チャネルに分割され、最大 16 個の通常チャネルと最大 4 個の注入チャネルがあります。

ルール グループ: 通常どおりに列に並ぶ人々。

注射対象者:特権階級(軍人、妊婦) 

ADC変換シーケンス

各 ADC にはデータ レジスタが 1 つだけあり、16 チャネルがこのレジスタを共有するため、通常の変換チャネルの変換シーケンスを指定する必要があります。

通常チャネルの変換シーケンスは、3 つのレジスタによって制御されます。SQR1、SQR2、SQR3 はすべて 32 ビット レジスタです< /a >。 SQR レジスタは、変換チャネルの数と変換シーケンスを制御します。対応するチャネルが対応するレジスタ ビット SQx に書き込まれている限り、このチャネルは x 番目の変換です。

通常のチャネル変換シーケンスの制御と同じインジェクション チャネルの変換はインジェクション レジスタによって制御されます。 1 つの a>JSQR レジスタ のみを制御する場合、制御関係は次のとおりです。 

 注入シーケンスの変換シーケンスは、JSQx[4:0] (x=4-JL[1:0]) から始まります。 JL=4 の場合のみ、インジェクションチャネルの変換シーケンスは JSQ1、JSQ2、JSQ3、JSQ4 の順に実行されます。

ADCトリガモード

1. 制御レジスタ ADC-CR2 の ADON ビットに 1 を書き込むことで変換を開始し、0 を書き込むと変換を停止します。

2. 変換は外部イベント (タイマーなど) を通じて実行することもできます。

ADC変換時間

ADC は APB2 バス (PCLK2) に搭載されており、ADC クロック (ADCCLK) は分周器を通じて最大 14 MHz で取得されます。

変換時間 = サンプリング時間 + 12.5 サイクル

12.5 サイクル固定です。通常は PCLK2=72M に設定します。ADC プリスケーラで分周できる最大クロックは 12M までです。サンプリング周期は 1.5 サイクルに設定します。最短変換時間は 1.17us と計算されます。

ADC変換モード

スキャンモード

  • スキャン モードをオフにする: ADC_SQRx または ADC_JSQR によって選択された最初のチャネルのみを変換します
  • スキャン モードをオンにする: ADC_SQRx または ADC_JSQR によって選択されたすべてのチャネルをスキャンします

単一変換/連続変換

  • 単一変換: 1 回だけ変換します
  • 連続変換: 1 つの変換後、すぐに次の変換に進みます。

実験: ADC を使用して煙センサーの値を読み取る

CubeMX 構成

コード 

while (1)
{
HAL_ADC_Start(&hadc1); //启动ADC单次转换
HAL_ADC_PollForConversion(&hadc1, 50); //等待ADC转换完成
smoke_value = HAL_ADC_GetValue(&hadc1); //读取ADC转换数据
printf("smoke_value = %f\r\n", 3.3/4096 * smoke_value);
//printf("smoke_value = %d \r\n", smoke_value);
HAL_Delay(500);
}

おすすめ

転載: blog.csdn.net/m0_70987863/article/details/131676666