النموذج الأولي 262،144 تركيبات ألوان LED و 64 بكسل

    أريد مشاركة تجربة إنشاء شاشة LED 8x8 pixel ومجموعات ألوان 262k (18 بت) ومعدل إطارات 180 FPS واتصال USB. أنا مستعد أيضًا للاستماع إلى اقتراحات التحسين والتحسين. أخطط في المستقبل لاستخدام أفضل الممارسات لإنشاء عرض محطة الطقس الرئيسية.

مقدمة


    بدأ كل شيء بمخطط تحكم أبسط لخط من 8 مصابيح LED من خلال منفذ LPT. كان الإصدار التالي عبارة عن لوحة 5x8 من مصابيح LED ثلاثية الألوان ، والتي ترتبط أيضًا بـ LPT ، وفي الواقع ، كانت مجموعة من خمسة عشر مخزنًا مؤقتًا 8 بت مع وحدة فك ترميز لعناوينهم.
    في وقت لاحق ، بعد لقاء المتحكمات الدقيقة ، شرعت في إنشاء شاشة عرض مماثلة ، ولكن باستخدام اتصال USB. من المتوقع مبدئيًا استخدام 8 ألوان فقط. في وقت لاحق ، وجد طريقة للتحكم في سطوع كل الصمام الثنائي باستخدام جهاز توقيت عن طريق القياس مع PWM ، وبعد الانتهاء من جزء البرنامج ، تحول الجهاز الحالي. من الناحية النظرية ، يمكنك العمل مع 16 مليون لون ، لكن مصابيح LED التقليدية ليست مناسبة لهذا الوضع من حيث إعادة إنتاج الألوان والتكرار. بالإضافة إلى ذلك ، تظهر بالفعل مشاكل في لون الثنائيات المختلفة في التكوين الحالي.

وصف الوظيفة


    يعتمد الجهاز على وحدة التحكم الدقيقة PIC18F4550 التي تعمل بتردد 48 ميجاهرتز. يتم استخدام وحدة تحكم USB مدمجة ومكتبة جاهزة للعمل معها ، Timer0 في وضع 8 بت ، والذي ينفذ إشارة ديناميكية. لتخزين ثلاثة ألوان في عمود واحد ، تم استخدام ثلاثة مشغلات 8 بت على 74F374. يسمح استخدام هذا المخزن المؤقت بتقليل وقت عرض إطار واحد بمقدار 3 مرات. ملاحظة: عندما اخترت العازلة 74F374 ، لم أكن منتبهًا لأسلاك أرجلها ، لكنني فهمت هذا فقط عند قاعدة التركيب ، لذلك كان علي أن أعقد اللوحة بشكل كبير. من الأفضل استخدام نظائرها أكثر ملاءمة. على سبيل المثال ، 74HC574.
    يتم توصيل مصابيح LED عبر مفاتيح ULN2803 و UDN2982. المقاومة المقيدة للتيار موجودة فقط في القناة الحمراء ، لأن جهد الإمداد أقل من الأزرق والأخضر. لم يتم تثبيت المقاومة الأزرق والأخضر ، لأنه انخفاض الجهد الكافي على المفاتيح. ملاحظة: للحصول على إعادة إنتاج أكثر دقة للألوان ، من الأفضل تحديد مقاومات أكثر دقة تحد من التيار في كل قناة.
    يقوم المتحكم الدقيق في دورة لا نهائية باستقصاء حالة USB ، وعندما تصل حزمة بيانات ، حسب الأمر ، تبدأ / توقف العرض أو تعد البيانات للعرض. نظرًا لقصر حجم الحزمة الواحدة على 64 بايت ، يتم إرسال البيانات لكل لون في حزمة منفصلة من 48 بايت - 6 بايت لكل عمود من الأعمدة 8 ، مع ترميز سطوع كل LED في العمود. بعد استلام كل حزمة ، يتم نسخها من ذاكرة USB إلى مصفوفة من لونها.
    بعد تلقي أمر بدء الإشارة ، يقوم MK بتنشيط المؤقت في وضع 8 بت والمقسوم على 128. يستخدم المؤقت تردد تشغيل الميكروكونترولر كنبضات على مدار الساعة. تحدث زيادة في عداد المؤقت كل 4 مقاييس. الحد الأدنى لفترة المؤقت هو 10.6 ثانية (1/48 * 4 * 128) ، وهو ما يقرب من 2.8 مرة من وقت معالجة المقاطعة (46 عملية ، مقابل 128 عينة من المؤقت).
    عند تجاوز المؤقت ، يتم تنفيذ مقاطعة عالية الاتجاه. يقوم معالج المقاطعة بتعطيل الإشارة ، وتحديث البيانات في المخازن المؤقتة ، ونقل 1 بايت من كل مصفوفة ألوان وفقًا للمؤشر ، ثم تشغيل المؤشر. يدخل قيمة جديدة في المؤقت من المخزن المؤقت المؤقت ، ويقلل المؤشر ، ويحول المخزن المؤقت المؤقت للمؤقت. إذا تجاوز المخزن المؤقت للمؤقت الحد الأقصى للقيمة ، أي إزاحة أكثر من 5 مرات ، يتم إعادة ضبط المخزن المؤقت للمؤقت إلى الحد الأدنى للقيمة ويتم إزاحة مؤشر العمود المحدد.
