前回の4桁7セグLEDのダイナミック駆動の時のブレッドボード、ジャンパ線が多すぎて肝心のLEDすら見苦しかったです。今回はそのフォローということで、「治具」をこさえて多少見やすくしてみました。それだけでは進歩?が無いので、アノードコモンの端子をマイコンの直接駆動から、PMOS-FET駆動に変更してみました。使用したのは別シリーズでBB化した部品が手元にあるBSS84トランジスタであります。
※「部品屋根性」投稿順Indexはこちら
まずは、前回、前々回と回路図もちゃんと書かずに適当なことをしてきたので、回路図(「水魚堂さん」使わせていただいております。)を掲げましょう。点線で囲まれた部分が中華部品キットから取り出した製造元不詳の4桁の7セグメントLEDであります。アノードコモン、手元で測定したVf=1.8Vくらい。赤色LEDです。
前回の記事を参照していただけると、このLEDの周りにジャンパ線が飛び回っており、まともに表示が見えないことが分かるかと思います。そこでLEDとカソード側に接続している電流制限抵抗を1枚の基板に載るようにして左側4端子=桁表示コモン・アノード、右側8端子=各セグメント・カソードという「治具」を作ってみました。上のアイキャッチ画像御覧いただけると大分スッキリしたんじゃないかと思います。
例によってこの「治具」制作でもg端子のカソードと桁4のアノード端子がショートしておるというバグはあり、お約束どおりにトラブッたのですが、もはや多くを語りますまい。
しかし、全体としてはジャンパ線が多くて見苦しいのは相変わらず。こんな感じ。
左下の紺色のseeed印のボードが、RISC-V搭載GD32VF103搭載の評価ボードです。大分以前の回で説明したとおり、Longan nanoボードのつもりで使えるので、Visual Studio Code上のPlatformIOを使用し、ボードはLongan nano、プラットフォームはgd32v、フレームワークはgd32vf103-sdkを選択してソフトを作っています。
マイコンボードに接しているのが、アノードドライバボード(?)であります。BSS84を各桁1個づつ、合計4個搭載のもの。
その右側のブレッドボードがこれまた製造元不詳の74HC565をつかったシリ・パラ変換ボード(?)であります。
そしてその上が今回こさえたLED周りを多少スッキリさせるための治具を刺したブレッドボードです。
依然、下の方はジャンパ線多すぎて進歩が見えない、トホホ。
さて、アノード側にPMOS FETを挿入したので、LED駆動系はCPU電源とは切り離し、別電源で駆動可能となりました。また、GD32VD103は、データシート的には1端子20mAまで流せる(しかし20mA流すとかなり電圧ドロップする)ことになっているのです。しかし、80端子もあるIO端子にそんなペースで負荷をかけてよい筈もありません。外付けのドライバに負荷を任せたので、マイコン的には負荷は非常に軽減された筈。
とは言え、忘れていけないのは、アノードの直接駆動(点灯時1を出力)から、PMOSを介して間接駆動(点灯時0を出力)の変更であります。修正した、「ドライバ」ソフトウエアはこちら。
void dynamicDisplay7Seg() { gpio_bit_set(GPIOC, GPIO_PIN_0); //for PMOS Anode driver gpio_bit_set(GPIOC, GPIO_PIN_1); //for PMOS Anode driver gpio_bit_set(GPIOC, GPIO_PIN_2); //for PMOS Anode driver gpio_bit_set(GPIOC, GPIO_PIN_7); //for PMOS Anode driver enableOE(LED7_OD); //DISABLE OUTPUT sendShiftRegister( displayData[displayIndex++] ); enableOE(LED7_OE); //ENABLE OUTPUT switch (displayIndex) { case 1: gpio_bit_reset(GPIOC, GPIO_PIN_0); //for PMOS Anode driver //gpio_bit_set(GPIOC, GPIO_PIN_0); //for Direct drive break; case 2: gpio_bit_reset(GPIOC, GPIO_PIN_1); //for PMOS Anode driver //gpio_bit_set(GPIOC, GPIO_PIN_1); //for Direct drive break; case 3: gpio_bit_reset(GPIOC, GPIO_PIN_2); //for PMOS Anode driver //gpio_bit_set(GPIOC, GPIO_PIN_2); //for Direct drive break; default: gpio_bit_reset(GPIOC, GPIO_PIN_7); //for PMOS Anode driver //gpio_bit_set(GPIOC, GPIO_PIN_7); //for Direct drive break; } displayIndex = (displayIndex > 3) ? 0 : displayIndex; }
これをTimer 5に設定した1000分の1秒割り込みの度に呼び出すことで、displayData[]配列に1要素1桁で格納してある0から0xFまでの数字を出力することができます。なお、要素0が最上位桁、要素3が最下位桁になってます。逆の方が良かったか?
これで、トラブル続きだった7セグLEDは一端おしまい。次は何?