2016年12月23日金曜日

[STM32マイコン]SW4STM32を使う(ADコンバータ)

今回は、F401REでアナログ電圧を読み(ADCを使う)、それをシリアル通信でPCに表示するプログラムをSW4STM32とCubeMXを使って作成します。
※ライブラリはHALを使用

○CubeMXでADコンバータ(ADC)を使う設定にする
 前回のシリアル通信をするものに、ADCを使う設置を追加します。
 前回同様にCubeMXを起動し、LoadProjectで前回までのプロジェクトを開く。
 次に、"Pinout"タブでADCピンを割り当てる。今回は"ADC1_IN0" (F401REのPA0端子) を使う。
 左の "Configuration" >> "Peripherals" >> "ADC1" のIN0にチェックをいれる。
最後に、プロジェクトをジェネレートしなおす。

○SW4STM32の準備
SW4STM32を再起動するか、プロジェクトをリフレッシュして、プロジェクトを読み込みなおす。
エラーが出たときは、プロジェクトのCleanとBuildでエラーを消す。それでもエラーが消えないときは、プロジェクトをSW4STM32上から削除し、インポートしなおす。

○プログラミング
main.c内のmain()関数で、whileループのところに下記のように書き加えます。
//---------------------------------------------
  char str[32]={0};
  sprintf(str,"\nSTART\n");
  HAL_UART_Transmit( &huart2, str, strlen(str), 0xFFFF );

  while(1){
      HAL_ADC_Start(&hadc1);
      int val=HAL_ADC_GetValue(&hadc1);
      sprintf(str,"ADC_IN0 : %4d (%4d[mV]) \r", val, val*3300/0xfff);
      HAL_UART_Transmit( &huart2, str, strlen(str), 0xFFFF );

      HAL_ADC_Stop(&hadc1);
      HAL_Delay(1000);
  }

//----------------------------------------------
・"HAL_ADC_GetValue"で得られる値は0~4095(0xfff)で、F401REは、3.3[V] (3300[mV]) で動作しているので、"val*3300/0xfff"とすれば、[mV]で値を読み取れる。
 ※ 3.3[V] で動作しているので5[V]端子にADCの端子をつながないように注意が必要。
・ "HAL_ADC_GetValue" の前に "HAL_ADC_Start"、後に "HAL_ADC_Stop" を行わないと連続で値を読めない。
 ※ "HAL_ADC_Start"を行わないと値が読めない。

最後は、実行して、TeraTerm等で表示し、ADCが使えていることが確認できればOKです。
※ 端子に何も繋がないときは値が揺れます。

0 件のコメント:

コメントを投稿