2016年12月23日金曜日

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

F401RE(STM32系マイコン)で、SW4STM32とCubeMXを使って複数のADCをHALライブラリを用いて使おうとしたとき、情報があまりなかったので、その方法を残しておきます。

今回行う方法は、ADCを使って値を読み取るたびに、使うADCのチャンネルをセットしなおす方法です。
※HAL_ADCEx_MultiMode系の関数を使ったほうが速いかもしれないが、HALライブラリはあまり詳しいわけではなく、使い方がよく分からなかったので試すことができなかった。

まず、CubeMXでADCで使うピンを設定したら、プロジェクトをジェネレートします。

次にプログラムを行っていきます。
プログラムは使いやすいように新しい関数を作りますが、mainファイル内に自動生成された MX_ADC1_Init()関数を利用します。この関数でチャンネルを決めているのは "sConfig.Channel=ADC_CHANNEL_0;"となっている部分なので、ここを変えてチャンネルを選んで値を取得できるようにします。
[追記・訂正]以前のものだと正常に動作しない場合があったためDelayを入れ修正しました
//---------------------------
uint16_t ADCsGetValue(uint32_t ch)
{
  HAL_ADC_Stop(&hadc1);
 //------ ADC Channel Select
  ADC_ChannelConfTypeDef sConfig;
  sConfig.Channel = ch;
  sConfig.Rank = 1;
  sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;
  HAL_ADC_ConfigChannel(&hadc1, &sConfig);
 //------ ADC Read
  HAL_ADC_Start(&hadc1);
  HAL_Delay(1);
  return HAL_ADC_GetValue(&hadc1);
}
//---------------------------
今回作った関数は引数にチャンネル(ADC_CHANNEL_0等)、返り値にそのチャンネルの値を持ちます。
また、値を読んだ直後にHAL_ADC_Stopを置くと値を取得できませんでした。原因は分かりませんが、HAL_ADC_Stopまでに時間があるほうがいいようです。(DelayをStop前に置くとうまくいく)
→ StartしてからGetValueまでの間にDelayを入れるとうまくいく (おそらくStartの後AD変換が行われ、その後出ないと正確な値がGetValueで読み出せないのだと思われる)
 ↓↓
割り込みなどを使った方が良いと考えられる。





0 件のコメント:

コメントを投稿