現在、SH7206でプログラム開発をしています。
AD変換器でAN0~AN4の5CH.分をスキャンモードでAD変換しているのですが、稀にAD値が正常に取得できないことがあります。
通常700付近で取得できるはずのAD値が、0や1になってしまいます。
AN0~AN5の全てのCH.で正常に取得できない場合と、1CH.だけ正常に取得できない場合があります。
AD変換開始直後のAD値が正常に取得できないと、正常な変換結果が得られることはありません。
プログラムの構造上、2回AD変換器の設定をする必要があり、上記の現象は2回目の設定以降に発生します。
(設定の内容は1回目と2回目で同じです。)
2回目の設定は次のように行っています。(1回目の設定は、以下の(※)が無いだけです)。
---------------------
ADCSR0_ADST = 1の状態で…(※)
ADCSR0 に '0x007C'をセット ←ADST=0になる直後に、ADCSR0_ADST に '1'をセット
次の処理へ…---------------------
SH7206のハードウェアマニュアルの「使用上の注意」に以下のような記述があり、以下のとおりにAD変換停止後に少し時間をおいてからAD変換を開始させると、
上記の現象はおさまるようにみえます。
-----ハードウェアマニュアルより...----------------------------------
「スキャンモードおよびマルチモードの停止直後に、変換を開始した場合、誤った変換結果を示すことがあります。連続して変換を行う場合は、ADST=0 とした後、1 チャネル分のA/D 変換時間以上経過してから起動(ADST=1)するようにしてください(1 チャネル分の変換時間はADC の分周レジスタ設定により異なります)。」
---------------------------------------------------
ハードウェアマニュアル中の「誤った変換結果」というのは、AD変換開始直後の一回だけでしょうか?それとも次にAD変換停止→開始とまるまでの間、ずっとでしょうか?
AD変換結果が正しく得られないのは、停止直後に開始させているからでしょうか?また、その場合に1CH.だけ正しくAD変換結果が得られないということはあるのでしょうか?
同じような経験をされた方はいらっしゃいませんか?
ご教示をお願い致します。
mmさん UMでは「直後1回のみ」という表現を使っていないので、 ADSTを0にした直後に1に戻すとAD変換動作を保証できない状態になると解釈するのがよいかと思います。 UMの表現とmmさんの動作内容から、チップの動作を想像すると、 「誤った変換結果」というのは、AD変換の制御部とAD変換の実行部のステータスがズレてしまった結果発生する現象のようで、 自然回復しないズレが発生する場合と、回復するズレが発生する場合があるようですね。 もし、誤動作した後にADST=0にして1変換時間待ってから1に戻しても正常に動作しない場合は、 一旦ADCをモジュールストップ(ADの電源を落とす)して、数msec待ってからモジュールストップを有効にして再起動してみてください。 SH7206のADCは動作中のアナログチャンネルの切り替えなどのリカバー処理が入ってない様なので、丁寧に使ってあげてくださいね♡
Kirinさん
お返事、ありがとうございます。
ご丁寧にご説明をいただき、とても助かりました。
AD変換の制御部と実行部のステータスのズレですか…それでしたら、発生している現象が納得できます。
大変恐縮ですが、ご存知でしたら以下についてもお教えください。
ADST=0の直後に1にすると変換結果が正しく得られないという現象は、シングルモードではなぜ起きないのでしょうか?
モードによってレジスタのサンプリング方法が異なるということですか?
また、スキャンモード使用時には必ずADF=1を確認してからADDRから変換結果を取得しなければいけないのでしょうか?
ADFを確認しなくても、ADDRにセットされる値は常にAD変換結果ではないのでしょうか?
よろしくお願い致します。
mmさん 中の人ではないので、確実なことはいえませんけども AD変換の実行部のステータスは2つあって、1つは逐次変換を進めるステータス、もう1つはチャンネルを選択するステータス。 シングルモードの場合はチャンネルのステータスが固定されているので、チャンネルのズレが発生しません。 一方、スキャンモードの場合はチャンネルが変わっていくので、チャンネルカウンタの初期化が上手くできないと 違ったチャンネルの値をサンプリングすることになるかと思います。もしかすると、最大8回の誤変換後に再同期するかもしれません。 スキャン時はADF=1を確認するか割り込みを待つことで、全チャンネルの変換が終わったことが分かります。 確かに待たなくても各ADDRには何らかの値が入っていますけれども、その値が正しい(最新の値)かどうかは分かりませんので、 やっぱり、ちゃんと待たない(確認しないと)とダメですね。
毎回ご丁寧な返信をいただき、ありがとうございます。
やはり、ADFはきちんと確認するようにします。
スキャンモードの場合、逐次変換用のステータスとチャンネルを選択するステータスは、ADCSRのCKSで設定した
AD変換時間で同期をとっているのでしょうか?
そうだとすると、シングルモードの場合はCKSの設定値は意味をもたない…?のでしょうか…
グループは違うのですが、SH7760のテクニカルアップデートで以下のようなものを見つけ、もしも同じことがSH7206でも起こるのであれば、変換結果が0や1になってしまうのは、再スタートができていないという可能性もあるのでは…と思っています。
-------------------------------------------------------
スキャンモードまたはマルチモードにおいて、A/D変換中にADコントロール/ステータスレジスタのA/Dスタートビット(ADCSR.ADST)をCKSL[1:0]で選択したクロック周期でサンプリングしているため、ADST変化の間隔がサンプリング間隔(CKSL[1:0]で選択したクロックの周期)より短いと、ADSTの変化を検出できずにA/D変換の停止、あるいはA/D変換が開始されない場合があります。
例えば、クリア(ADST=0)して、A/D変換を停止させた後、A/D変換を再スタート(ADST=1)しても、ADSTの設定タイミングによってはA/D変換が開始されない場合があります。
何度も申し訳ございませんが、ご存知でしたらご教示ください。
mmさん
レジスタ構成は似ていますけれども、各ビットが完全には一致していないのとアナログの等価回路が異なるので SH7760とSH7206に搭載されているADCは別もののようですね。
でもまぁ、設計思想は似ていると思いますので、同様の制限事項が存在する可能性はありますね。 ルネサスに限らず、正常系の動作保証は簡単ですけれども、異常系の動作保証(不具合現象発生保証?)は難しいので詳細な記述ができないのかもしれませんね。 「この操作を行うと必ず動作不良になります」とは書けず、「この操作を行うと動作不良を起こす事があります」とお茶を濁すのが一般的かと思います。
意図的にギリギリの条件で使いたい場合は、不具合の本質的な部分を理解した上で適切な処置を(自己責任で)講じる必要がありますけれども、回避可能ならば、不具合の概要だけ掴んで、それを避けるのが無難でしょうね。
ちなみに、CKSはA/Dの変換時間を決める要素なので、シングルモードでまったく使われていないわけではありません。
お返事をありがとうございました。
現状何が起こっているのか知りたくて、色々とご質問させていただきました。
毎回丁寧にご説明いただき、とても感謝しております。
ステータスのズレなど、教えていただいたことを踏まえて、再度見直します。
また、現状のプログラムでは疑わしいところがたくさんありますので、もっと丁寧な記述に修正したいと思います。
外から条件を色々変えて、動きから中身の回路を想像するのは知的好奇心がそそられますよね。
一般的には、非同期回路だとタイミング設計が難しいので、想定している使い方以外の条件では、制約ができてしまうのは仕方ないんですねー。