ADCアナログからデジタルへの変換
1. ADCの概要
ADC(アナログ-デジタル変換器)は、アナログ信号をデジタル信号に変換することができるアナログ-デジタル変換器で、変換原理により、逐次近似、二重積分、電圧-周波数変換の3つのタイプに主に分類されます。STM32F1 ADCは、12ビットの逐次比較型アナログデジタルコンバーターで、18チャネルを備え、16の外部信号源と2の内部信号源を測定できます。各チャネルのA / D変換は、シングル、連続、スキャン、または不連続モードで実行できます。ADCの結果は、左揃えまたは右揃えで16ビットのストレージレジスタに格納できます。アナログウォッチドッグ機能により、アプリケーションは、入力電圧がユーザー定義の高/低しきい値を超えているかどうかを検出できます。ADCクロックは14Mを超えてはなりません。14Mを超えると、結果の精度が低下します。ADC構造のブロック図とADCピンの説明は次のとおりです。
- 電圧入力ピンと入力チャネルピンは上の表に示されています。メインADC1には2つの内部チャネルがあり、チャネル16はチップ内部の温度センサーに接続され、チャネル17は内部基準電圧V REFINTに接続されています。ADC2/ ADC3のチャネル16 / 17は内部V SSに接続されています
- ADC変換は、通常のチャネルグループ(16チャネル)と注入チャネルグループ(4チャネル)の2つのチャネルグループに分けられます。通常のチャネルは通常の実行プログラムと同等であり、注入チャネルは割り込みと同等です。
- 入力チャンネルと変換シーケンスを選択したら、ADCを有効にする必要があります。ADC変換を直接オンにするか、外部イベントを選択して変換をトリガーできます
- ADCの最大動作周波数は14Mで、分配係数は通常6に設定されています。つまり、ADCの入力クロックADC_CLK = 12M
- ADCは、入力電圧のサンプリングを完了するためにいくつかのADC_CLKサイクルを必要とします。最小サンプリングサイクルは1.5です(つまり、最速のサンプリングを実現したい場合、サンプリングサイクルは1.5サイクルに設定する必要があります(つまり、1 / ADC_CLKの1.5倍)。
- ADCの合計変換時間T conv =サンプリング時間+ 12.5サイクル;上記の設定によると、T conv =(1.5 + 12.5)サイクル= 14 *(1 / 12M)= 1.17us、つまり最短の変換時間は1.17usです
- ADC変換後のデータは、さまざまな変換グループに応じてさまざまなデータレジスタ(16ビット)に配置されます.ADCは12ビットの変換精度を持ち、データレジスタは16ビットであるため、データを格納するときに左揃えと右揃えになります。分
- ルールグループには16チャネルが含まれていますが、データに対応するレジスタは1つしかありません。マルチチャネル変換を使用する場合は、チャネル変換が完了した後にデータを削除するか、DMAモードをオンにしてデータをメモリに転送する必要があります。そうしないと、データが発生しますカバー
- 対応する割り込みフラグビットを有効にすると、ADCは対応する割り込みを3つの方法で生成できます:ルール変換および注入変換終了、アナログウォッチドッグイベント、DMA要求
2.ハードウェア設計
この実験では、ADC1チャネル1を介して外部電圧値がサンプリングされ、サンプリングされたAD値と変換された電圧値がUSART1シリアルポートを介して出力されます。同時に、D1インジケーターが点滅し、システムが正常に動作していることを示します
- D1インジケーター
- ADC1_INT1
- USART1シリアルポート
- ポテンショメータ
3.ソフトウェア設計
3.1 STM32CubeMX設定
- RCCは外部HSEを設定し、クロックは72Mに設定され、ADCプリスケーラー係数は6に設定されます。ADC_CLKは12MHzです
- PC0はGPIOプッシュプル出力モード、プルアップ、高速に設定され、デフォルトの出力レベルは高
- USART1は非同期通信モードとして選択され、ボーレートは115200ビット/秒に設定され、送信データ長は8ビット、パリティなし、1ストップビットです。
- ADC1チャネル1をアクティブにし、右アライメントを設定し、スキャン、連続モードと不連続モードをオフにし、定期的な変換を有効にし、ソフトウェアトリガーを設定し、サンプリング時間を1.5サイクルに設定します。
- プロジェクト名を入力し、プロジェクトパス(中国語以外)を選択し、MDK-ARM V5を選択します。IPごとに「.c / .h」ファイルのペアとして生成されたペリフェラルの初期化を確認します。「コードを生成」をクリックしてプロジェクトコードを生成します
3.2 MDK-ARMプログラミング
- ADC初期化関数は、adc.cファイルで確認できます。
void MX_ADC1_Init(void){
ADC_ChannelConfTypeDef sConfig = {
0};
hadc1.Instance = ADC1;
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
hadc1.Init.ContinuousConvMode = DISABLE;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = 1;
if (HAL_ADC_Init(&hadc1) != HAL_OK){
Error_Handler();
}
/** Configure Regular Channel*/
sConfig.Channel = ADC_CHANNEL_1;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK){
Error_Handler();
}
}
void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle){
GPIO_InitTypeDef GPIO_InitStruct = {
0};
if(adcHandle->Instance==ADC1){
/* ADC1 clock enable */
__HAL_RCC_ADC1_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
}
- 次のテストプログラムをメイン関数のwhileループに追加します。ADC1の変換精度は12ビットであるため、電圧分解能は3.3 /(2 12)= 3.3 / 4096です。
while (1){
HAL_ADC_Start(&hadc1); //启动ADC转换
HAL_ADC_PollForConversion(&hadc1,10); //等待转换完成,10ms表示超时时间
AD_Value = HAL_ADC_GetValue(&hadc1); //读取ADC转换数据(12位数据)
printf("ADC1_IN1 ADC value: %d\r\n",AD_Value);
Vol_Value = AD_Value*(3.3/4096); //AD值乘以分辨率即为电压值
printf("ADC1_IN1 VOL value: %.2fV\r\n",Vol_Value);
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);
HAL_Delay(1000);
}
4.ダウンロードの確認
コンパイルが完了したら、それを開発ボードにダウンロードします。システムの実行中にD1インジケーターライトが点滅し続け、ポテンショメーターが調整されると、取得されたAD変換値と電圧値が変化し、シリアルポートから出力されます。