ونتيجة لذلك ، يتم الحصول على خوارزمية المؤشر الديناميكي التالية:
  1. نأخذ أول مجموعة من 3 بايت من ثلاثة صفائف ونضعها في المخازن المؤقتة لكل لون في العمود.
  2. نقوم بتنشيط المؤقت مع وقت تأخير بحد أدنى 128 علامة.
  3. نأخذ المجموعة التالية المكونة من 3 بايت من ثلاثة صفائف ونضعها في المخازن المؤقتة لكل لون في العمود.
  4. نقوم بتنشيط المؤقت بواسطة تأخير مزدوج نسبة إلى الخطوة السابقة.
  5. كرر العينة 4 مرات أكثر وضاعف وقت التأخير في كل مرة.
  6. نعيد ضبط المؤقت ونبدأ في معالجة العمود التالي من الخطوة 1.

    وبالتالي ، يمكننا تعيين 2 ^ 6 = 64 خيار سطوع لكل صمام ثنائي في العمود. الجمع بين سطوع كل من الألوان الأساسية الثلاثة ، نحصل على 64 * 64 * 64 = 262144 لونًا. وقت المعالجة لعمود واحد هو (2 ^ 6-1) * 10.6 μs = 672 μs. الوقت لكل إطار من 8 أعمدة هو 672 * 8 = 5.4 مللي ثانية ، وهو ما يعادل تقريبًا 186 إطارًا في الثانية.

المكونات المستخدمة


  • PIC18F4550 - متحكم
  • 74F374 - مشغل للاحتفاظ بقيم العمود الحالية
  • ULN2803 - مفتاح للتحكم في الكاثود
  • UDN2982 - مفتاح للتحكم في الأنودات
  • مصابيح LED ذات 4 سنون مع كاثود شائع (يمكن استخدام أي مصابيح LED)

مخطط


مخطط بتنسيق dsn - تنزيل
الرسومات


الرسوم


رسومات Lay6 - تنزيل
الرسومات
1


2


( , , )





البرامج الثابتة


مصادر و HEX المجمعة في MPLABX X IDE v2.30 - تنزيل
الكود الرئيسي
#ifndef MAIN_C
#define MAIN_C

// Local includes
#include "config.h"
#include "usb.h"
#include "HardwareProfile.h"
#include "usb_function_hid.h"
#include "genericHID.h"

#define UdnOn           LATA&=0b11111110
#define UdnOff          LATA|=0b00000001

#define UlnOn           LATD
#define UlnOff          LATD =0b00000000

#define LineBufer       LATB

#define WriteR          LATE|=0b00000001
#define WriteG          LATE|=0b00000010
#define WriteB          LATE|=0b00000100
#define WriteRst        LATE =0b00000000

#define Columns         8
#define BrightLevels    6
#define BlockSize       (Columns*BrightLevels)

#define MinBright       0b11111111

