STM32F4のAD変換トラブル(その2)
ロボット作ろう:STM32F4編
ちょっと昔になりますが、STM32F4のAD変換のトラブルについて投稿したことがあります。AD変換の読み出し値が極端に大きくなってしまうというもので、この時は初期化のシーケンスをいじって直したようなつもりになっていました。
しかし、これはおかしな状態になる確率が下がるだけで、抜本的な解決になっていたわけではありませんでした。このへんできちんとしておかないと具合の悪いことになります。
異常時のADの読み出し値を調べたところ、正常な値の16倍になっていることがわかりました。STM32F4では12bitの変換結果を16bitデータとして読み込みます。これを右詰で出力するよう設定しているのがうまくいかずに左詰(12bitなのでちょうど16倍になる)になるときがあるようです。うまくいくときもある訳ですから、リセットに問題があるのは間違いないようです。
いろいろとサンプルコードをしらべるとADCの設定前にADC_DeInit()という関数を呼んでいるようです。これはADCの設定をリセット状態に戻す関数だそうです。ためしにコレをいれてみました。ADの設定はこんなふうになります。
//ADC3の基本設定
//
ADC_DeInit(); //いままではこれがなかった
//
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
ADC_CommonInit(&ADC_CommonInitStructure);
//ADC3の変換モード設定。入力2本をスキャン変換モードで逐次変換
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
ADC_InitStructure.ADC_ScanConvMode = ENABLE; //スキャン変換モードに
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfConversion = 2; //入力を2本(チャネルを増やしたらここを変える)
ADC_Init(ADC3, &ADC_InitStructure);
テストプログラムはこの投稿のものです。
現在のところこれでうまくいっています。本来ならリセットするだけで問題ないはずなんですが、いったいどうしたわけでしょう。デバイスのバグなんでしょうか?
« 新しいカテゴリーです | トップページ | roombaのドライバをインストールする »
「ロボット作ろう」カテゴリの記事
- 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)
コメント