2019/01/27(SUN) | 【Nチビ】すいおん!A |
---|---|
プログラムを考える
温度センサーは 6.25mV/℃ らしい。 では、 マイコン側で単純に電源の5Vをリファレンスとした時の AD変換の粒度は、10ビットなので 5Vで、1023 = 3FFh だとすると 5000mV ÷ 1023 = 4.9 mv/1bit という粒度となる いや、リファレンスする値を調整すれば そこは調整つくんだけど 面倒なので電源電圧をリファレンスする。 センサーは0℃の時 424 mV らしいので PICでAD変換すると 424mV ÷ 4.9 mV/1bit ≒ 86(デジタル変換なので小数点以下切捨て) 100℃の時 1049 mv らしいので PICでAD変換すると 1049mV ÷ 4.9 mV/1bit ≒ 214 ということで y: 温度 x: PICでのAD変換値 とすると温度(y)を求める式は以下のようになる。 y = (25/32)(x - 86) つまり センサーから取得したAD変換値(X)から86引いた値を 25倍して32で割る。 32で割るということは 32 = 2の5乗 なので 5bit右シフトすればOKなので簡単です。 25倍っていうのは 25 = 11001b なので 4bit左シフトした値と 3bit左シフトした値と なにもしない値を足し算すれば 25倍したことになります。 PICのアセンブラでは 1bitシフトの命令しかないので ループでシフトを繰り返すルーチンを作る 相変わらず、アセンブラで まず変数 左シフトする関数。 PICマイコンのレジスタは8bitなんですが 8bitだと0〜255の値しか扱えないので それだと今回の計算はできないので 16bitに拡張して計算しています。 今回は左シフトなんで単純です 左シフトして桁が溢れたら キャリービットが立つので 上位側に+1すればOK シミュレーターで動かしてみましょう 127 を 4 bitシフトしてみます。 結果は以下の通り 赤枠で囲ったところが 上位と下位となるので 00000111 11110000b つまり 10進数でいうと 2032 127 を 4 bitシフトするというのは 127 を 16倍することなので 127 × 16 = 2032 合っていそうですね。 今日はここまで。 |