ESP32-DevKitCでRGB LEDディスプレイを動かすのに,自作プログラムでももう少し高速にならないかとパラレル・データ出力を試しています。
→ ESP32-DevKitCでパラレルのデジタル出力を試している
実際にOUTPUTレジスタを使うとどれぐらいのチューンアップになるのかを調べてみました。
ESP32-DevKitC-V4とHUB75E規格の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など頭も手も届かないので,これでやっていきましょうか(^^)。
→ ESP32-DevKitCでパラレルのデジタル出力を試している
実際にOUTPUTレジスタを使うとどれぐらいのチューンアップになるのかを調べてみました。
ESP32-DevKitC-V4とHUB75E規格の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