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);