| 
 ![[Photo of the Author]](../../common/images/Guido-S.gif)  Guido Socher (homepage)
 
 L'autore:
 
 Guido adora Linux non solo per il fatto che sia divertente scoprire le
    grandi possibilità di questo sistema, ma anche per le persone che sono
    coinvolte nel suo sviluppo. 
 Tradotto in Italiano da:
 Toni Tiveron <toni(at)amicidelprosecco(dot)com>
 
 Contenuto:
 | 
 
Un alimentatore in CC basato su microcontrollore
 ![[Illustrazione]](../../common/images/article251/dcpower-logo.gif) 
Premessa:
    Questo è il quarto articolo della serie presentata su LinuxFocus inerente il microcontrollore AT90S4433. Vi suggerisco
    di leggere i precedenti articoli che trattano del microcontrollore della
    Atmel:
    
- Come installare ed utilizzare l'ambiente di sviluppo e costruire l'
      hardware necessario alla programmazione del microprocessore:
 Marzo 2002,
      Programmare il microcontrollore AVR con GCC
- Come creare il vostro circuito stampato:
 Un pannello di controllo LCD
      per il vostro server Linux
- Come costruire un contenitore per il vostro alimentatore:
 Settembre 2002, Un frequenzimetro da 1Hz a
      100MHz, munito di un display LCD ed una interfaccia RS232
L'elemento più importante per i vostri 'lavoretti' domestici è un buon
    alimentatore in corrente continua. In questo articolo andremo a costruirne
    uno. Sarà gestito da un micocontrollore. Avrà un piccolo display LCD, e
    potrete pilotarlo da remoto con Linux per mezzo della porta seriale.
    Ha anche un design sobrio ma efficace.
    Questo articolo ci dimostrerà quanto versatili siano i Microcontrolli.
    Tuttavia quello che andremo a costruire non sarà il circuito più semplice
    della serie.
    Se state cercando un semplice alimentatore in corrente continua potete dare
    un'occhiata all'articolo 
    "Un semplice alimentatore in CC". Questo semplice alimentatore è ottimo
    per delle modeste necessità, come spesso richiedono i circuiti presentati su :
    LinuxFocus. È da precisare che questo semplice
    alimentatore non ha nulla a che fare con Linux e con il software.
    Anche se andrete a costruire il "semplice alimentatore in CC" potete
    ugualmente leggere questo articolo ed apprendere molte cose interessanti sui
    microcontrollori.
    
_________________ _________________ _________________
 
     
Introduzione
    Questo alimentatore CC è basato su di un circuito che non è certo dei più
    semplici ma, vi posso assicurare che il tempo che vi dedicherete non lo
    rimpiangerete. È molto affidabile e robusto. Esso è anche molto interessante
    dal punto di vista tecnico in quanto vi spiegherà come costruire un
    alimentatore controllato da microprocessore che generi una tensione
    analogica senza ricorre ad un integrato-convertitore DA.
    
    Vi serviranno molti componenti per questo articolo ma la maggior parte è
    economica e di facile reperibilità. L'alimentatore in sè non è
    particolarmente costoso.
     
Quello che vi serve
    Date un'occhiata alla lista dei componenti
    per avere le idee chiare su cosa vi serva di preciso. Potete veder
    anche i componenti nel seguente schema elettrico. 
 Il nostro
    alimentatore è disponibile in 3 varianti. A parte il trasformatore ed
    una resistenza le uniche modifiche sono di tipo software. Tutto il
    resto dei componenti non varia per le tre versioni:
    
      - 0-16V Imax=2.2A
 acquistate un trasformatore da 15V 2.5A
- 0-24V Imax=2.2A
 acquistate un trasformatore da 24V 2.5A
- 0-30V Imax=3A
 acquistate un trasformatore da 30V 3A
