Indice progetti PIC | Sito IK0WRB | Sito di Vinicio Coletti |
Tutta la barca è alimentata da un accumulatore al piombo da 6 V 4.0 Ah. La tensione a batteria
carica è di circa 6,7 Volt e ho quindi inserito, come unica regolazione della tensione, un diodo
in serie, che protegge il circuito da inversioni accidentali di polarità e fa cadere la tensione di
circa 0,7 V. I 6 V massimi risultanti, anche se un pò eccessivi per il PIC 16F84A (che non dovrebbe
eccedere 5,5 V), non danno alcun problema e la scheda funziona perfettamente.
L'oscillatore utilizzato è quello classico per i PIC, con un quarzo da 4 MHz e due condensatori,
per cui si ottiene un tempo di esecuzione per le istruzioni di 1 microsecondo.
La scheda controllo ha le seguenti connessioni e funzioni:
La funzione principale del programma che gira sul PIC è quella di misurare gli impulsi che arrivano dal
ricevitore radio, calcolando quindi la velocità desiderata, che viene impostata attraverso adeguati
impulsi pwm (pulse width modulation) sull'alimentazione del motore.
Ma è forse bene ricorda innanzitutto come funziona un radiocomando proporzionale. Se abbiamo a che fare,
come nel mio caso, con un trasmettitore a 4 canali, esso avrà di solito due leve, ognuna con movimento
orizzontale e verticale, per un totale di 4 comandi, appunto. Il trasmettitore legge la posizione di
ogni leva e trasmette di continuo la seguente sequenza:
Quando arriva l'inizio di un impulso TTL, viene generato un interrupt sulla porta B e la routine di servizio
dell'interrupt si limita a salvare il valore corrente di Timer0. Quanto l'impulso finisce viene generato
un secondo interrupt e questa volta la routine calcola la differenza tra il valore corrente di Timer0 e quello
salvato, la memorizza in una variabile ed attiva un flag di validità.
Nel loop principale del programma, quando viene rivelato il flag di validità per il canale 2 attivato,
una subroutine azzera il flag, legge la durata dell'impulso, la elabora per produrre il valore da
utilizzare per la pwm in output ed inoltre attiva o disattiva il relay che controlla la direzione del
movimento.
Quanto Timer0 va in overflow (ogni circa 4 ms, visto che ho impostato il prescaler a 16x) se il valore
pwm non è zero, il motore è attivato. Quando poi nel loop principale viene rivelato un valore di Timer0
superiore al valore pwm impostato, il motore viene spento. La frequenza degli impulsi pwm è quindi di
250 Hz, forse un valore un po' troppo basso, ma comunque funzionale.
Timer0 viene anche utilizzato per incementare alcuni contatori "lenti", usati in altre parti del programma.
Ad esempio, quando mancano interrupt sulla porta B per circa 1 secondo, ciò indica l'assenza del segnale
dal radiocomando e quindi il motore viene spento. Il programma quindi ricerca nuovi impulsi stabili
e, quando arrivano, viene ripresa la normale elaborazione.
Per pilotare l'uscita motore utilizzo 4 pin della porta B in parallelo, per avere una corrente di 80
mA. Questa corrente va sulla base di un transistor 2N3055, la cui uscita va sulle basi di altri 3
transistor 2N3055 connessi in parallelo. Ho utilizzato questa configurazione super-Darlington semplicemente
perché avevo a disposizione un modulo usato, con 4 2N3055 montati su un dissipatore e quindi
pronti all'uso.
La prima versione del programma aveva un difetto piuttosto serio: il motore non era mai completamente
fermo, neanche quando la leva era in posizione perfettamente centrale e c'erano sempre degli impulsi
errati che portavano brevemente il motore al massimo dei giri. Tutti i controlli sul programma furono
assolutamente inutili, finché non pensai bene di andarmi a rileggere i manuali Microchip, sul funzionamento
degli interrupt della porta B. Mi resi così conto che quando modificavo lo stato del motore, scrivendo
sulla porta B, facevo partire degli interrupt errati, perché la scrittura sulle porte di I/O implica
anche una loro lettura automatica!
Purtroppo avevo già costruito e testato il circuito, altrimenti probabilmente avrei utilizzato un pin
della porta A ed un transistor, come output. E' bastato però modificare in modo adeguato il programma,
sostituendo alla semplice istruzione clrf PORTB per fermare il motore, il seguente blocco:
Lo stesso metodo è utilizzato quanto il motore viene attivato. Più economico di un transistor, direi.
bcf INTCON,RBIE ; disabilita interrupt su PORTB clrf PORTB ; ferma motore movf PORTB,f ; rilegge PORTB per eliminare discordanza dei pin bcf INTCON,RBIF ; azzera PORTB interrupt flag, nel caso si sia attivato bsf INTCON,RBIE ; abilita di nuovo interrupt su PORTB
Al di fuori della scheda di controllo
- 1x Microchip PIC 16F84 (o 16F84A), 18 pin DIP
- 1x zoccolo da 18 pin per integrati
- 1x transistor 2N5320 (o simile)
- 1x diodo 1N4002
- 1x LED rosso
- 1x LED bianco ad alta luminosità
- 1x quarzo da 4 MHz
- 2x condensatori da 27 pF
- 1x resistenza 56 Ohm, 1/4 W
- 1x resistenza 62 Ohm, 1/2 W
- 1x resistenza 470 Ohm, 1/4 W
- 1x resistenza 810 Ohm, 1/4 W
- 1x resistenza 4.7 KOhm, 1/4 W
- 2x resistenze 100 KOhm 1/4 W
- 9x punti di connessione
- 4x transistor 2N3055, montati su un dissipatore
- 1x relay 30 A a due scambi (ho usato due relay separati da 10 A, 3 scambi)
- 1x diodo 1N5406
Indice progetti PIC | Sito IK0WRB | Sito di Vinicio Coletti |