タッチスクリーン付きカラーLCDをマイクロコントローラーに接続する

こんにちは、ハブラ。 今日は、カラーLCDインジケーターのマイクロコントローラーへの接続に関するいくつかの経験を共有したいと思います。 このトピックはすでにハブ( http://habrahabr.ru/post/139384/ )で取り上げられているので、この投稿は尊敬される同僚によって既に書かれたものへの追加と考えることができます。


最初に参照した投稿では、SPIインターフェースを介して接続されたLCDインジケータについて説明しています。 この接続方法は簡単ですが、唯一の接続方法ではありません。 多くのインジケータには、画像を保存するためのメモリを持たない単純化されたコントローラのみが「搭載」されているため、画像の継続的な更新が必要です。 このようなインジケータは、電子機器のあらゆる場所で使用されており、その機能のために、マイクロコントローラに組み込まれた特別なLCDコントローラが必要です。 そのようなインジケータの例は、Multi-Inno Technologyによって製造されたMI0350CT-3です。 これは、320 * 240の解像度と抵抗センサーを備えた、カラーLCDのかなり典型的な例です。
そのため、問題があります。 各ピクセルがメモリ内で32ビット値で表されるようにします(そのうち24個のみが使用されますが、データは4バイト境界に配置されます)。 合計すると、1つのビデオページの下に320 * 240 * 4 = 307200バイト= 300 KBのRAMが必要です。 すべてのマイクロコントローラがそのような量のメモリを持っているわけではありません。 したがって、原則として、LCDが機能するには外部メモリが必要であるため、マイクロコントローラチップ上の外部メモリコントローラが必要です。
公平に言うと、24ビット/ピクセルではなく、より低い色深度を使用すると、メモリサイズの要件を削減できることに注意する必要がありますが、一方で、それらをすばやく切り替えることができるように、システムメモリに複数のビデオページを配置することができます。 後でこのトピックに戻ります。
例として、LCDをLPC2478マイクロコントローラーに接続することを検討してください。 これは、NXPマイクロコントローラーの少し時代遅れの代表です(最新のCortex M3ではなく、ARM7コア上)が、私たちの目的にとってこれは必須ではありません。 このマイクロコントローラには、外部メモリコントローラ(SRAMとSDRAMの両方を接続できる機能)、および非常に柔軟な設定が可能なLCDコントローラが必要です。
実験には、LPC2478マイクロコントローラーに加えて、512Kx8ビットの容量を持つK6R4008V1D-TI10静的メモリチップ(CMOS SRAM)を備えたSK-MLPC2478ボードを使用しました。 前述のMI0350CT-3インジケータは、ボードに接続されています。
別の落とし穴があります:このインジケータには、約20 Vの電圧で20 mAの出力電流のソースが必要で、たとえば、+ 5 Vの入力電圧で駆動し、20の安定した電流で負荷を供給するパルスブーストコンバーターを使用できますま 負荷が接続されていない場合、コンバータは出力電圧の安定化モード(U o = 20 V)で動作します。 コンバーター回路を図1に示します。ブーストコンバーターの動作と計算の原理はここでは考慮されません。このトピックに興味がある人は、MC34063Aチップのドキュメントを参照できます。



図 1.電圧コンバーター。

このタイプのLCDの接続と操作について簡単に考えてみましょう。 LCDは、色情報に24の信号、ピクセル同期にCLK信号、水平および垂直パルスにHSINKおよびVSINC信号を使用します。 さらに、このインジケータには、補助レジスタ、#RESET信号、およびDEN(データイネーブル)信号を設定するためのSPIインターフェイスがあります。 この場合のSPIインターフェースは、ディスプレイコントローラーに画像を送信するためのものではなく、補助レジスタを構成するためのものです。 これらのレジスタを使用すると、インジケータの動作モードを選択し、輝度、コントラスト、その他のパラメータを調整できます。 ただし、インジケータ制御レジスタはデフォルトで目的の状態に設定されており、変更しない場合は、SPI信号を単に無視できます。 #RESET信号は単純に非アクティブ(単一)状態に設定できます。 将来的には必要ありません。
そのため、このタイプのインジケーターが機能するために必要な主な信号は、現在のピクセルの色に関する情報をRGB形式で伝達するデータ信号、CLKクロック信号、垂直および水平同期信号、およびデータ解像度信号です。 タイミングチャートを検討してください。



図 2. LCDでのデータ送信のタイミング図。

図 図2は、1つの画像ラインのデータ伝送を示す最も「大規模な」データ転送タイミング図を示しています。 送信はCLK信号のエッジで発生し、高DENデータ解像度信号を伴います。 送信はRGB形式で行われ、Data0-Data7ビットは青、Data8-Data15ビットは緑、Data16-Data23は赤に対応します。
文字列データを送信する前とデータを送信した後、「空の」非情報伝達パルスCLKが挿入されます。 ラインフィードの前に、水平同期パルスHSYNC(LCD_LP)が続きます。
インジケーターのクロック周波数は6.4 MHzです(これは削減できますが、フレームのちらつきが顕著になります)。



図 3. LCDでのフレーム送信のタイミング図

LCDでのフルフレーム送信のタイミング図を図5に示します。 3.フレームの送信は、13の「空の」行で始まり、次に画像の240の行、その後「空の」行が続きます。 フレーム送信は垂直同期パルスで始まります。
また、抵抗センサーをマイクロコントローラーに接続します。 この接続の説明を以下に示します。
インジケーターをマイクロコントローラーに接続する完全な図は示しません。その自明性のため、インジケーターピンとコントローラーピン間の対応表のみを示します。

表1. LCD信号とコントローラー出力の対応

信号SK-MLPC2478(コネクタX6)LCDピンマイクロコントローラーポートご注意
GND153、54地球
+ 5V2-未使用
DATA6318データ
+3.3 V441、42栄養
LCD CLK IN5-未使用
データ7619データ
データ19731データ
データ18830データ
データ22934データ
データ231035データ
データ201132データ
データ211233データ
データ141326データ
データ151427データ
データ121524データ
データ131625データ
データ111723データ
データ101822データ
データ11913データ
データ02012データ
データ92121データ
データ82220データ
データ172329日データ
データ162428データ
LCD LE25-未使用
LCD PWR26-未使用
LCD FP2737垂直同期
LCD CLK2838インジケーターのクロッキング
LCD LP29日36水平同期
LCD ENAB3052データ解像度
データ53117データ
データ43216データ
データ33315データ
データ23414データ
スペナ3543P0.20SPIインターフェース、シリアルポートデータイネーブル
-36-未使用
#リセット376P0.19退院
-38-未使用
SPCK3949P0.17SPIインターフェース、シリアルポートクロック
SPDA4050P0.18SPIインターフェース、シリアルデータ
ゆうコネクタX7.158AD0 / P0.23抵抗センサー
XrコネクタX7.139AD1 / P0.24抵抗センサー
YdコネクタX7.1010P0.26抵抗センサー
XLコネクタX7.1211P0.25抵抗センサー

デバイスレイアウトを組み立てます(図4-6):



図 4.デバイスレイアウトボード



図 5.デバイスレイアウト(部分的に組み立てられた)



図 6.デバイスアセンブリのレイアウト

すべてが接続されたので、コードの記述を開始できます。 最初に行うことは、外部SRAMメモリの構成とテストです。

// Init SDRAM controller // Enable EMC clock PCONP_bit.PCEMC = 1; EMCSTATICWAITRD0 = 0x00000001; EMCSTATICWAITPG0 = 0x00000000; EMCSTATICWAITWR0 = 0x00000000; EMCSTATICWAITTURN0 = 0x00000000; EMCCONTROL = 1; // enable EMC 

SRAMテスト:
 char SRAM_Test(void) { // 32 bits access for (Int32U i = 0; i < 0x80000; i+=sizeof(Int32U)) { *(Int32U*)(((Int32U)SRAM_BASE_ADDR)+i) = i; } for (Int32U i = 0; i < 0x80000; i+=sizeof(Int32U)) { if (*(Int32U*)(((Int32U)SRAM_BASE_ADDR)+i) != i) { printf("Verification error on address : 0x%x\n",(Int32U)SRAM_BASE_ADDR+i); return(FALSE); } } return TRUE; } 

外部メモリのパフォーマンスは重要な要素であることを理解する必要があります。 実際、この場合のデータストリームはFclk * Nです。ここで、Fclkはインジケーターのクロック周波数、Nは1ピクセルに割り当てられたメモリ内のバイト数です。 合計で6.4 * 10 ^ 6 * 4 = 25.6 MB /秒になります。 8ビットインターフェイスのメモリの場合、これは最大許容アクセス時間が39 nsであることを意味します。 メモリパフォーマンス要件は、16ビットまたは32ビットインターフェイスのメモリを使用するか、使用する色深度を減らすことで削減できます。
LCDを構成し、インジケーターのドキュメントに従って信号の持続時間を設定します。
 // Init GLCD cotroller PCONP_bit.PCLCD = 1; // enable LCD controller clock CRSR_CTRL_bit.CrsrOn = 0; // Disable cursor LCD_CTRL_bit.LcdEn = 0; // disable GLCD controller LCD_CTRL_bit.LcdBpp= 5; //2bpp // 24 bpp LCD_CTRL_bit.LcdTFT= 1; // TFT panel LCD_CTRL_bit.LcdDual=0; // single panel LCD_CTRL_bit.BGR = 0; // normal output LCD_CTRL_bit.BEBO = 0; // little endian byte order LCD_CTRL_bit.BEPO = 0; // little endian pix order LCD_CTRL_bit.LcdPwr= 0; // disable power // init pixel clock LCD_CFG_bit.CLKDIV = SYS_GetFsclk() / (Int32U)C_GLCD_PIX_CLK; LCD_POL_bit.BCD = 1; // bypass inrenal clk divider LCD_POL_bit.CLKSEL = 0; // clock source for the LCD block is HCLK LCD_POL_bit.IVS = 1; // LCDFP pin is active LOW and inactive HIGH LCD_POL_bit.IHS = 1; // LCDLP pin is active LOW and inactive HIGH // LCD_POL_bit.IPC = 1; // data is driven out into the LCD on the falling edge LCD_POL_bit.IPC = 0; // data is driven out into the LCD on the rising edge LCD_POL_bit.PCD_HI = 0; // // LCD_POL_bit.PCD_LO = 0; // LCD_POL_bit.IOE = 0; // active high LCD_POL_bit.CPL = C_GLCD_H_SIZE-1; // init Horizontal Timing LCD_TIMH_bit.HBP = C_GLCD_H_BACK_PORCH - 1; LCD_TIMH_bit.HFP = C_GLCD_H_FRONT_PORCH - 1; LCD_TIMH_bit.HSW = C_GLCD_H_PULSE - 1; LCD_TIMH_bit.PPL = (C_GLCD_H_SIZE/16) - 1; // init Vertical Timing LCD_TIMV_bit.VBP = C_GLCD_V_BACK_PORCH; LCD_TIMV_bit.VFP = C_GLCD_V_FRONT_PORCH; LCD_TIMV_bit.VSW = C_GLCD_V_PULSE; LCD_TIMV_bit.LPP = C_GLCD_V_SIZE - 1; // Frame Base Address doubleword aligned LCD_UPBASE = (Int32U)GetVramAddr() & ~7UL; 

次に、テスト画像をROMに書き込み、RAMにコピーします。



図7.テスト画像

画像はunsigned int [240] [320]配列として記録され、外部メモリのベースアドレス(0x80000000)にコピーされます。
マイクロコントローラーに組み込まれたLCDサポートメカニズムの動作は、データがDMAコントローラーによってRAMから読み取られ、LCDコントローラーに送られ、そこでカーソルイメージがスーパーインポーズされ、データがLCD入力に送られるという事実にあります。 また、LCDコントローラーは1〜8ビット/ピクセルのモードのパレットサポートを提供できます。 パレットは、256個の16ビットレジスタとしてマイクロコントローラに実装されているため、8ビットカラーから16ビット(5ビット/カラー+ 1ビットの合計強度)へのマッピングを提供します。
カーソルには、2つの32ビットレジスタの個別のパレットがあり、24ビット色空間でカーソルのモノクロ画像を提供します。 カーソルのサイズは64x64ピクセルまたは32x32ピクセルで、カーソル画像自体と画像反転マスクの両方が含まれます。
これで、テストプログラムを実行して結果を確認できます。



図 8.作業の結果。

抵抗センサー接続


抵抗センサーの動作原理は広く知られています(例えば、こちらhttp://ru.wikipedia.org/wiki/Touch screen )。 したがって、センサーをマイクロコントローラーに接続する説明にすぐに進みます。 このデバイスは4線式センサーを使用します。 接続図を図に示します。 9。


図 9.抵抗センサーとマイクロコントローラーの接続図。

この接続の根底にある考え方は次のとおりです。 マイクロコントローラの各ピンは、論理0の出力、ログの出力のいずれかの状態になります。 1、入力(つまり、実際には接続されていない出力)、および抵抗を介して電源電圧にプルアップされた入力。 YUおよびXLピンはADC入力としても機能します。
プレスの座標を決定するための手順全体は、条件付きで3つのフェーズに分割できます。 最初のフェーズでは、センサーが接続されている結論は次の状態にあります(図10)。



図 10.プレスの座標の決定。 フェーズ1

センサーフィルムが短絡すると、ログ信号がマイクロコントローラーの入力で受信されます。 0、プログラムはフェーズ2に進み、押したx座標を決定します(図11)。 これに続いて、フェーズ3、y座標の決定が行われます。 (図12)。



図 11.プレスのx座標の決定。



図 12.プレスのY座標の決定。

もちろん、プレスの座標を計算するためのアルゴリズムには、「接触」(センサーフィルム)の跳ね返りの抑制を含める必要があります。
単一の測定では、座標を決定する精度が低すぎます。測定のノイズにより、接触点付近でカーソルが大きく変動します。 したがって、メディアンフィルター( http://en.wikipedia.org/wiki/Median_filter )など、何らかの種類のフィルターアルゴリズムを使用することが非常に望ましいです。
ADCコードで結果を受信した後、通常の線形変換(ax + b)を使用して画面座標に変換されます。ここで、係数aおよびbは、センサーのキャリブレーションによって検出され、コントローラーの不揮発性メモリに保存されます。 図 13.キャリブレーション画面の例が提供されています。



図 13.キャリブレーション画面。



図 14. LCDのキャリブレーション画面。

XPT2046などの外部コントローラーを使用してタッチスクリーンを接続することもできます。
サンプルプログラムの完全なソースコードは、 https//bitbucket.org/arktur04/lcd-demo (IAR開発環境)からダウンロードできます。

投稿に記載されているドキュメントへのリンク:
1.マルチイノディスプレイMI0350CT-3 http://www.displayfuture.com/engineering/specs/TFT/MI0350CT-3.pdf
2.パルス電圧コンバータMC34063A http://www.fairchildsemi.com/ds/MC/MC33063A.pdf
3.マイクロコントローラーLPC2​​478 http://www.ru.nxp.com/products/microcontrollers/arm7/lpc2400/LPC2478.html
4. XPT2046抵抗センサーコントローラーhttp://www.dzsc.com/uploadfile/company/785710/20111014212155973.pdf

Source: https://habr.com/ru/post/J140415/


All Articles