前のページの図18にローパスフィルタを追加して、直流の負電圧を発生させるようにしたのが次の回路です。
R5とC1が、追加したローパスフィルタを構成する部品です。この回路をブレッドボード上に作り、オシロスコープで波形を観察してみました。
前のページのスケッチを使って、AOUT=80の条件で波形を観察した結果を次に示します。(AOUTはanalogWrite関数の第2引数)
黄色の波形はArduinoのD3から出てくるPWM信号です。水色は、図22における出力信号です。
31.34%のデューティ比のPWM信号を入力すると、出力に-9.10Vの直流電圧が出ています。(ただし、オシロでの電圧の測定結果は参考程度に) 前のページでローパスフィルタがない状態で実験をしたら、出力の平均電圧が-7.37Vでしたから、今回の結果と1.73Vの差があります。この差はオシロスコープの精度では説明が付きません。この理由に関しては、後に説明します。
次にAOUT=170の条件で波形を観察しました。結果を次に示します。
この条件では−5.97Vが出力されています。ローパスフィルタがなかった時の平均出力電圧が−3.83Vだったので、2.14Vの差があります。とはいえ、D3のPWM信号のデューティ比を変えると、無事に出力電圧が変えられている様子が確認できました。
オシロスコープでは電圧の測定精度が良くないので、デジタルマルチメータを使って出力電圧を測定してみました。
AOUTを0~255の範囲で変化させた場合の出力電圧の測定結果を次のグラフに示します。
AOUTを0から255まで変化させると、出力電圧も−10Vから0Vまで単調に変化しますが、直線関係にはならず、曲線になっています。これは、図18に示した負電圧のPWM出力回路の出力インピーダンスが、−10V出力時はほぼ0Ωなのに対して、0V出力時は10kΩとなるからです。CR1次ローパスフィルタは、信号源のインピーダンスが一定でないと正確な平均電圧を出力できません。図22において、R5よりR4の方が十分小さければ、正確な平均電圧が出力できるので、R4を小さくする(−10Vラインの消費電流が増える副作用がある)か、R5を大きくする(出力インピーダンスが上昇する副作用がある)かをすれば、図25のグラフはより直線に近づきます。
しかし、今回作っているのは、LCDのコントラスト調整用の電圧出力回路なので、それほど直線性にこだわる必要もありません。
図22の回路で、実際にSG12864ASLB-GBのコントラストを調整してみました。この連載の1ページ目に載せた回路においてコントラスト調整回路を、20kΩの半固定抵抗から図22の回路に置き換えて実験しました。ただし、−10Vの電源はSG12864ASLB-GBの18番ピン(VOUT)から取り、出力は3番ピン(VO)に繋ぎました。
回路の動作のテストに使ったスケッチを以下に示します。なお、このスケッチを動かすためには、MGLCDライブラリのVer.0.34以降をインストールしておく必要があります。
#include <mglcd.h>
#define AMIN 165 // analogWriteの出力の最小値
#define AMAX 225 // analogWriteの出力の最大値
#define PAUSE 500 // コントラストを切り替える間隔(ms)
static const TLcdPinAssignTable PinAssignTable={
A0_DI : A3, // A0 for SG12232, D/I for SG12864
CS1_E1 : A0, // CS1
CS2_E2 : A1, // CS2
E : A4,
RW : A2,
DB0 : 8 ,
DB1 : 9 ,
DB2 : 10,
DB3 : 11,
DB4 : 4 ,
DB5 : 5 ,
DB6 : 6 ,
DB7 : 7
}; // PinAssignTable;
static mglcd_SG12864 MGLCD(PinAssignTable);
void SetContrast(int cont)
{
MGLCD.Locate(0,2);
MGLCD.print("PWM シュツリョクチ:");
MGLCD.print(cont);
MGLCD.ClearRestOfLine();
analogWrite(3,cont);
} // SetContrast
void setup()
{
// 3番ピンの初期化
pinMode(3,OUTPUT);
analogWrite(3,AMIN);
// LCD画面の初期化
while(MGLCD.Reset());
MGLCD.SetCodeMode(MGLCD_CODE_UTF8); // かな表示を有効にする
MGLCD.print("コントラスト チョウセイ ノ テスト");
}
void loop()
{
int i;
for(i=AMIN; i<AMAX; i++) { // PWMのデューティー比を増加させる(表示が薄くなる)
SetContrast(i);
delay(PAUSE);
} // for i
for(i=AMAX; i>AMIN; i--) { // PWMのデューティー比を減少させる(表示が濃くなる)
SetContrast(i);
delay(PAUSE);
}
}
このスケッチは、analogWrite関数の第2引数をゆっくり増減させるスケッチです。引数のの変化に応じて画面の濃さが変化する様子を観察できます。下の写真は、その様子を表わしたものです。"PWM シュツリョクチ"と表示されているのが、analogWrite関数の第2引数です。
商品名 | Arduino Uno用ブートローダスケッチライタシールドキット | |
税抜き小売価格 | 1440円 | |
販売店 | スイッチサイエンス | |
サポートページ | Arduino Uno用ブートローダライタシールドキットサポートページ |
商品名 | Arduino用ブートローダ/スケッチライタキット | |
税抜き小売価格 | 3000円 | |
販売店 | スイッチサイエンス | |
サポートページ | Arduino用ブートローダ/スケッチライタキットサポートページ |