ESP32-DevKitCでRGB LEDディスプレイを動かすのに,自作プログラムでももう少し高速にならないかとパラレル・データ出力を試しています。

ESP32-DevKitCでパラレルのデジタル出力を試している

実際にOUTPUTレジスタを使うとどれぐらいのチューンアップになるのかを調べてみました。



ESP32-DevKitC-V4HUB75E規格の128x64RGB LEDディスプレイでの動作確認です。

パラレル出力でも,特に乱れも無く表示できましたV(^^)。







1.使用したピンとOUTPUTレジスタ



・データ(R1G1B1,R2G2B2)はPin12-17で連続させる
・SDカード用にVSPI,センサ用にI2Cは確保しておく
・行アドレス(ABCDE)は1画面で32回程度の変更なので不連続でも良いかな
・CLK(clock)はTx0とダブるが出力なので,ま,使えるか(^^;;;;


ピンに対応したOUTPUTレジスタ

・GPIO_OUT_W1TS 0x3FF44008 (Pin0-31 HIGH出力)
・GPIO_OUT_W1TC 0x3FF4400C (Pin0-31 LOW出力)

このレジスタの定義書式

#define GPIO_OUT_W1TS *(volatile uint32_t *)0x3FF44008
#define GPIO_OUT_W1TC *(volatile uint32_t *)0x3FF4400C





2.原色の1画面を出力するプログラム部

適当な色データを入れて,原色だけで1画面を描画しています。
データをパラレル出力すると結構シンプルになりました(^^)。



・データとクロックは1画面に128x32回使用するのでパラレルに出力
・行アドレス,ラッチ,イネーブルは1画面に32回なのでdigitalWrite



3.データ出力部のタイミング

1) 各行でのデータ出力のタイミングは次図の番号順で行われます。





2) 1行ラッチ出力の間隔

128個のデータビットを転送し,ラッチして表示する間隔は約50usでした。




HUB75(E)規格は画面を上下2枚に分けて同時に描画するので,64行のディスプレイは1画面の表示で32回の行表示です。



以上の結果からRGBの1画面の描画にかかる時間は 50us*32 で約1.6msになり,結構チューンアップできました(^^)。

ダイナミックにLEDをチラつき無しで点灯させる60Hzでは1画面全体を16.6ms未満で描画する必要がありますが,RGBだけの7色+黒なら十分のスピードですね。


一方,今回の目標である中間色表現の描画では各ドットでRGBの点灯時間に差をつけて色をつけます。このためRGBの何枚かのデータ画面を重ね塗りして,あるドットではRは3回点灯するが,Gは2回,Bは0回なので赤の強い橙色に見える,という感じで1枚の画像にします。

分かりやすい解説 → ケンケンさんのホームページ


上記の結果のRGBの1画面1.6msなら10回重ね塗りすると16msかかって,もう中間色表現の1画面表示以外何もできなくなりますね(^^;;; 

それでも,8回は重ねて8x8x8=512色みたいな感じではいけそうですね。
DMAなど頭も手も届かないので,これでやっていきましょうか(^^)。
AD