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で読み出せないのだと思われる)
↓↓
割り込みなどを使った方が良いと考えられる。
今回行う方法は、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等)、返り値にそのチャンネルの値を持ちます。
→ StartしてからGetValueまでの間にDelayを入れるとうまくいく (おそらくStartの後AD変換が行われ、その後出ないと正確な値がGetValueで読み出せないのだと思われる)
↓↓
割り込みなどを使った方が良いと考えられる。
0 件のコメント:
コメントを投稿