Monitoraggio della corrente USB per evitare sovraccarichi

Ecco una protezione intelligente per porte USB, per evitare problemi di sovraccarico. L'idea di questo progetto è nata durante la sperimentazione di alcuni circuiti alimentati con i 5 V dalla porta USB del computer. Per un problema circuitale, il sistema operativo si è bloccato, avvertendo l'utente con il messaggio di errore "Potenza hub USB superata" e resettando l'elaboratore. Occorreva, dunque, uno strumento che indicasse eventuali problemi di sovraccarico e non spegnere immediatamente l'alimentatore se i limiti fossero stati superati. La protezione del computer è messa al primo posto.

Introduzione

La potenza massima dichiarata di 500 mA, di una porta USB del computer, non è sempre rispettata e in genere non esiste una protezione sufficiente. Lo sviluppo di questo progetto è svolto in due fasi. Il prototipo originale utilizza più schede circuitali composte da diversi elementi singoli, tutti collegati tramite connettori maschio e femmina. La prima versione è creata in Eagle e progettata in modo tale che le schede possano essere fabbricate utilizzando una piastra di rame e una fresa. Successivamente, è stato creato un secondo layout utilizzando il programma CAD DesignSpark. Lo schema circuitale di questa versione finale è mostrato in Figura 2.

Particolarità hardware

Sono disponibili due interfacce, J4 e J5, cui è possibile collegare i dispositivi tramite la porta USB del PC. La connessione al computer avviene tramite K2 o K3, a seconda dei casi. In ogni caso viene utilizzato un INA219 di Texas Instruments [1] per la misurazione della corrente. Si tratta di un monitor di corrente e di potenza che utilizza l'interfaccia I2C e può essere letto in modo ciclico. Viene fornito un monitoraggio della corrente separato per ciascun canale USB. La tensione è misurata attraverso i resistori shunt R19 e R30, su cui scorre la corrente, che può essere facilmente calcolata. L'indirizzo I2C è definito da R22 a R25 e da R33 a R36.

Figura 1: il diagramma di flusso illustra la sequenza delle operazioni del microcontrollore

Figura 1: il diagramma di flusso illustra la sequenza delle operazioni del microcontrollore

La corrente sul carico può essere abilitata o disabilitata utilizzando i relè Re1 e Re3. La presenza dei fusibili F1 e F2 assicura la protezione da sovracorrente. La commutazione è controllata dal  microcontrollore U1. La resistenza di carico pin del relè NC viene utilizzata per fornire una maggiore stabilità di tensione per la conversione analogica eseguita dal microcontrollore, altrimenti potrebbero ottenersi valori errati se il relè non viene attivato. Questo resistore non è presente nella seconda versione del progetto. I relè Re2 e Re4 abilitano la tensione esterna a 5 V, invece di prenderla dal computer. Questa tensione viene applicata tramite J2 ed è erogata sul resto del circuito. Il cuore del sistema è il microcontrollore PIC18F6620 [2]. Utilizzando quattro LED (da LED1 a LED4), è possibile osservare lo stato del dispositivo ed eventuali avvertimenti o malfunzionamenti. Attraverso gli ingressi ADC AN1 e AN2, il microcontrollore misura le due tensioni fornite alle interfacce USB. Misura anche la tensione di J2 sull'ingresso AN0 (EXT_PWR). Per ognuna di queste tre misure si utilizza un divisore resistivo con un rapporto di 1:4 (da R13 a R18). Dividere per 4 è conveniente, perché il microcontrollore può calcolare i valori di tensione corretti con un'operazione di shift di due bit. Come riferimento di tensione è utilizzato un MAX6004 [3]. Questo dispositivo fornisce un riferimento di 4.096 V per il convertitore analogico digitale interno a 10-bit. I pulsanti da S1 a S5 sono controllati dal firmware attraverso gli interrupt. J1 è l'interfaccia di programmazione ICD (programmazione in-circuit), mentre JP1 mette a disposizione un'interfaccia UART a 5 V. Questa può essere usata per la comunicazione con il PC. I valori misurati sono visualizzati su un display LCD standard da 2x20 caratteri. Il controllo avviene tramite una connessione a quattro fili per i dati e tre linee di controllo (RS, R/W ed E). Il contrasto può essere regolato tramite R10.

Il firmware

