2016-06-07 22:28 | カテゴリ:PIC応用回路
AD変換した値をちゃんと利用する。


前回、AD変換を確認・テストするために、手持ちの廃品利用でジョイスティックもどきを製作しました。
これを利用すれば、PICでAD変換を利用した工作の試験が便利に出来そうです。

JS06.jpg

続きは、、、、

で、ふと思ったのですが、このジョイスティック(JS)は、既存のVRを廃品のケースに収めただけですので、VRの抵抗値がどの様に変化するかは確認できていません。
一般的に、VRは、回転角度と抵抗値が比例的に変化する「Bタイプ」と、指数的に変化する「Aタイプ」があり、このJSは恐らくBタイプと思いますが、まだ確認できていません。

そこで、JSの抵抗の両端に5Vを印加してJSを変化させて抵抗値を確認しました。

上下方向では、

U_min.jpg

UD_ctr.jpg

D_max.jpg
(上)0.01V (中央)2.50V  (下)4.25V

左右方向では

R_max.jpg

LR_ctr.jpg

L_min.jpg

 (左)5.04V  (中央)2.49V  (右)0.44V  

でした。

中央では、ほぼ5Vの1/2だったので、このVRは「Bタイプ」と分かりました。
しかし、上下、左右の最大回転時の電圧が結構ばらついています。
これは、ケースに入れた際に、JSが限界まで動作できないで(ケースの穴に制限されて)VRの可変接点がVや0に到達していないと考えられます。
実用上はさほど問題は無いと思いますが、これを利用した際に、AD変換値が、0から255や0から1023に変化しないのは困りますので、何らかの補正をしなければなりません。

その方法を考えて見ます。

「考え方」

JSから与えられる抵抗値による、電圧が、0や最大値にならなくても、適当な補正係数を掛けて、見かけ上、AD変換の結果を、0-1023(今回は10ビットAD変換とします)に近くなるようにする。

と言う訳で、プログラムを作成開始!

JSを連続して読み取って、結果をAD変換した上で、補正し、とりあえずモニターという事で、先日製作したLEDアレイに上位8ビットを表示するプログラムを製作しました。
プログラムはさほど困難なところも無く、サクッとでき、早速テスト。

ところが上手くありません。
X軸、Y軸の値をLEDに表示させるのですが、Y軸の中央から上の値が出ません。他は上手く動いているように見えます。
さて、プログラムリストを細部にわたってみましたが、原因は分かりません。
タイプミスや、変数の書く間違いなどもありません。

二日間、悩みました。

先ほど原因が分かりました。(種明かしは後ほど)

まず、このプログラムリストをご覧ください。

prog01.jpg

ここで、x_h, x_lは、x軸の上半分と下半分の補正係数です。(浮動小数変数で定義してあります)
x_min, x_cent, x_maxは、初期設定時に取り込んだ、x軸のAD変換値の最小、中立、最大の値です。(整数変数で定義)

x_h = 512 / (x_max - x_cent)

等の計算式で、AD変換のステップ毎に、補正する係数を求めています。
これが罠でした。

私の理解では、整数同士の計算でも結果を浮動小数変数に代入すると、結果が小数で得られるとばかり思い込んでいました。
結果は、X

ここを、calcという浮動小数変数を導入したうえで、

prog02.jpg

calc = x_max - x_cent
x_h = 512 / calc

として、初めて、正しく計算されました。

ここにたどり着くまでに、えらい苦労しました。
単純なエラーとならないで、x_h, x_l, y_h, y_lのうち、y_hのパラメータだけ見かけ上、変になったので、全く分かりませんでした。

と言う訳で、やっとジョイスティックのX,Y値をデジタル値(ほぼ0-1023)に変換させることが出来ました。


プログラムは、こちらです(AD読み込み部分を複数回読み込んで平均するように変更しました)

Prog002.txt


動作状況は、



LEDが全点灯している数秒間にジョイスティックを上下左右にグリグリして、最大値最小値を認識させます。
中立値は電源投入直後にLEDが点灯する前に読み込みますので、それまではスティックに触れないようにしてください。

【ジャンル】:趣味・実用 【テーマ】:ホビー・おもちゃ
コメント(4)

管理者のみに表示する