In tutti e 3 i casi avrete bisogno anche di un piccolo trasformatore
ausiliario da 9V 100mA per alimentare il circuito di controllo.Schema elettrico e circuito stampato
    Ho utilizzato eagle per Linux
    per la creazione dello schema elettrico e del circuito stampato. I file
    in formato eagle sono inclusi nel file tar.gz assieme al software. Lo
    potete scaricare alla fine dell'articolo. 
     
    Il circuito è diviso in due parti. Una parte principale ed una parte
    che si situa vicino ai transistor di potenza. Qui potete vedere i due
    schemi elettrici delle due parti, che verranno interconnessi per mezzo
    di spezzoni di cavo elettrico.
     
     Lo schema elettrico della sezione principale (un click sull'immagine
     per avere l'immagine più grande):
     ![[circuito base]](../../common/images/article251/schematic_th.gif) 
 
     
     Lo schema elettrico della sezione ad alta potenza (un click sull'immagine
     per avere l'immagine più grande):
     ![[circuito di potenza]](../../common/images/article251/schematic_powerpart_th.gif) 
 
     Come collegare i pulsanti nella matrice di comando (un click sull'immagine
     per avere l'immagine più grande):
     ![[I pulsanti e la loro matrice]](../../common/images/article251/push_buttons_schematic_th.gif) 
    
     
     Il circuito di controllo visto dal lato componenti un click sull'immagine
     per avere l'immagine più grande):
     ![[il circuito principale]](../../common/images/article251/linuxDCpower_board_white_th.jpg) 
 
     
     
    La basetta è studiata per una creazione di tipo amatoriale. I livello
    di colore blu è l'unico che deve essere utilizzato per la
    creazione del circuito stampato. Le linee in rosso sono degli
    spezzoni di filo usati per creare dei ponti, questo per
    semplificare la creazione della basetta stessa, non essendo
    necessaria l'incisione su due lati ed una accurata precisione.
    Dovreste stendere gli spezzoni di filo in modo che questi
    risultino essere il più corti possibile. Con Eagle non sono riuscito a
    creare le traiettorie migliori.
     
    I componenti della parte ad alta potenza possono essere
    tranquillamente assemblati su di una basetta millefori. La basetta
    principale e quella di potenza sono interconnesse con degli
    spezzoni di cavo (JP2 e JP3). Potete anche notare che il cavo di
    massa della parte principale si collega al positivo dell'uscita in
    CC. Questo è corretto, ed è anche il motivo per cui abbiamo
    bisogno di due trasformatori distinti per la parte logica di
    controllo e l'amplificatore di potenza.
     
Come funziona il tutto.
    Dando un'occhiata allo schema elettrico principale potete notare
    come il tutto sia costituito da due parti logiche. Una è
    contrassegnata nello schema come "current control" (sezione di
    controllo della corrente) e l'altra come "voltage control"(
    sezione di controllo della tensione). Queste sono due sezioni
    indipendenti di controllo. Il circuito di controllo della corrente
    si basa sulla differenza di tensione ai capi di un resistore di 0.
    274 Ohm. La caduta di tensione ai capi di questo componente è
    proporzionale all'assorbimento. Le due sezioni di controllo sono
    poi combinate per mezzo dei diodi D2 e D3. Questi due diodi
    costituiscono una porta OR logica. Mi spiego: se la corrente
    risulta essere troppo alta, la parte che soprassiede all'
    erogazione della tensione riduce il voltaggio fino a che non
    scende sotto il limite. Diversamente, ovvero se la corrente non è
    troppo elevata, la parte che supervisione la tensione ha il
    compito di regolare costantemente la tensione. 
    
    Questa porta logica OR riesce a funzionare in quanto il transistor
    T3 è connesso alla tensione di +5V per mezzo della resistenza R19.
    Se non ci fosse alcun amplificatore operazionale collegato ai
    capi di D2 e D3 avreste la massima tensione in uscita. L'operazionale
    nel circuito di controllo regola l'uscita riducendo
    la tensione di +5V dal transistor T3 (ne abbassa la tensione
    portando il più possibile verso massa). 
    
    Il circuito di controllo che supervisiona alla tensione, regola
    l'uscita secondo il livello di tensione presente al pin 5
    dell`IC6B. Mi spiego, la tensione presente su questo pin è pari
    alla tensione in uscita moltiplicata per il fattore determinato
    dalla terna di resistori R15, R10 e R16. La stessa cosa avviene
    per la corrente, solo che in questo caso, il resistore di
    calibrazione è costituito da R30, che equivale alla massima
    corrente. 
    
    Per ottenere la massima corrente o per regolare l'uscita dell'alimentatore
    dobbiamo solo fornire la corretta alimentazione ai due punti di
    potenza (pin 5 dell'IC6B ed al resistore R30). Questo è quanto fa
    il microcontrollore... ma come è in grado di generare e regolare
    propriamente una tensione di riferimento in corrente continua?
    Date un'occhiata al seguente schema: 
    
      ![[pwm]](../../common/images/article251/lowpass.gif) 
    
    
    Quello che potete notare in questo schema è come un segnale ad
    impulsi possa essere trasformato in un segnare in corrente
    continua. Tutto quello che si deve fare è far transitare il
    segnalsegnalee attraverso un filtro passa-basso con una frequenza di
    cut-off  di circa 100 volte (o più) della frequenza del segnale.
    Dato che il nostro micrconotollore lavora ad una frequenza di
    4MHz, risulta abbastanza semplice costruire questo genere di
    filtro passa-basso. Anche se implementassimo il segnale via
    software otterremo comunque una frequenza di qualche KHz ed il
    filtro risulterebbe ancora molto compatto e semplice. 
    
    La differenza tra lo schema in alto e quello in basso viene
    definita come modulazione in ampiezza d'impulso (PWM). Variando
    la lunghezza degli impulsi possiamo cambiare la tensione all'uscita
    del filtro. 
    
    Carino vero?? Già... possiamo generare una precisa tensione in
    corrente continua partendo da un segnale digitale! 
    
    Il microcontrollore AT90S4433 ha due contatori interni. Uno di
    1bit di ampiezza ed uno di 8bit. Il contatore a 16bit ha la
    possibilità di lavorare in PWM, che viene quindi implementata in
    maniera hardware all'interno dell'AT90S4433 con una risoluzione
    di 10bit. Il contatore ad 8bit non ha questa funzionalità, ma
    possiamo emularla ed implementarla per mezzo del software. Sarà
    ancora sufficientemente veloce. Utilizzeremo il contatore a 16bit
    per la regolazione della tensione, ottenendo una definizione di
    1023 passi (10bit sono, difatti, pari a 1023). Il controllo della
    corrente in uscita viene demandato al contatore ad 8bit, che ci
    permetterà di ottenere 155 passi di controllo della corrente (da 1
    a 3000 mA). Questo significa che avremmo una precisione dell'ordine
    di circa 12mA. Questo è un valore più che sufficiente per un
    controllo in corrente di un alimentatore. 
    
    Tutto il resto della componentistica nel circuito serve per
    l'alimentatore e per generare la nostra tensione di riferimento (il
    circuito integrato 7805, è difatti il nostro elemento di
    riferimento) e per garantire che il nostro alimentatore non si
    comporti in maniera impropria all'accensione o allo spegnimento.
     
Il software
    Il software per il microcontrollore utilizza molti degli aspetti
    che dovreste avere già appreso dai precedenti articoli (uart per
    le porte seriali rs232, display LCD, contatori ed modalità di
    interrupt). Potete dare un'occhiata qui:
    linuxdcp.c.
    
    
    La parte più interessante probabilmente è il circuito PWM (Pulse
    Width Modulation - modulazione ad ampiezza d'impulso). La
    variabile ipwm_phase, congiuntamente a ipwm_h gestisce la
    tecnologia PWM per quel che concerne la parte della sezione di
    potenza in corrente. Possiamo gestire il contatore ad 8bit in
    modalità interrupt ogni qualvolta si genera un overflow,
    chiamando la funzione "SIGNAL(SIG_OVERFLOW0)". A questo punto si
    valuterà se la variabile ipwm_phase debba produrre un valore di 0
    o di 1 come responso della verifica prima di far ripartire il
    timer.
    
    Il software non è per nulla complesso ma per riuscirlo a
    comprendere appieno è importante comprendere perfettamente il
    data sheet del 4433 (date una occhiata a fine articolo, nella
    sezione della bibliografia per la documentazione appena citata).
    
    Il 4433 è un microporcessore ad 8bit e quindi la sua capacità
    matematica è assai limitata. Le funzioni divXbyY e multiXbyY
    richiedono una implementazione ad almeno 24bit per poter
    calcolare la corretta ampiezza d'impulso, partendo dalla tensione
    definita dall'utente. 
    
    Il nostro alimentatore ha 7 pulsanti. 6 di questi servono per
    aumentare e ridurre corrente e tensione ed il settimo lo
    utilizziamo per mettere l'unità nello stato di standby. Nello
    stato di standby potete temporaneamente spegnere l'alimentatore e
    cambiare i limiti della corrente e della tensione. Lo stato dei
    pulsanti viene ciclicamente rilevato dal ciclo continuo del
    programma principale. La variabile ignorebutton viene utilizzata
    per evitare il bouncing dei pulsanti. Questo in quanto, quando le
    vostre dita andranno a premere il pulsante non saranno fermissime
    e potrebbero generare più impulsi. Come esseri umani non lo
    notiamo, ma il nostro microcontrollore è talmente veloce nell'
    eseguire le operazioni che rivelerebbe questa imperfezione. La
    variabile ignorebutton ignora per una frazione di tempo lo stato
    del pulsante alla pressione, per evitare questo tremolio.
     
La creazione del circuito stampato
    
      
        | La scheda principale: 
 ![[main board]](../../common/images/article251/dcpower-mainbrd_th.jpg)  | 
      
        | Il contenitore. Legno sulle pareti, un foglio di metallo
        per la parte dei pulsanti, il fondo ed il coperchio: 
 ![[contenitore]](../../common/images/article251/dcpower-box_th.jpg)  | 
      
        | Il pannello frontale: 
 ![[facciata]](../../common/images/article251/dcpower-frontpanel_th.jpg)  | 
    
    Il pacchetto software contiene al suo interno un file PostScript
    (linuxDCpower.ps) per il circuito stampato. Dal mio punto di vista,
    trovo che le piazzole di saldatura siano un poco troppo piccole.
    Vi consiglio di ingrandirle con un pennarello per incisioni. Il
    procedimento per realizzare un circuito stampato lo potete trovare
    nell'articolo Un pannello di
    controllo LCD per il vostro server Linux.
Per costruire un
    economico ma funzionale contenitore per il vostro alimentatore
    potete leggere l'articolo 
    Un frequenzimetro da 1Hz a 100MHz, munito di un display LCD ed una
    interfaccia RS232. Potete vedere il contenitore ed il pannello
    frontale come li ho fatti io. Potete clickkare sull'immagine per
    vederla ingrandita.
     
Verifica di funzionamento
    Come ogni circuito che, viene realizzato in maniera hobbistica, è
    bene non venga direttamente collegato ad una fonte a piena
    potenza. Vi consiglio quindi, di collegarlo ad una fonte di
    alimentazione più ridotta, per effettuare un test in maniera più
    sicura. Questo al fine di trovare difetti che si possono aver
    generato durante l'assemblaggio del medesimo. 
    
      - Assemblate la basetta principale con tutti i componenti ma
      non inserite gli integrati negli zoccoli.
- Utilizzate una batteria da 9Volt. Collegate il positivo
      della medesima al pin2 ed il negativo al pin1 del connettore che
      ha come nome AC_POWER nello schema elettrico. Con un multimetro
      controllate di avere +5V sui piedini 8 e 16 dell'integrato
      max232 e sui piedini 8 e 7 del microcontrollore. Sul pin di
      alimentazione dell'operazionale dovrete avere all'incirca 9Volt.
- Ora invertite la polarità della batteria (collegate il
      positivo al pin 1 e il negativo al pin 2) e verificate che ci
      siano all'incirca 9volt sul piedino dell'alimentazione negativa
      dell'integrato operazionale.
- Se queste verifiche hanno avuto esito positivo potete
      inserire gli integrati nei relativi zoccoli (tranne
      l'operazionale).
- Ricorrete ancora alla batteria da 9volt e collegatela in
      modo da avere l'alimentazione a 5Volt. Collegate il
      programmatore alla porta parallela per mezzo del cavo.
 Scompattate il software (per scaricarlo consultante la fine
      dell'articolo), entrate nella cartella che si è creata e
      digitate:
 make avr_led_lcd_test.hex
 make testload
 make ttydevinit
 
 Ora il software di test ciclicamente esser caricato nel circuito.
      Sul display LCD dovreste leggere "hello", il LED rosso dovrebbe
      lampeggiare e se il vostro computer è collegato all'interfaccia
      rs232 dovreste vededer una serie di "ok" (inizializzate la linea
      seriale con il comando ttydevinit, e osservatene il responso con
      cat /dev/ttyS0, se lo avete collegato alla porta COM1, e cat
      /dev/ttyS1, se lo avete collegato a COM2).
- Ora assemblate il circuito di potenza ma non collegate
      ancora il trasformatore di potenza. Collegate invece la batteria
      a 9Volt ai cavi che sarebbero, normalmente, collegati al
      trasformatore. Non importa la polarità della batteria, in ogni
      caso il condensatore da 4700 microfarad si dovrebbe caricare a
      circa 9Volt. Controllate questo valore con un VoltMetro.
- Quando anche l'ultimo test ha avuto esito positivo,
      collegate il trasformatore con i relativi cavi ed alimentatelo.
      Senza l'integrato operazionale, dovreste avere all'uscita
      dell'alimentatore la massima tensione possibile. Misurate questa
      tensione, ma prestate attenzione a non generare dei corto-
      circuiti, che andrebbero a danneggiare irrimediabilmente i
      transistor di potenza, in quanto non vi è ancora alcuna
      limitazione alla massima corrente erogabile.
- Spegnete tutto ed inserite l'amplificatore operazionale e
      collegate nuovamente il cavo di programmazione, alimentate e
      digitate:
 make
 make load
 
- Ora l'alimentatore dovrebbe essere completamente funzionante.
      Vi prego di notare che fintatoché il cavo di programmazione è
      collegato l'uscita dell'alimentazione è imprecisa. Scollegate
      questo cavo per ottenere una alimentazione stabile e precisa.
Eccoci alla fine: Il nostro alimentatore
    Come avrete visto precedentemente vi sono 3 possibili opzioni, che
    dipendono dal trasformatore che andrete ad utilizzare. Il software
    è nominalmente configurato per la tensione di 16Volt e 2.2Ampere.
    Per cambiare questa tensione dovrete modificare il file linuxdcp.c
    cerando le stringhe:
    MAX_U, IMINSTEP, MAX_I, e nella funzione set_i dovrete cambiare il
    valore per avere un massimo di 3Ampere. Il codice è ben commentato
    e vi trovate i cambiamenti da apportare. 
    
    Ora potrete vedere alcune fotografie dell'alimentatore che io ho
    costruito. Ho impiegato del tempo, ma direi che ne è valsa la pena,
    dato che ho ottenuto un alimentatore robusto. Il tempo lo
    considero ben investito, in quanto, un alimentatore da laboratorio
    è uno degli strumenti più utilizzati. 
    
    
      ![[vista frontale]](../../common/images/article251/dcpower-final_frontview_th.jpg)
      
      ![[vista superiore]](../../common/images/article251/dcpower-final_topview_th.jpg) 
    
     
Utilizzare l'alimentatore
    È probabilmente molto ovvio come si utilizzi questo alimentatore.
    Avete 4 pulsanti per regolare la tensione d'uscita. Due pulsanti
    per incrementare o ridurre di 1Volt e due per 0.1Volt. La
    limitazione in corrente si può gestire con gli altri 2 pulsanti.
    Qui il fattore di incremento/decremento non è in scala lineare:
    per piccoli valori i passi sono di 50mA, per valori superiori ai
    200mA sono di 100mAe per valori superiori all'Ampere sono di 200mA.
    Per questa ragione è semplice variare la limitazione con solo due
    pulsanti. 
    Il pulsante di standby può essere utilizzato per spegnere
    momentaneamente l'alimentatore senza aver poi la necessità di
    configurare nuovamente i valori impostati. 
    Il LED rosso si accenderà quando avrete superato il limite di
    carico in corrente e lampeggerà quando sarà in modalità stand-by. 
    L'alimentatore può anche essere completamente controllato per mezzi
    di comandi ascii inviati presso la porta seriale rs232. Questi
    sono i comandi utilizzabili:
    u=X per definisce la tensione (e.g u=105 porta la
    tensione a 10.5V)
    i=Xmax definisce la massima corrente (e.g i=500 posta il massimo
    assorbimento a 500mA)
    s=1 or s=0 lo porta in modalità stand-by
    u=? or i=? or s=? ci va vedere lo stato e le configurazioni.
    Questo produce un responso di questo tipo:
    u: 50 s:0 i: 100 l:0
    u: tensione pari a 5V, s:0 l'unità è operativa (non in modo stand-
    by), i: 100 significa massima corrente a 100mA, e l:0 ci dice che
    non è mai stato raggiunto il limite di carico.
    Per mezzo di questi semplici comandi ascii sarete anche in grado
    di creare una interfaccia grafica per questo alimenansegnaletatore. Per
    poter utilizzare la linea seriale la dovrete inzializzare con il
    comando ttydevinit, che è incluso nel pacchetto software. Questo
    comando è stato descritto nell'articolo 
    Settembre 2002, Un frequenzimetro da 1Hz a 100MHz, munito di un
    display LCD ed una interfaccia RS232.
    Come avrete notato nello schema elettrico noi utilizziamo 2
    trasformatori ed il segnale di massa (prelevato dall'
    alimentazione ad alta tensione, è collegato al positivo
    dell'uscita del nostro alimentatore. I due trasformatori isolano
    le varie tensioni e, quindi, non vi sono di norma problemi con
    questa configurazione. Sono dovuto ricorrere a questa
    configurazione per avere la corretta polarità nel circuito di
    ritorno dell'amplificatore operazionale.
    Una piccola avvertenza: questa configurazione implica
    anche che la linea di massa della porta rs232 è collegata
    all'uscita positiva dell'alimentatore. In parole povere NON
    potrete utilizzare la linea seriale se volete utilizzare l'
    alimentatore con altri apparati che in qualche modo siano
    collegati alla linea di terra del vostro impianto e quindi, per
    mezzo di quest'ultima, anche al vostro computer. Potrebbe esser
    una buona idea applicare una etichetta che rechi questa
    avvertenza. Se volete essere completamente sicuri si non creare
    alcun cortocircuito, vi consiglio di ricorrere all'uso di un
    computer portatile alimentato a batterie, o siate sicuri che il
    circuito che andrete ad alimentare non ha alcun collegamento con
    il vostro impianto di terra, oppure non collegate l'alimentatore
    alla linea seriale mentre alimentate l'apparato. Non siate troppo
    turbati da questo avvertimento. Se non supererete l'intensità
    massima di 250mA, il LED rosso vi avvertirà immediatamente se
    qualcosa non funzionasse correttamente, ed, in questo caso, il
    vostro computer non subirà alcun danno se commetterete degli
    errori.
     
Sicurezza
    Il circuito contiene dei trasformatori che sono collegati alla
    linea di alimentazione di casa vostra (220Vo 110V, a seconda del
    paese in cui vi trovate), quindi verificate che il tutto sia
    correttamente isolato. Se non avete mai avuto a che fare con
    alimentatori, chiedete a qualcuno che abbia una maggiore
    esperienza affinché controlli il vostro operato per quel che
    concerne la sicurezza d'uso e l'isolamento del tutto. Questo
    prima che voi colleghiate il circuito all'impianto elettrico di
    casa vostra.
     
Ottimizzazione
    Il software per il controllo dell'alimentatore è già di per sè
    calibrato, Nella maggior parte dei casi non dovrete cambiare
    nulla. La calibrazione dal punto di vista hardware dipende solo
    da pochi componenti: 7805, R15, R10, R16, R38,R30 e R26. Sono
    solo questi che influenzano la tensione e la corrente. Se volete
    effettuare una perfetta ottimizzazione potete cambiare questi
    resistori o modificare il software. Vi ricordo anche che il cavo
    per la programmazione influenza la precisione dell'alimentatore.
    Prima di effettuare qualsiasi misura, vi consiglio di scollegare
    questo cavo. Nel software potete apportare dei cambiamenti alle
    sezioni set_u e set_i. Il codice linuxdcp.c è
    sufficientemente commentato.
     
Riferimento e bibliografia
    
    
  
 
Discussioni su quest'articolo
ogni articolo possiede una sua pagina di discussione, da questa pagina puoi inviare un commento o leggere quelli degli altri lettori:
2002-12-27, generated by lfparser version 2.29