أريد مشاركة تجربة إنشاء شاشة 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 مرات ، يتم إعادة ضبط المخزن المؤقت للمؤقت إلى الحد الأدنى للقيمة ويتم إزاحة مؤشر العمود المحدد.ونتيجة لذلك ، يتم الحصول على خوارزمية المؤشر الديناميكي التالية:- نأخذ أول مجموعة من 3 بايت من ثلاثة صفائف ونضعها في المخازن المؤقتة لكل لون في العمود.
- نقوم بتنشيط المؤقت مع وقت تأخير بحد أدنى 128 علامة.
- نأخذ المجموعة التالية المكونة من 3 بايت من ثلاثة صفائف ونضعها في المخازن المؤقتة لكل لون في العمود.
- نقوم بتنشيط المؤقت بواسطة تأخير مزدوج نسبة إلى الخطوة السابقة.
- كرر العينة 4 مرات أكثر وضاعف وقت التأخير في كل مرة.
- نعيد ضبط المؤقت ونبدأ في معالجة العمود التالي من الخطوة 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 - تنزيلالبرامج الثابتة
مصادر و HEX المجمعة في MPLABX X IDE v2.30 - تنزيلالكود الرئيسي#ifndef MAIN_C
#define MAIN_C
#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 ((USBDeviceState < CONFIGURED_STATE) || (USBSuspendControl == 1)) return;
if (!HIDRxHandleBusy(USBOutHandle))
{
switch (ReceivedDataBuffer[0])
{
case 0x80:
while (--temp) dataR[temp-1] = ReceivedDataBuffer[temp];
break;
case 0x81:
while (--temp) dataG[temp-1] = ReceivedDataBuffer[temp];
break;
case 0x82:
while (--temp) dataB[temp-1] = ReceivedDataBuffer[temp];
break;
case 0x90:
column = 0b00000001;
cursor = BlockSize;
bright = MinBright;
TMR0ON = 1;
SWDTEN = 0;
break;
case 0x91:
UdnOff;
UlnOff;
TMR0ON = 0;
SWDTEN = 0;
break;
case 0x92:
UdnOff;
UlnOff;
TMR0ON = 0;
SWDTEN = 0;
SLEEP();
break;
}
USBOutHandle = HIDRxPacket(HID_EP, (BYTE*) & ReceivedDataBuffer, 64);
}
}
void main(void)
{
PCFG3 = 1;
PORTA = 0b00000000;
PORTB = 0b00000000;
PORTC = 0b00000000;
PORTD = 0b00000000;
PORTE = 0b00000000;
TRISA = 0b00000000;
TRISB = 0b00000000;
TRISC = 0b00000000;
TRISD = 0b00000000;
TRISE = 0b00000000;
INTCON = 0b10100000;
T0CON = 0b01000110;
USBDeviceInit();
while(1)
{
USBDeviceTasks();
ProcessIO();
};
}
void interrupt tc_int()
{
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