【mbed】ADC 端子を変更・追加できる?

stm32F401RE は、ADCを1個 16ch 持っている。(データシートを参照のこと。リファレンスマニュアル、ユーザマニュアルは複数のMPUについて書いてあり、ペリフェラルの個数についてはデータシートに記載されている)

 

GPIOのモードレジスタで「アナログ入力」に設定すると、端子をアナログ入力として使えるようになるはず。

 

だが、これを mbed 流に行う方法がわからない。。。。

 

今回の直接の目的は、zumo の光センサアレイを使うこと。

f:id:kzono:20160821144649p:plain

A0,A2,A3 はアナログ入力ピンなので、mbed で普通に使える。しかし、 4,5,11 はデジタルIO用なので ADC につながらない。そこで、ピンをリマップする方法が紹介されている。

 

f:id:kzono:20160821144703p:plain

 

f:id:kzono:20160821144719p:plain

パターンをカットし、アナログ入力端子に接続すればよい。

 

とりあえずはこれで解決できるが、できれば mbed でデジタルIOピンをアナログ入力に設定する方法を知りたい。なんせ、16chもあるのだから。

2016年08月21日のツイート

mbed で ADC

ADCのチャネル指定にピン番号を指定するみたい。

今、PortB_4, PortB_5 を指定したいが、ここで必要なピン番号はICのパッケージでの端子番号みたい。なので、回路図から対応を探した。

f:id:kzono:20160816222557p:plain

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 を設定する。

f:id:kzono:20160816201444p:plain

 

今、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 ヘッダにはつながっている。

f:id:kzono:20160816211209p:plain

リファレンスマニュアルの該当箇所は、

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のどのチャネルに接続するか、その設定を知りたいのだが。

 

Zumo Shield の加速度センサとジャイロセンサ

どの端子を利用するのか?

zumo_shield_for_arduino.pdf の

3.d. Inertial sensors (accelerometer, magnetometer, and gyro)
Overview

に情報があった。3軸加速度センサと3軸ジャイロセンサがこのシールドには載っているのだが、そのインターフェースは I2C だそうな。

UNOより古い arduino だと、

SDA analog 4   ==> PC1

SCL    analog 5   ==> PC0

うん、どうやらピンは赤外線センサとかぶっていなさそう。

 

 

モータ用端子の対応

              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 するはず。