unsigned char cursor;
unsigned char bright;
unsigned char column;
unsigned char dataR[BlockSize];
unsigned char dataG[BlockSize];
unsigned char dataB[BlockSize];

void ProcessIO(void) {
    unsigned char temp = BlockSize + 1;

    // If we are not in the configured state just return
    if ((USBDeviceState < CONFIGURED_STATE) || (USBSuspendControl == 1)) return;

    //Check if data was received from the host.
    if (!HIDRxHandleBusy(USBOutHandle))
    {
        switch (ReceivedDataBuffer[0])
        {
            case 0x80: // get red packet
                while (--temp) dataR[temp-1] = ReceivedDataBuffer[temp];
                break;

            case 0x81: // get green packet
                while (--temp) dataG[temp-1] = ReceivedDataBuffer[temp];
                break;

            case 0x82: // get blue packet
                while (--temp) dataB[temp-1] = ReceivedDataBuffer[temp];
                break;

            case 0x90: // start
                column = 0b00000001;
                cursor = BlockSize;
                bright = MinBright;
                TMR0ON = 1;
                SWDTEN = 0;
                break;

            case 0x91: // stop
                UdnOff;
                UlnOff;
                TMR0ON = 0;
                SWDTEN = 0;
                break;

            case 0x92: // power off
                UdnOff;
                UlnOff;
                TMR0ON = 0;
                SWDTEN = 0;
                SLEEP();
                break;
        }

        // Re-arm the OUT endpoint for the next packet
        USBOutHandle = HIDRxPacket(HID_EP, (BYTE*) & ReceivedDataBuffer, 64);
    }
}

void main(void)
{
    // Set all port as digital input/output
    PCFG3   = 1;

    // Clear all ports
    //          76543210
    PORTA   = 0b00000000;
    PORTB   = 0b00000000;
    PORTC   = 0b00000000;
    PORTD   = 0b00000000;
    PORTE   = 0b00000000;

    // Configure ports (1 - inputs; 0 - outputs)
    //          76543210
    TRISA   = 0b00000000;
    TRISB   = 0b00000000;
    TRISC   = 0b00000000;
    TRISD   = 0b00000000;
    TRISE   = 0b00000000;

    // Configure interrupts for Timer0
    //          76543210
    INTCON  = 0b10100000;

    // Configure Timer0 as 8bit and 128 prescaler
    //          76543210
    T0CON   = 0b01000110;

    USBDeviceInit();

    while(1)
    {
        // Check bus status and service USB interrupts.
        USBDeviceTasks();

        // Application-specific tasks.
        ProcessIO();
    };
}

void interrupt tc_int() // High priority interrupt
{
    UdnOff;
    UlnOff;
    LineBufer = dataR[cursor-1]; WriteR;
    LineBufer = dataG[cursor-1]; WriteG;
    LineBufer = dataB[cursor-1]; WriteB;
    UdnOn;
    UlnOn = column;
    WriteRst;
    TMR0L = bright;

    if (!--cursor) cursor = BlockSize;

    bright <<= 1;
    asm("BTFSS _bright, 5, 0"); asm("RLNCF _column, 1, 0");
    asm("BTFSS _bright, 5, 0"); bright = MinBright;

    TMR0IF = 0;
}
#endif



الجهاز قيد التشغيل


    للتحكم ، أستخدم مشغل راديو على الإنترنت مكتوب بلغة C ، والذي يعتمد على مكتبة BASS.DLL. يعمل عرض التدرج التدريجي عبر لوحة الألوان المتاحة بالكامل خلال فترة الإيقاف المؤقت ، ويبلغ معدل تحديث الإطارات (الحزم المرسلة إلى الجهاز) 20 هرتز. عند تشغيل الموسيقى ، يعمل المصور باستخدام صفيف FFT الذي تم الحصول عليه بواسطة BASS.DLL ، فإن معدل تحديث الإطارات (الحزم المرسلة إلى الجهاز) في هذا الوضع هو 29 هرتز.

التدرج


متخيل

: Tape Five — Soulsalicious

: ( ) ( ). .. , .







  • ( UDN)
  • USB
  • smd
  • 74F374 74HC574,
  • 74F374
  • 74HC138,
  • 3 ULN, UDN

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


All Articles