FirstBot Proyect

> First Bot Project
> Studio teorico/pratico

> | <--Indietro | Inizio | Avanti--> |

> Venerdi' 1-3-2002
> IL cervello.

> Come elemento logico di controllo del bot ho scelto di usare un microcontrollore PIC16F877 cloccato a 20Mhz. Questo integrato dispone di 8Kwords di spazio per il programma su memoria flash riprogrammabile in-circuit (lo si puo' programmare gia' montato nel bot), 33 pin di ingresso/uscita e 5 mips di potenza elaborativa. Inoltre i pin RC1 e RC2 possono emettere due segnali PWM generati in hardware in grado di comandare il circuito driver dei motori.

> Per la programmazione ho previsto una spinetta a 5 terminali (ICSP connector) da collegare al programmatore esterno, e 3 jumper di sezionamento (JP4 JP5 JP6) per isolare dal resto del circuito i pin Vcc RB6 e RB7 del PIC durante la programmazione stessa. Per le prime prove con il micro ho collegato un led sul pin RB5 da usare come "running led" (indicatore di attivita') o "debug led" (indicatore di stato o evento). Per verificare il corretto funzionamento ho fatto girare il seguente programma di test che fa semplicemente lampeggiare il led a circa 4Hz. Per facilitarmi la programmazione uso il mio file include "pwrasm.inc", contenente molte macroistruzioni che eseguono funzioni di livello un po' piu' alto rispetto al semplice assembler.

> Per alimentare il microcontroller, e gli altri circuiti analogici che penso di usare per i sensori di navigazione, ho aggiunto sul nuovo piano due regolatori di tensione, che abbassano i 12V provenienti dall'elevatore a 9 e 5V. Il motivo per cui non uso direttamente i 9V della batteria e' che questi non sono molto stabili e possono contenere molti disturbi, mentre riducendo i 12 sono sicuro di avere 9V perfettamente stabilizzati. I 5V li potevo prendere anche dal regolatore posto sulla base motori, ma questo alimenta gia' il driver di potenza e il sensore del gas e ho preferito alimentare il micro con un regolatore dedicato. |

> Sabato 2-3-2002
> I generatori PWM.
> Per pilotare i motori ho collegato le uscite dei moduli CCP1 e 2 ai segnali PWM1 e 2 del driver di potenza, e i pin RB6 e RB7 ai segnali di comando del senso di rotazione. Con questa configurazione i motori sono alimentati quando le uscite CCP1/CCP2 sono a 0 e disalimentati quando sono a 1, inoltre, per come li ho collegati, girano in avanti quando RB6 RB7 sono a 1, e indietro quando sono a 0.

> I segnali a onda quadra generati da CCP1 e CCP2 possono avere duty cycle differenti, ma la frequenza e' la stessa e viene determinata dal timer2 del PIC. In particolare questa viene determinata dalla frequenza del clock, dal fattore di divisione del prescaler del timer2 e dal valore scritto nel registro PR2:

> Periodo T = (PR2+1) * 4 * PeriodoClock * FattorePrescaler

> Per esempio ho provato con PR2=127 e prescaler impostato per una divisione per 16 ottenendo T=0,4096mS, pari a circa 2240Hz.

> A questo punto e' possibile impostare per quanto tempo l'uscita di un modulo CCP deve rimanere a 1 all'interno del periodo T, questo si ottiene scrivendo un valore a 10 bit negli appositi registri dei moduli CCP1 e CCP2:

> Periodo Ton = Valore * PeriodoClock * FattorePrescaler

> Per ottenere un duty dello 0% (uscite sempre a 0) il valore deve essere=0, per ottenere un duty del 100% (uscite sempre a 1) si deve scrivere un valore paria a (PR2+1)*4. Valori piu' grandi tengono comunque le uscite sempre a 1.

> Per il modulo CCP1 i registri in cui scrivere il valore per Ton sono CCPR1L e CCP1CON<5:4> (i bit 5 e 4 di CCP1CON contengono i 2 bit meno significativi), per il modulo CCP2 sono CCPR2L e CCP2CON<5:4>.

> Nel nostro caso, in cui i motori sono alimentati quando le uscite CCP1 CCP2 sono a 0, quello che ci interessa e' in realta' regolare Toff, che si ottiene semplicemente facendo T - Ton. In pratica se voglio alimentare i motori con un duty del 70%, allora Ton dovra' durare 100-70=30% di T. Per semplificare la regolazione di Toff e' il caso di tenere i 2 bit meno significativi sempre a 1, e lavorare su CCPR1L / CCPR2L solo con valori a 8 bit, quanto piu' sono piccoli questi valori tanto piu' veloci girano i motori (eventuali differenze sulla velocita' di rotazione si possono correggere modificando questi valori).

> Riepilogando, per attivare le uscite PWM occorre:

> - Rendere uscite i pin RC1 e RC2 resettando i bit TRISC<2:1>
> - Impostare il valore di PR2 per scegliere la frequenza
> - Impostare i valori di Ton scrivendo nei registri CCPR1L / CCPR2L / CCP1CON<5:4> / CCP1CON<5:4>
> - Impostare il fattore di divisione del prescaler scrivendo nei bit T2CON<1:0>
> - Attivare il timer2 settando il bit T2CON<2>
> - Abilitare i moduli CCP a generare il PWM settando i bit CCP1CON<3:2> / CCP2CON<3:2>

> Ldf PORTB,11000000B ;predispone valore nei latch di uscita
> Ldf PORTC,00000110B ;predispone valore nei latch di uscita
> Bank1
> clrf TRISB ;porta B tutte uscite
> clrf TRISC ;porta C tutte uscite
> Bank0
> Ldf PORTB,11000000B ;scrive valori di riposo (marcia avanti)
> Ldf PORTC,00000110B ;scrive i valori di riposo (fermo)

> Bank1
> Ldf PR2,127 ;imposta frequenza circa 2240 Hz
> Bank0
> Ldf CCPR1L,35 ;imposta Ton modulo CCP1
> Ldf CCPR2L,20 ;imposta Ton modulo CCP2

> Ldf T2CON,00000110B ;prescaler /16 e attiva timer2

> movlw 00111100B
> iorwf CCP1CON,f ;abilita CCP1 per il PWM (e bit <5:4> a 1)
> iorwf CCP2CON,f ;abilita CCP2 per il PWM (e bit <5:4> a 1)

> A questo punto ho provato a scrivere delle primitive per il controllo motori come avall (avanti tutti), stopdx (ferma il destro), indsx (indietro il sinistro) ecc... e a realizzare una semplice sequenza preprogrammata di movimenti: test_moving_02.txt (il risultato lo si puo' vedere nel seguente filmato .mov per quiktime).

> moving.zip (3Mbytes)

> Noto comunque la tendenza a non andare dritto anche se ho cercato di regolare la velocita' delle ruote regolando i duty cycles dei motori, in particolare sembra che in alcuni momenti non ben ripetibili il bot tenda improvvisamente a sterzare...

> | <--Indietro | Inizio | Avanti--> |

> Pagina, disegni e foto realizzati da Claudio Fin - Ultimo aggiornamento 20-3-2002