Penganalisa daya adalah beban boneka arus konstan elektronik yang dapat diprogram dengan dua tegangan sisi tinggi dan sensor arus untuk analisis otomatis catu daya, konverter DC/DC, regulator tegangan, baterai, pengisi daya, konsumen daya dan lainnya. Perangkat ini dapat dikontrol melalui antarmuka serial USB menggunakan monitor serial atau Skrips Python yang disediakan. Data dapat diekspor ke program lembar spread atau secara langsung dianalisis oleh Python Skrip.
Sirkuit kontrol beban elektronik, yang pada dasarnya terdiri dari penguat operasional, MOSFET dan resistor shunt, memastikan bahwa arus yang sama mengalir terlepas dari tegangan yang diterapkan.
Untuk tujuan ini, shunt 100mΩ yang terdiri dari tiga resistor 300mΩ secara paralel untuk disipasi panas yang tepat terletak di sirkuit beban, di mana arus diukur. LMV321 Rel-to-Rail Opamp membandingkan ini dengan nilai target, yang ditentukan oleh konverter digital internal ke analog (DAC) melalui pembagi tegangan dan karenanya mengontrol gerbang mosfet tingkat logika IRL540N, yang pada gilirannya menyesuaikan arus melalui ketahanan internal yang ditetapkan dengan cara ini.
Tegangan dan arus diukur melalui resistor shunt 8mΩ sisi tinggi yang terhubung ke INA219 dengan resolusi 4MV/1MA. InA219 kedua terhubung ke resistor shunt 8mΩ lainnya antara terminal PWR-in dan PWR-Out. INA219 adalah shunt saat ini dan monitor daya dengan antarmuka yang kompatibel dengan I²C. Perangkat ini memantau tegangan tegangan dan tegangan pasokan bus, dengan waktu konversi dan penyaringan yang dapat diprogram. Nilai kalibrasi yang dapat diprogram, dikombinasikan dengan pengganda internal, memungkinkan pembacaan langsung arus di ampere. Resistansi shunt yang dipilih dari 8mΩ memungkinkan pengaruh yang sangat kecil pada sirkuit dan pengukuran dengan resolusi 1MA. Untuk pengukuran yang akurat, resistor shunt dengan toleransi rendah (1% atau lebih baik) harus dipilih.
Penganalisa daya terhubung melalui USB ke PC atau raspberrypi. Perintah kepada penganalisa dapat dikirim melalui monitor serial atau oleh Python Skrip yang berbasis GUI. Analisis memiliki algoritma uji otomatis bawaan yang berbeda. Data yang dikumpulkan dikirim kembali melalui antarmuka serial/USB ke PC/raspberrypi. Attiny814 terus -menerus mengukur daya dan suhu heatsink. Ini mengontrol kipas dan memotong beban saat suhu menjadi terlalu panas.
Attiny814 mengontrol beban boneka elektronik dengan konverter digital ke analog (DAC) internal. Semua 5 tegangan referensi internal digunakan untuk mendapatkan akurasi maksimum dan resolusi DAC. DAC terhubung ke Opamp yang bertindak sebagai penguat gain persatuan yang mengendalikan resistensi 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
}Perintah yang dikirim melalui konverter USB-ke-serial disimpan dalam buffer perintah 16-byte. Ini dilakukan melalui interupsi sehingga beban dan kontrol kipas, misalnya, dapat terus berjalan secara paralel. Segera setelah perintah telah sepenuhnya diterima, bendera CMD_COMPT diatur. Parser kemudian mengekstraksi perintah dan argumen.
// 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 untuk dikompilasi, membakar sekering dan mengunggah firmware (ubah perangkat, progrmr dan port yang sesuai). Python perlu diinstal pada PC Anda untuk menggunakan aplikasi Python berbasis GUI. Sebagian besar distribusi Linux sudah termasuk ini. Pengguna Windows dapat mengikuti instruksi ini. Selain itu pyserial dan tkinter (8.6 atau lebih baru) harus diinstal. Namun, ini sudah termasuk dalam sebagian besar instalasi Python.
Pengguna Windows mungkin juga perlu menginstal driver untuk USB CH330N/CH340N ke Serial Adapter. Ini tidak diperlukan untuk pengguna Linux atau Mac.
Perangkat dapat dioperasikan dengan dua cara:
| Memerintah | Fungsi |
|---|---|
| "Saya" | Mentransmisikan string indentification ("Power Analyzer") |
| "V" | mentransmisikan nomor versi firmware |
| "X" | Hentikan program pengujian saat ini |
| "S LoadCurrent [MA] " | atur beban ke arus konstan loadCurrent |
| "R" | Setel ulang beban ke minimum |
| "T" | Baca arus dan tegangan kedua sensor dan mengirimkannya |
Karya ini dilisensikan di bawah Lisensi Creative Commons Attribution-Sharealike 3.0 yang tidak diportir. (http://creativecommons.org/licenses/by-sa/3.0/)