Abbiamo visto cosa c'è da muovere, adesso bisogna programmare il PIC per farlo, iniziamo elencando i compiti principali, poi vediamo cosa ne nasce:
pilotaggio del circuito a ponte "H" per i motori
pilotaggio degli circuiti di comando scambi e relè
Tutto qui?
Si
Per il primo punto, parlando di cose fatte in casa, potevo usare qualcosa che avevo già largamente usato e fornito ad amici: un circuito molto semplice ma efficace con l' NE555 (clicca qui), ma abbiamo un problema in più: il percorso dei binari è diviso in due grandi sezioni che devono essere indipendenti, e nel passaggio tra una e l'altra c'è il rischio del corto-circuito se le polarità non sono rispettate. C'è anche un'altra cosa: transitando da una sezione all'altra, se gli impulsi, anche di larghezza diversa, non sono in fase, il treno può fare un "salto" accelerando mentra si trova "a cavallo" delle due sezioni: mentre un alimentatore è "basso" l'altro è "alto": comanda sempre chi è "alto", quindi siamo sempre al massimo; se invece i due alimentatori sono in fase, comanda solo quello impostato per la velocità maggiore.
Per avere due PWM in fase, la soluzione più semplice è quella di generare i treni d'onda con un processore: lui ne genererà i due fronti di salita nello stesso istante e poi la larghezza/durata può essere meggiore per l'uno o per l'altro, comunque saranno sempre in fase e vedremo che non sarà difficile farlo.
Ma c'è un altro piccolo problemino: come fa il PIC a sapere quanto larghi devono essere gli impulsi?
Mi serve dirglielo in qualche modo, con DUE input indipendenti.
Per il secondo punto occorrono diverse considerazioni:
visto che si tratta di circuiti che con due fili possono ricevere due comandi in funzione della polarità o non riceverne nessuno, bisogna escogitare il modo corretto di pilotarli in termini di cablaggio e di tempo; questo vuol dire individuare un modo semplice per comandare la matrice di fili che "vede" i circuiti di pilotaggio
questo "modo semplice" (vedremo che lo è davvero) mi risolve il problema "lato uscite", ok, ma se io-ferroviere devo comandare uno scambio per deviare il percorso di un treno, mi servirà un "linguaggio" e una interfaccia manuale e ottica per dire al PIC quale output voglio pilotare,
questa interfaccia sarà costituita da un "keypad" a 16 tasti e un display 4Rx20C, occorre gestire anche questi,
a questo si somma un controllo dei tempi di azionamento: non abbiamo pulsanti che portano corrente fintanto che sono premuti e smettono quando sono rilasciati (a meno che non siano rotti), quindi bisogna attuare un tempo "ON" che duri un certo "TOT" per essere sicuri che la meccanica segua l'elettronica e poi passare a "OFF" per evitare che, alla lunga, la parte ELETTRICA defunga bruciando (quante lampadine ci hanno già tristemente abbandonato....).
Riassumiamo un po' le cose per capire, a grandi linee, da quali "blocchi" di getione sarà costituito il software:
Startup del sistema
Tempistica di sistema
Potenziometri interdipendente ma insieme agli
Invertitori di marcia
Comando scambi e relè
Controllo input "keypad" interagente con il
Controllo display
Lo startup del sistema è un po' come il bootstrap e l'avviamento di un PC: si devono preprarare un po' di cose prima di dare il controllo al programma "vero e proprio"
La "Tempistica di sistema", che dagli anglofoni potreste sentir nominare come "System clock management", si occupa di produrre tutti gli "impulsi", ed i tempi tra uno e l'altro, che realizzano poi la corretta sequenza degli eventi che vogliamo noi, in pratica è QUESTO il cuore del sistema.
Come si fa ad avere un "System clock management" che faccia quello che ci serve?
Non è immediato, ma neanche troppo difficile; in pratica dobbiamo "pensarla" in questo modo:
andiamo a cercare nel nostro (futuro) progetto finito quale è l'intervallo di tempo più breve che passa tra due eventi software IDENTICI o, meglio: tra due ripetizioni cicliche dello stesso evento: se si trattasse della simulazione di un orologio a sei cifre (ore, minuti e secondi) sarebbe l'intervallo di UN SECONDO che passa tra un aggiornamento del disply e il successivo.
Nel nostro caso dobbiamo essere più rapidi, come vedremo la frequenza non sarà 1Hz, bensì oltre i TREMILA (3200, come vedremo), nella prossima pagina vedremo che non è un problema raggiungere e TENERE queste velocità; e sorge subito un altra domanda: va bene avere un clock veloce, ma se a me serve ANCHE un clock di 2 Hz (un colpo ogni mezzo secondo), come faccio?
Senza scendere nei dettagli, il principio è questo: il mio clock PIU' VELOCE sarà in qualche modo un multiplo dei clocks più lenti che mi servono: nel caso dei 2Hz, ad esempio, ogni 1600 colpi del clock più veloce faccio in modo di attivare il pezzo di programma che deve funzionare ogni mezzo secondo.
Se mi serve che un certo evento accada 25 volte al secondo (non chiedetemi cosa possa essere) mi basterà attivare il programma che genera questo evento ogni 128 colpi del clock più veloce; non ci credete ?
3200 / 25 = 128 vuol dire che in un secondo ci sono 3200 clock principali, e il 25 sta 128 volte nel 3200, quindi...
Il problema è capire come si realizza un clock, qualunque sia la sua frequenza, e come ci si può collegare a questo clock per rispettarne i tempi; a questa domanda rispondo in questo modo:
Il PIC contiene uno (o più, a seconda del modello) temporizzatori che generano un impulso quando "scade" un certo contatore che viene "portato a zero" da una serie CONTINUA di impulsi generata, attraverso un divisore programmabile, a partire dal generatore a quarzo che fa funzionare tutta la CPU, e il quarzo lo decidiamo noi e lo saldiamo NOI vicino al PIC.
Se poi volete un "assaggio" di come fa il clock a "comandare" il resto, date un'occhiata QUI, basta che, al posto del pulsante di STOP mettiate l'impulso di clock e, al posto del micro-programma di arresto ci immaginiate un mini-programma di Vostra invenzione, per il resto la logica è UGUALE.
Il modo di programmare il divisore non ve lo spiego, qui, caso mai mi mandate una email e io Vi rispondo, innanzitutto inviandoVi, sempre via email e GRATUITAMENTE la copia di un libercolo che scrissi anni addietro (ma che MAI fu pubblicato) a corredo di un corso-PIC per pochi intimi (qualcuno fu contento), poi cercherò di impostare le spiegazioni "ad personam" sul problema specifico da risolvere, OK?
Se volete contattarmi, non fatevi scrupoli: cliccate QUI
Per avere un'idea di come funziona un generatore PWM realizzato a software cliccate qui, poi per sapere cosa è l'interrupt (nei microprocessori e nei micro controllori) potete cliccare qui, altrimenti, per lo sviluppo del software, dal controllo del PWM a come azionare gli scambi e tutto il resto, vi consiglio questi primi tre link (sempre roba MIA e si aprono tutti in una nuova finestra) che spiegano un po' le cose dei PIC in generale:
Cos'è l'interrupt
Definizione di interrupt
Due compiti contemporanei
e questi tre link che scendono nei dettagli della nostra ferrovia:
T&GV Operating System - prima puntata
T&GV Operating System - seconda puntata
T&GV Operating System - terza puntata