[STM32] HAL ライブラリ - ADC の高速使用

1. ADC の概要

1.1 モード

ADC アナログ - デジタル コンバータは、アナログ量をデジタル量に変換します。STM32F103 を例に取ると、3 つの 12 ビット ADC が含まれており、0 ~ 3.3V の範囲の電圧は 0 ~ 4095 で表され、 2 つは線形に対応します。つまり、
実際の電圧 = (読み取り ADC 値/4096) * 3.3
STM32F シリーズ ADC には、16 個の外部チャネルと 2 個の内部チャネルを含む最大 18 チャネルがあり、各チャネルの AD はシングル モード、連続モード、スキャンで使用できます。モード、断続モード実行。
シングルモード: 1 回の変換だけで変換を停止します。
連続モード: 1 回の変換が完了した後、次の変換を開始します。
スキャンモード: すべての有効なチャンネルを順番に変換します
。 断続モード: すべてのチャンネルの変換を一度に完了することはできません。

1.2 ADC基準電圧

64 以下のパッケージの場合、チップ内部の ADC 電源 VDDA に接続される VREF+ ピンはありません。100 ピンおよび 144 ピンのパッケージの場合、VREF+ を 3.3V に接続するなど、VREF を設定する必要があります。もちろん、より高い精度が必要な場合は、独立した外部電圧を VREF+ ピンに接続することもできますが、注意する必要があります。電圧範囲は 2.4V ~ VDDA です。

1.3 コンバージョン率

ADC サンプリング時間 = (サンプリング サイクル + 12.5 サイクル) 1/ADC クロック周波数*
たとえば、ADC クロックが 12MHz に設定され、サンプリング時間が 1.5 サイクルの場合、サンプリング時間は次のようになります: (1.5+12.5)*1/ 12 = 1.167us

2.ポーリングモードを使用する

2.1 シングルチャンネル

1. システム クロックを 72M に、ADC クロックを 12M に設定します
ここに画像の説明を挿入
。 2. ADC の設定

ここに画像の説明を挿入
3. プロジェクトを生成し、コードを追加します

/* USER CODE BEGIN PD */
//首先声明一个全局变量用于存放AD结果
    u32 adc_value;
/* USER CODE END PD */
  //初始化后加入ADC校准函数,进行一次校准
	HAL_ADCEx_Calibration_Start(&hadc1);
	HAL_Delay(200);
//主循环中加入下列语句可以不断得到AD值
	HAL_ADC_Start(&hadc1);
    HAL_ADC_PollForConversion(&hadc1,50);
	adc_value = HAL_ADC_GetValue(&hadc1);

図に示すように、ADC 変換結果は次のとおりです。
ここに画像の説明を挿入

2.2 マルチチャンネル

1. 2.1 でシステム設定を実行します
2. ADC パラメータを設定します (デュアルチャネルを例にします)
ここに画像の説明を挿入

3. コードを追加します

//声明一个全局变量用于存放ADC转换数据
u32 ad_value[2];

//主函数中使用下列代码得到两个通道的单次转换结果
	int i;
	for(i=0;i<2;i++)
	{
    
    
		HAL_ADC_Start(&hadc1);
		HAL_ADC_PollForConversion(&hadc1,50);
		ad_value[i]=HAL_ADC_GetValue(&hadc1);
	}

3. DMA の使用

1. ADC 構成
ここに画像の説明を挿入
2. DMA チャネルの追加
ここに画像の説明を挿入
3. コードの追加

    //DMA双通道,ad_value为定义的数据缓存数组,2为通道数(当设置DMA数据长度为word时)
	HAL_ADC_Start_DMA(&hadc1,ad_value,2);
	
	//UI显示(只为显示数据),使用开源GUI--ugui,OLED
	UG_FontSelect(&FONT_12X16);
	UG_SetBackcolor(C_WHITE);
	UG_SetForecolor(C_BLACK);
	UG_PutString(0,0,"ADCIN1");
	UG_PutString(0,30,"ADCIN2");
	UG_PutNum(80,0,ad_value[0],4,C_WHITE,C_BLACK);
    UG_PutNum(80,30,ad_value[1],4,C_WHITE,C_BLACK);
		

4. 中断を使用する

5. データを最適化する

おすすめ

転載: blog.csdn.net/qq_39587650/article/details/119521784