Il firmware è stato scritto in C con l'IDX di MPLAB. La Figura 1 mostra il diagramma di flusso. All'avvio è necessario configurare il registro di calibrazione dell'INA219. Il sensore utilizza questi valori di calibrazione per calcolare i dati di corrente e di funzionamento. Nel Listato 1 si può osservare il metodo di calcolo. Per il progetto, il valore 5851 è scritto nel registro dei due INA219. I dati del sensore vengono letti ed elaborati ciclicamente dal microcontrollore. Se i valori limite predefiniti vengono superati, il microcontrollore deve disabilitare il flusso di corrente e riattivarlo solo quando l'utente attiva nuovamente il canale. Inoltre, il microcontrollore visualizza un avvertimento prima dello spegnimento. Nella routine d'inizializzazione, il valore di calibrazione viene scritto sui due dispositivi INA219. L'interfaccia seriale è configurata a 115.200 baud 8N1 e il timer per il task manager è impostato su 10 Hz. Inoltre, le ultime impostazioni sono memorizzate sulla EEPROM interna. L'EEPROM del controller contiene dieci posizioni per la memorizzazione dei valori. Ogni 100 ms il task manager avvia un nuovo completamento dell'attività, ad esempio il recupero e il controllo dei valori e la gestione dell'interfaccia utente. Nella routine, il conteggio del processo variabile viene aumentato a ogni ciclo. Le attività vengono assegnate ed elaborate tramite una istruzioni switch.

Listing 1. Calculation of the values for the
calibration register of the INA219
/* Calibration Register calculation according to
datasheet
* R-Shunt = 0R1
* V-BusMax 6V
* I - Max 2A2
* Min LSB = 2A2/32767 => 0.00006714
* Max LSB = 2A2/4096 => 0.0005371
* Choose an LSB in the range: Minimum_LSB
* Current_LSB = 0.00007
* Cal = trunc[0,04096/(Current_LSB * R-Shunt)] = 0.04096/(0.00007*0r1) => 5851
* Power_LSB = 20 * Current_LSB = 20 * 0.00007 = 0.0014
* Max_Current = Current_LSB * 32767 = 0.00007 * 32767 => 2.29369A
*/

Figura 2: lo schema elettrico della versione finale

Figura 2: lo schema elettrico della versione finale

Menu utente

La funzione application_run() viene processata dopo ogni esecuzione. All'interno di questa funzione è presente il menu utente. Esso è eseguito come una macchina a stati, in cui ogni voce ha la sua funzione. Per passare da un menu a quello successivo, basta spostare il puntatore della funzione da eseguire. Nel menu, i valori possono essere impostati singolarmente per l'attivazione di avviso o per rilevare malfunzionamenti o quando si verifica un guasto. Tale evenienza è indicata dai LED di stato. Se viene superato un valore di corrente, viene spento anche il rispettivo canale. L'output sul display è il seguente:

K 0000mV 0000mA on_off_X, in_ext_X

dove:

  • K = numero del canale (1 o 2);
  • 0000mV = indicazione della tensione attuale in mV;
  • 0000mA = indicazione della corrente attuale in mA;
  • on_off_X = avviso di canale abilitato o no;
  • in_ext_X = fonte di alimentazione del canale, interna o esterna.
Listing 2.
The Task Manager is the heart of the program.
/************************************************
/! \fn void tast_manager(void)
* \brief update the tasks
* \param none
* \exception none
* \return none
************************************************/
void task_manager(void){
    static uint8_t processcounter = 0;
    update_Status_Task();
    //Switch case for arranging task updates and organising
    switch(processcounter++){
        case 1:
        case 5:
        case 7:
        case 9:{
            //Generate update of measured values every 10 Hz
            update_measurements_task();
            break;
        }
        case 2:
        case 4:
        case 6:
        case 8:{
            //Check limits
            check_limits();
            break;
        }
        case 3: {
            update_displaystring();
            update_measurements_task();
            break;
        }
        case 10: {
            processcounter = 0;
            check_limits();
            break;
        }
    }
    application_run();
}

Downloads

Tutti i file del software relativi a questo progetto sono disponibili per il download.

[1] INA219 Datasheet: www.ti.com/product/INA219
[2] PIC18F6620 overview: www.microchip.com/wwwproducts/en/PIC18F6620
[3] MAX6004: www.maximintegrated.com/en/datasheet/index.mvp/id/1916

Web link

Articolo originale in inglese al link: Monitoring USB Current to Prevent Overloads

 

 

Scarica subito una copia gratis

Una risposta

  1. Gigio Di Gioia 15 Settembre 2020

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend