STM32F4 DISCOVERYのAD変換をテストする
ロボット作ろう:シェーキー製作記
【後日追加】このプログラムの設定ではまれにAD変換値が非常に大きな値になることがあります。この対策はこちらの投稿を見てください。
AD変換をテストします。アプリケーションで変換を行うのではなく、このマイコンの特徴でもあるDMAで独立に行うようにします。今回は3つあるAD変換機のなかで一番シンプルそうな、ADC3を利用し、12bit・2チャンネルのAD変換を行ってみます。
ブログにコードを貼り付けると非常に読みにくいので、下記main.cをエディタで開いて読んでください。
今回もDISCOVERYのサンプルコードを元に実験しました。PC1,PC2の電圧を読みようになっています。
テストは2チャンネルですが、基板に何も乗っていなければ8チャンネルまでは拡張できます。ただ、このボードでは他の部品が接続されているので5チャンネルまでのようです。
実験は、このようにブレッドボードに半固定抵抗を2個取り付け、各チャンネルの可変電圧源として使用しました。
プログラムをデバッガで実行し、一時停止して下記のようにグローバル変数(配列)の中身を読みます。(これはデバッガ画面の右上部分を抜き出したものです)
グローバル変数を見るためには、右上のめがねのようなものが書いてあるボタンをクリックすると表示可能なグローバルの一覧が表示されるので、見たいものにチェックを入れます。
半固定抵抗をまわしながら、何回か実行・一時停止を行って、そのときの値を確認しました。問題なしです。
AD変換速度ですが、サンプルコードのReadMeによると次の式で計算されるそうです。
(12 + サンプリングタイム) / (APB2クロック / プリスケーラー分周比)
サンプリングタイムはサンプルアンドホールドにかけるクロック数で、各チャンネルごとに決めます。127、128行の3番目のパラメータがそれです。これは信号源のインピーダンスや静電容量によって決める必要があると思いますが、今回はサンプルコードのままです。
APB2クロックはシステムクロック168MHzの半分で84MHz、分周比は109行で2(ADC_Prescaler_Div2)に設定しています。
これで計算すると、(12 + 3) / (84 / 2) = 0.35us(チャンネル当たり) となります。あとDMAの時間が幾許か必要なのかどうかわかりませんが、ともあれ僕が使うには十分すぎるほどの速度です。
もちろんこれはAD変換をハード的に行う速度で、アプリケーションソフトはこの変換結果を任意のタイミングで参照する訳ですから、実際のサンプリングレートはこれに依存します。
ソースコードで気になることが一つ。32行でADC3_DR_ADDRESSとしてADC3のデータレジスタのアドレスを定義していますが、これはどこかですでに定義済みのマクロがないものでしょうか?探したのですが、見つかりませんでした。この部分はサンプルプログラムそのままなので、案外ないのかも知れません。データシートから目的のレジスタのアドレスを計算するのは結構厄介です。
ともあれ、これでADも使えます。単純なロボット制御の構成要素はあらかたテストできたようです。
« STM32F4 DISCOVERYでラジコンサーボを動かす | トップページ | STM32F4の消費電流を測る »
「ロボット作ろう」カテゴリの記事
- Raspberry Pi3でturtlebotを動かしたいのだけど(2016.06.11)
- STM32F4のAD変換トラブル(その2)(2013.03.29)
- TrueSTUDIOからEclipseへ乗り換える(拾遺)(2012.07.14)
- TrueSTUDIOからEclipseへ乗り換える(その3)(2012.07.13)
- TrueSTUDIOからEclipseへ乗り換える(その2)(2012.07.07)
« STM32F4 DISCOVERYでラジコンサーボを動かす | トップページ | STM32F4の消費電流を測る »
コメント