D/A変換回路とA/D変換回路
小型コンピュータを使った制御では、外部回路に指定した電圧を出力(D/A変換)したり、外部の電圧を入力(A/D変換)したりすることが多い。以下にその為の回路と動作について説明する。
D/A変換回路
ラダー抵抗回路によるD/A変換の仕組みを引用
このような回路で、D0,D1,D2 は、デジタル値の0=0[V] , 1=5[V] であった場合、Output 部分の電圧は、(D0,D1,D2)の値が、(0,0,0),(0,0,1),…(1,1,1)と変化するにつれ、5/8[V]づつ増え、(1,1,1)で 5*(7/8)=4.4[V]に近づいていく。Output が出力によって電圧が変化しないように、アンプで増幅する。
DCモータをアナログ量で制御しないこと
このように、電圧をコンピュータから制御するようになると、ロボットで模型用の直流モータの回転速度をこれで制御したい…と考えるかもしれない。
しかし、直流モータは、コイル(電磁石)は単なる導線である。例えば、小さい電流で遅い速度でモータを回転させようとすると、小さい電圧でも導線(抵抗はほぼ0[Ω])には大量の電流が流れる。
PWM変調
こういう場合には、PWM変調(Pulse Width Modulation) を行う。
このような波形であれば、低速度でも高トルクが得られる。
A/D変換回路
D/A変換とは逆に、アナログ量をデジタル値に変換するには、どのようにするか?
このような場合には、A/D変換回路を用いる。一般的な回路では、以下のような逐次比較型A/D変換を用いる。
この回路では、変換開始と共に入力値をサンプル保持回路でアナログ量を保存する。
その後、Registerの中のデジタル値を、D/A 変換回路でアナログ量に変換した結果を、比較器(Comparator)でどちらが大きいか判断し、その結果に応じて2分探索法とかハイアンドローの方式のように、比較を繰り返しながらデジタル値を入力値に近づけていく。
ハイアンドロー(数あてゲーム)
数あてゲームで、デタラメな0〜127までの整数を決めて、ヒントを元にその数字を当てる。回答者は、数字を伝えると、決めた数よりHighかLowのヒントをもらえる。
最も速い回答方法は…例えば決めた数が55だとすると ・64 - Low 0------ 0..63 ・32 - High 01----- 32..63 ・48 - High 011---- 48..63 ・56 - Low 0110--- 48..55 ・52 - High 01101-- 52..55 ・54 - High 011011- 54..55 ・55 - Bingo 0110111 55確定 どんな値でも、7回(27=127)までで当てることができる。
入出力と変数・レポートNo.2
以下のような、位相が 0°,15°,30°,45° ずれた sin(x) のグラフを描くためのプログラムを作りたい。
Excel で式入力すりゃいいじゃん…というのはナシ。
0 =A1+15 =B1+15 … =A1+5 =sin((A2+B1)/180*3.141592) =sin((A2+C1)/180*3.141592) …
// 以下のプログラムは、初心者なら書きそうなボケが沢山入ってます。 // 正しく直してください。 #include <stdio.h> #define PI = 3.1415926535 ; int th ; void phase( int x ) { printf( "%d" , x ) ; // 位相を0度から45度まで15度ずつ変化させる for( th = 0 ; th <= 45 ; th += 15 ) { printf( " %d" , sin( (x + th) / 180 * PI ) ) ; } printf( "¥n" ) ; } int main() { // 角度を 0..360度 の範囲で表示 for( th = 0 ; th != 360 ; th += 5 ) { phase( th ) ; } return 0 ; }
このプログラムを正しく修正し、Excel に値を取り込んで、上図に示すようなグラフにしてください。
レポートでは、プログラムリスト、プログラムの説明、実行結果、感想・考察を記載し提出してください。