Power Analyzer는 전원 공급 장치, DC/DC 컨버터, 전압 조정기, 배터리, 충전기, 전력 소비자 및 기타의 자동 분석을위한 두 개의 높은 측면 전압 및 전류 센서가있는 프로그래밍 가능한 전자 상수 전류 더미 부하입니다. 장치는 직렬 모니터 또는 제공된 Python Skripts를 사용하여 USB 직렬 인터페이스를 통해 제어 할 수 있습니다. 데이터는 스프레드 시트 프로그램으로 내보내거나 Python Skript에 의해 직접 분석 될 수 있습니다.
본질적으로 작동 증폭기, MOSFET 및 분로 저항으로 구성된 전자 부하 제어 회로는 적용된 전압에 관계없이 동일한 전류가 흐르도록합니다.
이를 위해, 적절한 열 소산을 위해 평행하게 3 개의 300mΩ 저항으로 구성된 100mΩ 션트는 전류가 측정되는 하중 회로에 위치하고 있습니다. LMV321 Rail-to-Rail Opamp는이를 대상 값과 비교하는데, 이는 전압 분배기를 통해 Attiny의 내부 디지털-아날로그 변환기 (DAC)에 의해 지정된 대상 값을 비교하고 이에 따라 IRL540N 논리 레벨 전력 MOSFET의 게이트를 제어하여 내부 저항을 통해 전류를 조정합니다.
전압 및 전류는 4MV/1MA의 해상도로 INA219에 연결된 높은 8mΩ 션트 저항을 통해 측정됩니다. 두 번째 INA219는 PWR-In 및 PWR-Out 단자 사이의 또 다른 8mΩ 션트 저항에 연결됩니다. INA219는 I²C 호환 인터페이스를 갖춘 현재 분로 및 전력 모니터입니다. 이 장치는 프로그래밍 가능한 변환 시간 및 필터링으로 션트 전압 강하 및 버스 공급 전압을 모두 모니터링합니다. 내부 승수와 결합 된 프로그래밍 가능한 교정 값은 암페어에서 전류의 직접 판독을 가능하게합니다. 8mΩ의 선택된 션트 저항은 회로에 매우 작은 영향을 미치고 1mA의 해상도로 측정 할 수 있습니다. 정확한 측정의 경우, 내성이 낮은 션트 저항 (1% 이상)을 선택해야합니다.
전원 분석기는 USB를 통해 PC 또는 Raspberrypi에 연결됩니다. 분석기에 대한 명령은 직렬 모니터 또는 GUI 기반 Python Skript를 통해 보낼 수 있습니다. 분석기마다 내장 자동 테스트 알고리즘이 있습니다. 수집 된 데이터는 직렬 인터페이스/USB를 통해 PC/RaspberryPi로 다시 전송됩니다. Attiny814는 히트 싱크의 전력과 온도를 지속적으로 측정합니다. 팬을 제어하고 온도가 너무 뜨거워지면 하중을 차단합니다.
Attiny814는 내부 디지털 - 아날로그 변환기 (DAC)로 전자 더미 하중을 제어합니다. DAC의 최대 정확도와 해상도를 얻기 위해 5 개의 내부 참조 전압이 모두 사용됩니다. DAC는 OPAMP에 연결되어 MOSFET의 저항을 제어하는 Unity Gain 증폭기 역할을합니다.
// 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 (변경 장치, Progrmr 및 포트에 따라). GUI 기반 Python 응용 프로그램을 사용하려면 Python을 PC에 설치해야합니다. 대부분의 Linux 배포에는 이미 포함되어 있습니다. Windows 사용자는 다음 지침을 따라갈 수 있습니다. 또한 Pyserial 및 Tkinter (8.6 이상)를 설치해야합니다. 그러나 이것들은 이미 대부분의 Python 설치에 포함되어 있습니다.
Windows 사용자는 CH330N/CH340N USB에 직렬 어댑터에 드라이버를 설치해야 할 수도 있습니다. Linux 또는 Mac 사용자에게는 필요하지 않습니다.
장치는 두 가지 방법으로 작동 할 수 있습니다.
| 명령 | 기능 |
|---|---|
| "나" | 계약 문자열을 전송합니다 ( "파워 분석기") |
| "다섯" | 펌웨어 버전 번호를 전송합니다 |
| "엑스" | 현재 테스트 프로그램을 종료하십시오 |
| "S 하중 전류 [MA] " | 하중 전류 의 일정한 전류로 하중을 설정하십시오 |
| "아르 자형" | 부하를 최소로 재설정하십시오 |
| "티" | 두 센서의 전류 및 전압을 읽고 전송하십시오. |
이 작업은 Creative Commons Attribution-Sharealike 3.0 Unported License에 따라 라이센스가 부여됩니다. (http://creativecommons.org/licenses/by-sa/3.0/)