電源分析儀是可編程的電子恆定電流載荷負載,具有兩個高側電壓和電流傳感器,用於自動分析電源,直流/直流轉換器,電壓調節器,電池,充電器,電源消費者等。可以使用串行監視器或提供的Python Skripts通過USB串行接口來控制該設備。可以將數據導出到散佈表程序,也可以通過Python Skript直接分析。
電子負載控制電路基本上由操作放大器,MOSFET和分流電阻組成,可確保與使用的電壓相同的電流流量。
為此,由三個300MΩ電阻並聯以適當散熱的100MΩ分流位於負載電路中,通過該電路測量電流。 LMV321軌道軌道OPAMP將其與目標值進行比較,目標值由Attiny的內部數字到模擬轉換器(DAC)通過電壓分隔器指定,並因此控制IRL540N邏輯電平MOSFET的門,從而通過其內部電阻設置了IRL540N的邏輯水平電平MOSFET。
電壓和電流通過連接到INA219的高側8MΩ分流電阻,分辨率為4MV/1mA。第二個INA219連接到PWR-IN和PWR-OUT端子之間的另一個8MΩ分流電阻。 INA219是具有I²C兼容接口的當前分流器和電源監視器。該設備可以通過可編程轉換時間和過濾器來監視分流電壓滴和總線電源電壓。可編程校準值與內部乘數結合使用,可以直接讀取Amperes中的電流。所選的8MΩ的分流電阻使電路的影響很小,也可以通過1ma分辨率的測量值產生了很小的影響。為了進行準確的測量,應選擇具有低公差(1%或更高)的分流電阻。
電源分析儀通過USB連接到PC或RaspberryPi。可以通過串行顯示器或基於GUI的Python Skript發送到分析器的命令。該分析儀具有不同的內置自動測試算法。收集的數據通過串行接口/USB發送回PC/RaspberryPi。 Attiny814不斷測量散熱器的功率和溫度。當溫度太熱時,它控制風扇並切斷負載。
Attiny814用其內部數字到模擬轉換器(DAC)控制電子虛擬負載。為了獲得DAC的最大準確性和分辨率,它的所有5個內部參考電壓都被使用。 DAC連接到OPAMP,該操作員充當控制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到串行轉換器發送的命令存儲在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和端口)。 需要在PC上安裝Python,以便使用基於GUI的Python應用程序。大多數Linux發行版已經包括此。 Windows用戶可以遵循這些說明。另外,必須安裝pyserial和tkinter(8.6或更新)。但是,這些已包含在大多數Python裝置中。
Windows用戶可能還需要為串行適配器安裝CH330N/CH340N USB的驅動程序。這對於Linux或Mac用戶不是必需的。
該設備可以通過兩種方式操作:
| 命令 | 功能 |
|---|---|
| “我” | Transmits縮進字符串(“電源分析儀”) |
| “ V” | 傳輸固件版本編號 |
| “ x” | 終止當前測試程序 |
| “ s loadCurrent [ma] ” | 將負載設置為負載電流的恆定電流 |
| “ R” | 將負載重置為最低 |
| “ T” | 讀取傳感器的電流和電壓並傳輸它們 |
這項工作是根據創意共享歸因 - 共享3.0未體育許可證的許可。 (http://creativecommons.org/licenses/by-sa/3.0/)