【mbed】ADC 端子を変更・追加できる?
stm32F401RE は、ADCを1個 16ch 持っている。(データシートを参照のこと。リファレンスマニュアル、ユーザマニュアルは複数のMPUについて書いてあり、ペリフェラルの個数についてはデータシートに記載されている)
GPIOのモードレジスタで「アナログ入力」に設定すると、端子をアナログ入力として使えるようになるはず。
だが、これを mbed 流に行う方法がわからない。。。。
今回の直接の目的は、zumo の光センサアレイを使うこと。
A0,A2,A3 はアナログ入力ピンなので、mbed で普通に使える。しかし、 4,5,11 はデジタルIO用なので ADC につながらない。そこで、ピンをリマップする方法が紹介されている。
パターンをカットし、アナログ入力端子に接続すればよい。
とりあえずはこれで解決できるが、できれば mbed でデジタルIOピンをアナログ入力に設定する方法を知りたい。なんせ、16chもあるのだから。
mbed で ADC
ADCのチャネル指定にピン番号を指定するみたい。
今、PortB_4, PortB_5 を指定したいが、ここで必要なピン番号はICのパッケージでの端子番号みたい。なので、回路図から対応を探した。
PB4:No56、PB5:No57.
。。。違った。試したところ、
AnalogIn analog_value_Left(D4);
AnalogIn analog_value_Right(D5);
といった指定で、コンパイルを通った。正しく動くかどうか、可変抵抗で確認したい。
GPIOのビットとADCのチャネル
GPIOはそれぞれのポートに対するMODERで、ビット単位でアナログモードを設定できる。
一方、ADCは16chある。その対応をどこかで設定するはずなのだが、該当箇所が見つからない。なんとなく、ポートAとポートB, 16bit あるが、それぞれ下位 8bit ずつアナログに設定すれば、
- PortA:ch0-7
- PortB:ch8-ch15
となってくれるのでは、と期待しているが。
CubeMX とAlternateFunction
CubeMX を使うと、ピンアサインの設定が楽になるらしいので、試してみた。デフォルトの複数機能から選択することは簡単にできた。
だが、Zumo Shield の光センサアレイは、6本のADCが必要。4本は上記の機能で選択できた。が、残り2本、PB4,PB5をADCに割り当てることはできなかった。
ARMならば、AF機能を使えばできたはず。具体的な方法を調べる。
発見した!
RM0368
Reference manual
STM32F401xB/C and STM32F401xD/E
advanced ARM®-based 32-bit MCUs
8.3 GPIO functional description
8.3.2 I/O pin multiplexer and mapping
Peripheral alternate function
For the ADC, configure the desired I/O as analog in the GPIOx_MODER register.
GPIOではなくADCとして端子を使いたい場合、GPIO port mode register を設定する。
今、PortAとPortBをGPIOではなくADCにしたいので、MODER0[1:0]MODER1[1:0] を11:Analog mode にする。0x0000000F と or をとればよい。
あとは、ADC側の設定をすればよいはず。全部で 16ch あるので、それを PortA, PortB に接続する。
そもそも PortA , PortB, PortC は[0:15] と、それぞれ 16bit ある。Arduinoヘッダには少ししかつながっていないが、Morph ヘッダにはつながっている。
リファレンスマニュアルの該当箇所は、
11.3.3 Channel selection
There are 16 multiplexed channels. It is possible to organize the conversions in two groups:
regular and injected. A group consists of a sequence of conversions that can be done on
any channel and in any order. For instance, it is possible to implement the conversion
sequence in the following order: ADC_IN3, ADC_IN8, ADC_IN2, ADC_IN2, ADC_IN0,
ADC_IN2, ADC_IN2, ADC_IN15.
• A regular group is composed of up to 16 conversions. The regular channels and their
order in the conversion sequence must be selected in the ADC_SQRx registers. The
total number of conversions in the regular group must be written in the L[3:0] bits in the
ADC_SQR1 register.
ADC_AQR1 - ADC_AQR3 に設定すればよさそう。
。。。うーん、違うみたい。AD変換を行う順番を制御するためのレジスタっぽい。GPIOのどのビットをADCのどのチャネルに接続するか、その設定を知りたいのだが。
モータ用端子の対応
arduino nucleo
右モータの回転方向 digital 7 PA6
左モータの回転方向 digital 8 PA9
右モータの回転速度 digital 9 PB6
左モータの回転速度 digital 10 PC7
赤外線センサアレイのピン対応
シルク面左から
LL digital 5 PB4
LM Analog 2 PA4
LR Analog 0 PA0
RL digital 11 PA7
RM Analog 3 PB0
RR digital 4 PB5
デジタルIO端子をアナログ端子として使用するためには、端子設定か、リマップが必要なはず。
赤外線LEDをON・OFF するためには、digital 2 ==> PA10 を使用する。
1 x 3 ピンヘッダを使い、LEDONとdigital2 をショートさせる。
そのうえで、PA10を H /L すると ON/OFF するはず。