Project_OKI’s diary

エンジニアの勉強ブログ

STM32マイコン_11(AD変換値の取得)

 

STM32:AD変換値の取得

1.本日の内容

(1) STM32マイコン(nucleo f401RE)を使用して、AD変換値を取得する。
 (2) 取得した値を、TrueStdioのデバッガで確認する。

・目次

 

2.内容

​​(1) やる内容の詳細​

  ・STM32マイコン(nucleo f401RE)を使用して、AD変換を行う。
    ・AD変換をループし、AD変換値を取得し、変数に代入する。
  ・TrueStdioで、取得した値を確認する。

(2) 使用部品​
個数 部品名 型番
1 USBケーブル ​​USBミニBタイプ
1 mbed(マイコンボード) ​​nucleo f401RE
1 ブレッドボード・ジャンパーワイヤ(オス-オス) BBJ-65

 

(3) STM32CubeMXの設定、プログラムを出力

  (a)使用ピンを設定
   ・PA0:ADC1_IN0
   
  (b)使用するピンの名前を変更 
   ・今回は特に何もしない。

  (c)プログラムの出力

   ・Project Maagerを選択
   ・Project Nameにプログラムの名前を入力:ADC1   
    ※スペース、空白文字、日本語を含めるとエラーになる場合があるので、使用しない。

   ・Project Location:プロジェクトを保存する場所
   ・Application Structure:Advanced (出力するフォルダの構成を選択)
   ・Toolchain/IDE:TrueSTUDIO(今回は、AtoricTrueStdioを使用するため)

  (d)GENERATE CODEで、コードを出力
  (e)Open pROJECTをクリックすると、AtricTrueStdioが自動的に起動される。

 

(4) AtricTrueStdioでプログラム作成
  (a) AtricTrueStdioから開く場合(上記(e)をした場合は不要)
    ・AtricTrueStdioを起動
    ・インポート元のディレクトリをクリック
    ・CubeMXで作成した場所を指定
    ・フォルダーにADC1(作成したプロジェクトの名前)が表示
    ・チェックされているのを確認して、終了をクリック 

 (b) プログラムの書き込み
   ・トンカチマークをクリックして、ビルドする。
   ・エラーが出ないことを確認する。
   ・下記プログラムを記載する。

 

/* USER CODE BEGIN PV */
//ADCの値格納用変数定義
__IO uint32_t analogValue;

/* USER CODE END PV */

  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	  //ADCスタート
	  HAL_ADC_Start(&hadc1);
	  //AD変換が正しく処理終わり、1000ms以内に値が入るか
	  if(HAL_ADC_PollForConversion(&hadc1,1000)==HAL_OK){
		  //AD変換の値をanalogValueに格納
		  analogValue = HAL_ADC_GetValue(&hadc1);
	  }
	  //ADC終了
	  HAL_ADC_Stop(&hadc1);
  }
  /* USER CODE END 3 */
 
 
(5) プログラムの説明

 

 (a)__IO uint32_t analogValue;
   ・AD変換の値を格納するための変数を宣言
   ・analogValueに値が格納される。
   ・__IO:volatile変数 
       →通常時と割り込み時の両方で使用する変数を宣言する場合に、使用する。
        →ここでは、簡単に説明する。
       これを付けないと、変数が最適化され、割り込み時に数値が反映しなくなる可能性がある。
   参考:
   ・コード最適化
 
 (b) HAL_ADC_Start(&hadc1);
  ・ポーリング時の、AD変換を開始させるのに使用する。
  ・今回は、ADC1_IN0を使用しているため、hadc1を指定している。
 
  ポーリング:イベントが発生しているかを定期的にチェックする。
        今回で言えば、whileでループし、AD変換するかどうかを常にチェックしている。
 
 (c)HAL_ADC_PollForConversion(&hadc1,1000)
  ・ADCの変換完了まで、待ち続ける処理。
  ・1000:タイムアウト時間[ms]
   この時間を過ぎて、AD変換されないと、AD変換が失敗したとみなされる。
 
 (d)if(HAL_ADC_PollForConversion(&hadc1,1000)==HAL_OK)
  ・AD変換が完了したかどうかを確認する。
  ・HAL_OKというのが、処理完了ということ。
  ・今回は、特にエラー処理は入れていないが、
   普通はelseで、失敗した時のエラー処理を入れる。
 
 (e)analogValue = HAL_ADC_GetValue(&hadc1);
  ・AD変換した値を取得する処理
  ・analogValueの変数に、AD変換した値を格納している。
 
 (f)HAL_ADC_Stop(&hadc1);
  ・AD変換を終了する。
  ・今回は、ADC1_IN0を使用しているため、hadc1を指定している。
 
  これらのことは、下記のような形で、​UM1725データシートに記載してある。
  割り込みで使用する場合は、HAL_ADC_Start_ITになる。
 

 

ここに、今回のことが書いてある。

 

 

ADC_start

 

  今回は、CUbeMxの設定は説明していない。
  CubeMXの設定については別途書く予定。
 
(6) デバックで、AD変換の値を確認

 (a) 歯車マークで、プログラムを実行する。

 (b)再生マークを押し、プログラムを実行

 (c)ソースを選択し、analogValue を選択、右クリックする。

 (d) Add Watch Expression・・・をクリックする。

 (e) Expression to watchで、「analogValue」が入力されているので、

  そのままOKを押す。

 (f) 式というタブが出てきて、そこに、analogValueの値が表示されるようになる。

 (g)このままだと、値は分からないので、breakする必要がある。

  (breakポイントを仕掛けて、そこでプログラムが止まるようにする。)

 (h)ソースに戻り、analogValueの一個したの}の所の左側をダブルクリックする。

 (i)ブレークポイントが設定される。

 (j)自動的に、ブレークポイントが処理されるときに、プログラムが止まる。

 (k)式のValueの部分に、その時のanalogValueの値が入力される。

下記動画の7分頃を参考に


www.youtube.com

 

 

3.関連記事

組み込みC言語