เครื่องวิเคราะห์พลังงานเป็นโหลดดัมมี่กระแสไฟฟ้าคงที่อิเล็กทรอนิกส์ที่ตั้งโปรแกรมได้พร้อมกับแรงดันไฟฟ้าด้านข้างสูงสองตัวและเซ็นเซอร์ปัจจุบันสำหรับการวิเคราะห์โดยอัตโนมัติของการจ่ายไฟตัวแปลง DC/DC ตัวควบคุมแรงดันไฟฟ้าแบตเตอรี่เครื่องชาร์จผู้บริโภคพลังงานและอื่น ๆ อุปกรณ์สามารถควบคุมได้ผ่านอินเตอร์เฟส Serial USB โดยใช้จอภาพอนุกรมหรือ Python Skripts ที่ให้ไว้ ข้อมูลสามารถส่งออกไปยังโปรแกรมแผ่นกระจายหรือวิเคราะห์โดยตรงโดย Python Skript
วงจรควบคุมโหลดอิเล็กทรอนิกส์ซึ่งประกอบด้วยแอมพลิฟายเออร์ปฏิบัติการ MOSFET และตัวต้านทาน shunt ทำให้มั่นใจได้ว่ากระแสกระแสเดียวกันโดยไม่คำนึงถึงแรงดันไฟฟ้าที่ใช้
เพื่อจุดประสงค์นี้การแบ่ง100mΩประกอบด้วยตัวต้านทาน300mΩสามตัวพร้อมกันสำหรับการกระจายความร้อนที่เหมาะสมตั้งอยู่ในวงจรโหลดผ่านที่วัดกระแสไฟฟ้า Opamp LMV321 Rail-to-Rail เปรียบเทียบกับค่าเป้าหมายซึ่งระบุโดย Digital Internal Digital to Analog Converter (DAC) ของ Attiny ผ่านตัวแบ่งแรงดันไฟฟ้าและควบคุมประตูของ IRL540N ระดับลอจิก MOSFET ซึ่งจะปรับเปลี่ยนกระแสไฟฟ้าภายใน
แรงดันไฟฟ้าและกระแสไฟฟ้าถูกวัดผ่านตัวต้านทาน8MΩ shunt ที่เชื่อมต่อกับ INA219 ที่มีความละเอียด 4MV/1MA INA219 ที่สองเชื่อมต่อกับตัวต้านทาน8mΩ shunt อีกตัวระหว่างเทอร์มินัล PWR-in และ PWR-out INA219 เป็นมอนิเตอร์ shunt และพลังงานในปัจจุบันที่มีอินเตอร์เฟสที่เข้ากันได้กับI²C อุปกรณ์ตรวจสอบทั้งแรงดันไฟฟ้าลดลงและแรงดันไฟฟ้าของบัสด้วยเวลาแปลงที่ตั้งโปรแกรมได้และการกรอง ค่าการสอบเทียบที่ตั้งโปรแกรมได้รวมกับตัวคูณภายในช่วยให้สามารถอ่านค่าได้โดยตรงของกระแสในแอมแปร์ ความต้านทานการปัดที่เลือกไว้ที่8mΩช่วยให้ทั้งสองมีอิทธิพลต่อวงจรและการวัดด้วยความละเอียด 1mA สำหรับการวัดที่แม่นยำควรเลือกตัวต้านทานแบบแบ่งที่มีความอดทนต่ำ (1% หรือดีกว่า)
เครื่องวิเคราะห์พลังงานเชื่อมต่อผ่าน USB ไปยังพีซีหรือ RaspberryPi คำสั่งไปยังเครื่องวิเคราะห์สามารถส่งผ่านจอภาพอนุกรมหรือโดย Python Skript ที่ใช้ GUI เครื่องวิเคราะห์มีอัลกอริทึมการทดสอบอัตโนมัติในตัวที่แตกต่างกัน ข้อมูลที่รวบรวมจะถูกส่งกลับผ่านอินเตอร์เฟสอนุกรม/USB ไปยัง PC/RaspberryPi ATTINY814 วัดพลังงานและอุณหภูมิของฮีทซิงค์อย่างต่อเนื่อง มันควบคุมพัดลมและตัดโหลดเมื่ออุณหภูมิร้อนเกินไป
ATTINY814 ควบคุมการโหลดแบบจำลองอิเล็กทรอนิกส์ด้วยตัวแปลงดิจิตอลภายในแบบอะนาล็อก (DAC) ภายใน แรงดันอ้างอิงภายใน 5 รายการทั้งหมดถูกนำมาใช้เพื่อให้ได้ความแม่นยำสูงสุดและความละเอียดของ DAC DAC เชื่อมต่อกับ opamp ซึ่งทำหน้าที่เป็นแอมพลิฟายเออร์ Unity Gain ที่ควบคุมความต้านทานของ 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-to-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 เพื่อรวบรวมเผาฟิวส์และอัปโหลดเฟิร์มแวร์ (อุปกรณ์เปลี่ยน, โปรแกรมและพอร์ตตามลำดับ) ต้องติดตั้ง Python บนพีซีของคุณเพื่อใช้แอปพลิเคชัน Python ที่ใช้ GUI การแจกแจง Linux ส่วนใหญ่รวมอยู่แล้ว ผู้ใช้ Windows สามารถทำตามคำแนะนำเหล่านี้ได้ นอกจากนี้จะต้องติดตั้ง pyserial และ tkinter (8.6 หรือใหม่กว่า) อย่างไรก็ตามสิ่งเหล่านี้รวมอยู่ในการติดตั้ง Python ส่วนใหญ่แล้ว
ผู้ใช้ Windows อาจจำเป็นต้องติดตั้งไดรเวอร์สำหรับ USB CH330N/CH340N ไปยังอะแดปเตอร์อนุกรม สิ่งนี้ไม่จำเป็นสำหรับผู้ใช้ Linux หรือ Mac
อุปกรณ์สามารถทำงานได้สองวิธี:
| สั่งการ | การทำงาน |
|---|---|
| "ฉัน" | ส่งสตริงการเยื้อง ("เครื่องวิเคราะห์พลังงาน") |
| "V" | ส่งหมายเลขเวอร์ชันเฟิร์มแวร์ |
| "x" | ยุติโปรแกรมทดสอบปัจจุบัน |
| "s loadcurrent [ma] " | ตั้งค่าโหลดเป็นกระแสคงที่ของ loadcurrent |
| "R" | รีเซ็ตโหลดเป็นขั้นต่ำ |
| "T" | อ่านกระแสและแรงดันไฟฟ้าของเซ็นเซอร์ทั้งสองและส่งผ่าน |
งานนี้ได้รับใบอนุญาตภายใต้ใบอนุญาต Creative Commons Attribution-Sharealike 3.0 Unported (http://creativeCommons.org/licenses/by-sa/3.0/)