2023年4月
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30            

カテゴリー

ブログパーツ

無料ブログはココログ

« 新しいカテゴリーです | トップページ | roombaのドライバをインストールする »

2013年3月29日 (金)

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のドライバをインストールする »

ロボット作ろう」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: STM32F4のAD変換トラブル(その2):

« 新しいカテゴリーです | トップページ | roombaのドライバをインストールする »