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:


      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