محلل الطاقة هو حمولة وهمية قابلة للبرمجة للتيار الإلكتروني مع جهد جانبي عالي ومستشعرات حالية لتحليل تلقائي لمصدر الطاقة ، محولات DC/DC ، منظمات الجهد ، البطاريات ، أجهزة الشحن ، مستهلكي الطاقة وغيرهم. يمكن التحكم في الجهاز عبر واجهة USB التسلسلية باستخدام شاشة تسلسلية أو Python Skripts المقدمة. يمكن تصدير البيانات لنشر البرامج الورقية أو تحليلها مباشرة بواسطة Python Skript.
تضمن دائرة التحكم في الحمل الإلكترونية ، والتي تتكون أساسًا من مكبر للصوت التشغيلي ، ومقاوم MOSFET ومقاوم التحويل ، أن يتدفق التيار نفسه بغض النظر عن الجهد المطبق.
لهذا الغرض ، توجد تحويلة 100mΩ تتكون من ثلاثة مقاومات 300mΩ بالتوازي لتبديد الحرارة المناسب في دائرة الحمل ، والتي يتم من خلالها قياس التيار. يقارن LMV321 للسكك الحديدية إلى السكك الحديدية هذا بالقيمة المستهدفة ، والتي يتم تحديدها بواسطة المحول الرقمي الداخلي لـ ATTINY إلى مستوى التناظرية (DAC) عبر مقسم الجهد ، وبناءً على ذلك ، يتحكم في بوابة مستوى المنطق IRL540N ، والذي بدوره يضبط التيار من خلال مجموعة المقاومة الداخلية في هذا الطريق.
يتم قياس الجهد والتيار من خلال مقاوم تحويلة 8MΩ عالية الجانب متصل بـ INA219 بدقة 4MV/1MA. يتم توصيل INA219 الثاني بمقاوم تحويلة بحجم 8 ميجاسيس بين محطة PWR-in و PWR-Out. INA219 هو شاشة تحويلة حالية وطاقة مع واجهة متوافقة مع I²C. يراقب الجهاز كلاً من جهد الجهد وجهد توريد الحافلة ، مع أوقات تحويل قابلة للبرمجة وتصفية. تتيح قيمة المعايرة القابلة للبرمجة ، جنبًا إلى جنب مع مضاعف داخلي ، القراءات المباشرة للتيار في أمبيرز. تتيح مقاومة التحويل المحددة لـ 8mΩ تأثيرًا صغيرًا جدًا على الدائرة وقياس بدقة 1MA. لقياس دقيق ، يجب اختيار مقاوم التحويل مع انخفاض التسامح (1 ٪ أو أفضل).
يتم توصيل محلل الطاقة عبر USB بجهاز كمبيوتر أو Raspberrypi. يمكن إرسال أوامر إلى المحلل عبر شاشة متسلسلة أو بواسطة Python Skript المستندة إلى واجهة المستخدم الرسومية. يحتوي المحلل على خوارزميات اختبار تلقائية مدمجة. يتم إرسال البيانات التي تم جمعها مرة أخرى عبر الواجهة التسلسلية/USB إلى الكمبيوتر/التوت. يقيس ATTINY814 باستمرار الطاقة ودرجة حرارة التبريد. يتحكم في المروحة ويقطع الحمل عندما تصبح درجة الحرارة ساخنة للغاية.
يتحكم ATTINY814 في الحمل الوهمي الإلكتروني مع المحول الرقمي الداخلي إلى التناظرية (DAC). يتم استخدام جميع الفولتية المرجعية الداخلية الخمسة من أجل الحصول على أقصى دقة وحل DAC. يتم توصيل DAC بأوبامب الذي يعمل كمكبر للوحدة يتحكم في مقاومة MOSFET.
// DAC reference voltages (load current = DAC voltage * R16 / (R15 + R16) / R_SHUNT)
// Reference voltages: 0.55V, 1.1V, 1.5V, 2.5V, 4.3V
const uint8_t DACREF [] = { 0x00 , 0x01 , 0x04 , 0x02 , 0x03 }; // CTRLA.DAC0REFSEL values
const uint16_t DACCUR [] = { 717 , 1434 , 1956 , 3260 , 5608 }; // max current in mA
uint8_t DACreference = 0 ; // start with 0.55V reference
// Setup the digital to analog converter (DAC)
void DAC_init ( void ) {
VREF_CTRLB |= VREF_DAC0REFEN_bm ; // enable DAC reference
_delay_us ( 25 ); // wait for Vref to start up
pinDisable ( DAC_PIN ); // disable digital input buffer
DAC0 . CTRLA = DAC_ENABLE_bm // enable DAC
| DAC_OUTEN_bm ; // enable output buffer
}
// Set the lowest reference voltage possible for the DAC to meet the load current
void DAC_setReference ( uint16_t current ) {
DACreference = 0 ;
if ( current > DACCUR [ 4 ]) current = DACCUR [ 4 ];
while ( current > DACCUR [ DACreference ]) DACreference ++ ;
DAC0 . DATA = 0 ;
VREF_CTRLA &= 0xf8 ;
VREF_CTRLA |= DACREF [ DACreference ];
_delay_us ( 25 );
}
// Set the DAC within the selected reference to the specified load current
void DAC_set ( uint16_t current ) {
if ( current > 5000 ) current = 5000 ;
if ( current > DACCUR [ DACreference ]) DAC0 . DATA = 255 ;
else DAC0 . DATA = ( uint32_t ) 255 * current / DACCUR [ DACreference ];
}
// Set the DAC and its reference to the specified load current
void DAC_setLoad ( uint16_t current ) {
DAC_setReference ( current ); // set suitable voltage reference
DAC_set ( current ); // set DAC according to desired load
}
// Reset the load to minimum
void DAC_resetLoad ( void ) {
DAC_setLoad ( 0 ); // reset the load to minimum
}يتم تخزين الأوامر التي يتم إرسالها عبر محول USB إلى Serial في مخزن مؤقت لأمر 16 بايت. يتم ذلك عن طريق المقاطعات بحيث يمكن للتحكم في الحمل والمروحة ، على سبيل المثال ، الاستمرار في التشغيل بالتوازي. بمجرد استلام الأمر بالكامل ، يتم تعيين علامة CMD_COMPL. ثم يقوم المحللون باستخراج الأمر والوسائط.
// UART definitions and macros
#define UART_BAUD 115200
#define UART_BAUD_RATE 4.0 * F_CPU / UART_BAUD + 0.5
#define UART_ready () (USART0.STATUS & USART_DREIF_bm)
// UART command buffer and pointer
#define CMD_BUF_LEN 16 // command buffer length
volatile uint8_t CMD_buffer [ CMD_BUF_LEN ]; // command buffer
volatile uint8_t CMD_ptr = 0 ; // buffer pointer for writing
volatile uint8_t CMD_compl = 0 ; // command completely received flag
// UART init
void UART_init ( void ) {
pinOutput ( TXD_PIN ); // set TX pin as output
USART0 . BAUD = UART_BAUD_RATE ; // set BAUD
USART0 . CTRLA = USART_RXCIE_bm ; // enable RX interrupt
USART0 . CTRLB = USART_RXEN_bm // enable RX
| USART_TXEN_bm ; // enable TX
}
// UART transmit data byte
void UART_write ( uint8_t data ) {
while (! UART_ready ()); // wait until ready for next data
USART0 . TXDATAL = data ; // send data byte
}
// UART RXC interrupt service routine (read command via UART)
ISR ( USART0_RXC_vect ) {
uint8_t data = USART0 . RXDATAL ; // read received data byte
if (! CMD_compl ) { // command still incomplete?
if ( data != 'n' ) { // not command end?
CMD_buffer [ CMD_ptr ] = data ; // write received byte to buffer
if ( CMD_ptr < ( CMD_BUF_LEN - 1 )) CMD_ptr ++ ; // increase and limit pointer
} else if ( CMD_ptr ) { // received at least one byte?
CMD_compl = 1 ; // set command complete flag
CMD_buffer [ CMD_ptr ] = 0 ; // write string terminator
CMD_ptr = 0 ; // reset pointer
}
}
}
// Wait for, read and parse command string
void CMD_read ( void ) {
while (! CMD_compl ) updateLoadSensors (); // maintain fan control
uint8_t i = 0 ;
cmd = CMD_buffer [ 0 ];
argument1 = 0 ; argument2 = 0 ;
while ( CMD_buffer [ ++ i ] == ' ' );
while ( CMD_buffer [ i ] > ' ' ) argument1 = argument1 * 10 + CMD_buffer [ i ++ ] - '0' ;
while ( CMD_buffer [ i ] == ' ' ) i ++ ;
while ( CMD_buffer [ i ] != 0 ) argument2 = argument2 * 10 + CMD_buffer [ i ++ ] - '0' ;
CMD_compl = 0 ;
}DEVICE=attiny814 PROGRMR=serialupdi PORT=/dev/ttyUSB0 make install لتجميع ، وحرق الصمامات وتحميل البرامج الثابتة (تغيير جهاز ، progrmr والمنفذ وفقًا لذلك). يجب تثبيت Python على جهاز الكمبيوتر الخاص بك من أجل استخدام تطبيق Python المستند إلى واجهة المستخدم الرسومية. معظم توزيعات Linux تشمل هذا بالفعل. يمكن لمستخدمي Windows متابعة هذه التعليمات. بالإضافة إلى ذلك ، يجب تثبيت Pyserial و Tkinter (8.6 أو الأحدث). ومع ذلك ، تم تضمينها بالفعل في معظم منشآت Python.
قد يحتاج مستخدمو Windows أيضًا إلى تثبيت برنامج تشغيل لـ CH330N/CH340N USB إلى المحول التسلسلي. هذا ليس ضروريًا لمستخدمي Linux أو Mac.
يمكن تشغيل الجهاز بطريقتين:
| يأمر | وظيفة |
|---|---|
| "أنا" | ينقل سلسلة المسافة البادئة ("محلل الطاقة") |
| "الخامس" | ينقل رقم إصدار البرنامج الثابت |
| "x" | إنهاء برنامج الاختبار الحالي |
| "s loadcurrent [ma] " | قم بتعيين الحمل على تيار ثابت من Tovercurrent |
| "ص" | أعد ضبط الحمل إلى الحد الأدنى |
| "ر" | اقرأ التيار والجهد لكل من المستشعرات ونقلها |
تم ترخيص هذا العمل بموجب ترخيص Creative Commons Attribution-ShareAlike 3.0 غير المبرر. (http://creativecommons.org/licenses/by-sa/3.0/)