ESAME DI STATO 2008 TESINA PLURIDISCIPLINARE ALLIEVO: AGNOLETTO MAURO CL. 5°/ST A.S. 2007/08 Sistema Automatico Pompaggio Olio 1 Sistema automatico pompaggio olio Uso previsto Il sistema automatico di pompaggio è stato progettato per l’erogazione di olio utilizzando una pompa dinamica manuale per fluidi viscosi. Il sistema è stato progettato per uso industriale. Norme di sicurezza • Attenzione! Quando si adopera il sistema automatico, per ridurre il rischio di danni personali e materiali, è necessario osservare alcune precauzioni di sicurezza fondamentali. E’ quindi indispensabile leggere le istruzioni di seguito riportate e conservare questo manuale di istruzioni per successive consultazioni. Tener presenti le caratteristiche dell’ambiente di lavoro Non installare il sistema in ambienti esterni e sotto la pioggia. Tenere ben illuminata l’area di lavoro. Non utilizzare il sistema quando vi sia il rischio di provocare un incendio o una esplosione, per es. in luoghi con atmosfera gassosa o infiammabile. Installare ed alimentare il sistema seguendo i dati tecnici Un’istallazione inadeguata, effettuata da personale non danneggiamento del sistema. qualificato può provocare il Sicurezza elettrica Il sistema utilizza una tensione in corrente continua a 12 e 5 volt pertanto non ussistono rischi di folgorazioni. Funzioni Sul sistema sono presenti : 1. Tastiera alfanumerica 16 tasti 2. Display lcd retro illuminato 2 righe 16 colonne 3. Tasto reset emergenza sulla scheda principale 4. Scheda elettronica principale 5. Motore 12 Volt dc 6. Encoder 7. Alimentatore stabilizzato 12-5 volt 8. Cavo con filo schermato per l’eliminazione eventuali disturbi provenienti dall’encoder) Montaggio Il sistema di controllo pompa va installato il più lontano possibile dal fusto di olio. Il motore/encoder va installato in modo adeguato sulla pompa ad olio in modo da non interferire con gli organi meccanici e i cavi di controllo e alimentazione. Vedi figura B Accensione e spegnimento Per accendere e spegnere il sistema basta premere il pulsante posto sul retro dell’ alimentatore stabilizzato. Funzionalità dell’encoder L’encoder funziona correttamente quando, a motore azionato, i due led posti sulla scheda principale lampeggiano (fase di lettura posizione e giri del rotore). Dati tecnici • Tensione alimentazione scheda • Giri/min motore a vuoto(max velocità) • Rapporto giri motore/erogazione in litri • Quantità minima erogabile 5Vdc/0.7A 12 Vdc/8A 76 giri/min 16 giri/ litro 10 cl 2 • Quantità massima erogabile (per ciclo) 999 cl Sono riportati di seguito i componenti utilizzati sulla scheda principale Componente Value Device C1 C2.5/2 C2 18 pF CAPNP-2,5 C3 CAP-C4 C5 18 pF CAPNP-2,5 C6 1 µF CAPNP-5 D1 BYW51 BYW51 D2 BYW51 BYW51 D5 SRP100 SRP100 D6 1N4148 1N4148 IC1 PIC16F877P PIC16F877P IC2 ULN2003AN ULN2003AN IC4 ULN2004AN ULN2004AN M1 MOTORE1 MORSETTIERA M2 MOTORE2 MORSETTIERA M3 MORSETTIERA MORSETTIERA M4 Alimentazione 12 Volt MORSETTIERA M5 Ingresso 5 Volt MORSETTIERA M6 MORSETTIERA MORSETTIERA NMOS2 BUZ11-2 BUZ11 NMOS3 BUZ11-1 BUZ11 P1 PULSANTE PULSANTE Q4 20 MHz QUARZO R1 470 Ohm R_10 R2 R_10 R_10 R4 1 KOhm R_10 R6 10 K R_10 R7 1 KOhm R_10 R8 1k R_10 R9 10k R_10 R10 10k R_10 R11 1k R_10 R12 1K R_10 R13 1K R_10 R14 1K R_10 R15 1K R_10 R16 R_10 R_10 R17 10k POT-L T1 NPN-BD139 NPN-BD139 TAST1 TASTIERA-HEX U$1 LCD-DATA_IMAGE LCD-DATA_IMAGE U$2 CON_PROG_PIC CON_PROG_PIC U$3 LED_5 LED_5 U$6 LED_5 LED_5 Componenti principali Microcontrollore Transistor di potenza Tastiera Display Componenti utilizzati sull’encoder Componente 100NF FC1 FC2 IC1 M1 M2 R1 R2 R3 R4 Value Device 4093N MORSETTIERA MORSETTIERA 470ohm 220ohm 470ohm 220ohm C5/3 CNY70 CNY70 4093N MORSETTIERA MORSETTIERA R_10 R_10 R_10 R_10 3 Fotodiodo Trigger NAND Schema a blocchi del sistema Display Tastiera retroilluminazione Interfaccia di potenza Motore 1 Interfaccia di potenza CPU encoder Motore 2 encoder condizionamento cavo Interfaccia di linea Interfaccia di potenza condizionamento cavo Interfaccia di linea 4 Zoccolo connessione programmatore SCHEMA ELETTRICO SCHEMA ELETTRICO Lo schema elettrico e lo sviluppo dei master è stato realizzato con il programma di progettazione dei circuiti elettronici Eagle. Per realizzare la scheda finale ci sono voluti diversi tentativi e collaudi effettuando ogni volta le modifiche più opportune. La scheda elettronica di comando è costituita principalmente da un microcontrollore della microchip, il pic16f877A, un display lcd retroilluminato 2 righe 16 colonne, una tastiera esadecimale, due transistor di potenza mosfet BUZ10, due integrati per l’adattamento delle tensioni uln2004. Per il pilotaggio dei motori il microcontrollore ha a disposizione due uscite pwm. La tecnica pwm consente di modificare via software il duty cycle dell’ onda quadra che pilota il mosfet; ciò permette di regolare la tensione d’uscita di quest’ultimo da 0 a 12 volt con conseguente aumento o diminuzione della velocità del motore. 5 Di seguito sono indicati sulla scheda principale le varie uscite e i componenti utilizzati. Uscita motore 2 Transistor di potenza Contrasto display Uscita motore 1 Microcontrollore Alimentazione Led segnale encoder Connettore programmazione Ingressi segnali encoder 6 Reset Schema elettrico encoder Vista dei componenti montati sull’ encoder Il microcontrollore è stato programmato in “circuit programming” tramite un programmatore siglato PICkit2 della microchip; ciò permette una rapida programmazione del microcontrollore senza staccarlo dallo zoccolo. Il software è stato creato e modificato dopo vari tentativi utilizzando il sistema di sviluppo MPLAB. 7 Progettazione circuito stampato Ho utilizzato un circuito stampato presensibilizzato ( PCB ). Questo circuito è ricoperto da una sottile pellicola sensibile ai raggi ultravioletti e resistente alla soda caustica. FASE 1) PROGETTAZIONE:ho progettato con Eagle l’intero master FASE 2) FOTOINCISIONE: dopo aver stampato il master del progetto su acetato, ho sottoposto il circuito stampato ai raggi ultravioletti (inserendola nel bromografo) per un tempo di 2 minuti FASE 3) LAVAGGIO: finita la fotoincisione ho immerso la relativa scheda nella soda caustica , per togliere il film in eccesso sensibilizzato dai raggi UV. FASE 4) IMMERSIONE: dopo aver lavato la scheda, l’ho immersa nel cloruro ferrico per corrodere il rame in eccesso. FASE 5) FORATURA: tolta la scheda dal cloruro ho proceduto con la foratura. FASE 6) RASCHIATURA:ho raschiato con la paglietta il circuito stampato, lucidando il rame. FASE 7) ASSEMBLAGGIO E STAGNATURA:Ho inserito e stagnato tutti i componenti nella scheda. FASE 8) INSERIMENTO:ho installato gli integrati negli zoccoli saldati sullo stampato. FASE 9) Programmazione microcontrollore: creato il software con mplabide, il codice oggetto è stato scaricato nel microprocessore con l’uso del programmatore PICkit2 FASE 10) COLLAUDO: con il collaudo ho verificato, dando tensione, il corretto funzionamento del circuito. Procedura per l’uso della pompa a comando elettronico 1. All’ accensione del sistema viene visualizzato nel display il nome del progettista 2. Dopo 5 secondi premendo un qualsiasi tasto appare la schermata: ”SELEZIONA OLIO A o B” (A e B si riferiscono alle due uscite del sistema in quanto è in grado di comandare 2 pompe). La quantità minima erogabile è di 10 centilitri, quella massima è di 999 centilitri 8 3. Selezionato il tipo di olio A o B diamo la conferma con il tasto “S” oppure annulliamo con il tasto “N” 4. Successivamente appare la schermata: “DOSE CENTILITRI” 9 5. ora è possibile digitare la quantità da erogare in cl.( ad esempio 350 = 3,5 L); in caso di errori di digitazione è possibile cancellare premendo il tasto “#” 6. Digitata la quantità desiderata il motore inizia il suo ciclo azionando la pompa e nel display viene aggiornata costantemente la quantità di olio erogata ogni 25 centilitri fino a risultato ottenuto. (negli ultimi 2 giri il motore rallenta la sua corsa fino a fermarsi permettendo un erogazione più precisa) 7. Terminata l’erogazione appare la scritta:”TERMINATO” In caso di emergenza in qualsiasi momento è possibile arrestare il sistema premendo il tasto reset posto sulla scheda principale. Per regolare il contrasto del display è sufficiente agire con un piccolo cacciavite sul trimmer posto sulla scheda principale. 10 Gestione display LCD Il display LCD, prima di poter visualizzare i caratteri alfanumerici, deve essere opportunamente “istruito“ cioè programmato secondo quanto indicato dalle specifiche fornite dai costruttori. Fortunatamente si è imposto uno standard che evita di utilizzare diversi comandi per display di diverse case costruttrici. Per poter programmare il display LCD secondo la nostra esigenza, si tratta di esaminare nel foglio allegato, quali siano le istruzioni da utilizzare. Bisogna inoltre tener conto che l’ LCD dispone, oltre ad un bus ad 8 bit per inviare/leggere i dati, di tre segnali di controllo: R/W: questa linea, se bassa, consente di inviare dati o istruzioni al display. Se alta si possono leggere i dati memorizzati al suo interno. Poiché per noi è sufficiente scrivere dei dati o istruzioni, abbiamo collegato,nella demoboard, questa linea a massa. RS: questa linea, quando alta, informa il display che il dato presentato sul bus è, in codice ASCII, il simbolo da visualizzare. Se bassa, il dato presente sul bus è una istruzione E: mediante un impulso LHL fa acquisire al display quanto presentato sul bus . Si noti che le istruzioni, per poter essere eseguite correttamente dal display, hanno bisogno di un certo tempo. Abbiamo stabilito un tempo di 1 o 2 ms a seconda delle esigenze. La routine CONFIGURA_LCD viene utilizzata per programmare il display secondo queste richieste: i dati sono presentati in formato 8 bit le righe utilizzate sono 2 il formato del carattere è 5x10 punti il cursore non viene visualizzato durante la scrittura i caratteri riguardanti la quantità d’olio desiderata vengono presentati in forma lampeggiante (blink on ) ogni volta che si scrive un carattere il cursore avanza automaticamente verso destra il display viene ripulito ( cioè inizialmente non vengono presentati caratteri casuali ) il cursore è posto all’inizio della riga selezionata vengono inizializzate le aree di memoria che contengono i dati da visualizzare e i rispettivi codici Detto ciò risulta abbastanza semplice ( anche se un po’ laborioso ) utilizzare il display: le routine RIGA1 e RIGA2, che servono a scrivere dei caratteri sul display, danno atto di quanto affermato. Si noti che per gestire il display si utilizzano diverse routine che brevemente riassumiamo: DISPLAY: è utilizzata per inviare il dato al display e per generare l’impulso di abilitazione MS1: genera un ritardo di almeno 1 ms che serve al display per rispondere ai comandi HOME1 e HOME 2 riportano il cursore all’inizio delle righe 1 e 2. L’uso delle routine è consigliabile anche se il codice viene chiamato una sola volta in quanto il MAIN risulta di più facile comprensione. Viene riportata di seguito una parte di routine configurazione e invio dati al display: ;**********ROUTINE CONFIGURAZIONE LCD CONFIGURA_LCD BCF PORTC,6 ;PROGRAMMAZIONE LCD RS=0 MOVLW 0x38 ;DATI A 8 BIT - 2 RIGHE - FORMATO CARATTERE CALL DISPLAY MOVLW 0x0C ;DISPLAY ON - CURSORE OFF - BLINKING OFF CALL DISPLAY MOVLW 6 ;AVANZAMENTO AUTOMATICO CURSORE CALL DISPLAY MOVLW 1 ;PULISCI DISPLAY CALL DISPLAY CALL MS1 ;ULTERIORE RITARDO MOVLW 2 ;CURSORE INIZIO RIGA CALL DISPLAY CALL MS1 ;ULTERIORE RITARDO MOVLW 0x40 ;INDIRIZZO CGRAM CALL DISPLAY MOVLW 0X80 ;INDIRIZZO DDRAM CALL DISPLAY 11 RETURN ;**********ROUTINE INVIO DATI DISPLAY DISPLAY MOVWF PORTD ;PRESENTA DATO SU BUS LCD BSF PORTC,7 ;IMPULSO DI ABILITAZIONE LETTURA NOP BCF PORTC,7 CALL MS1 ;RITARDO 1 MS (CIRCA) RETURN ;**********ROUTINE COMANDO CURSORE INIZIO SECONDA RIGA HOME2 BCF PORTC,6 NOP MOVLW 0xC0 CALL DISPLAY RETURN ;**********ROUTINE COMANDO CURSORE INIZIO PRIMA RIGA HOME1 BCF PORTC,6 NOP MOVLW 0x80 CALL DISPLAY RETURN ;********** ROUTINE RITARDO MINIMO 1 MS MS1 CLRF MS LP_MS MOVLW 2 SUBWF MS,0 BTFSS STATUS,2 GOTO LP_MS RETURN ;**********ROUTINE AGNOLETTO CHE VISUALIZZA MESSAGGIO INIZIALE AGNOLETTO CALL HOME1 BSF PORTC,6 ;INVIA DATI MOVLW 'A' CALL DISPLAY MOVLW 'G' CALL DISPLAY MOVLW 'N' CALL DISPLAY MOVLW 'O' CALL DISPLAY MOVLW 'L' CALL DISPLAY MOVLW 'E' CALL DISPLAY MOVLW 'T' CALL DISPLAY MOVLW 'T' CALL DISPLAY MOVLW 'O' CALL DISPLAY MOVLW ' ' CALL DISPLAY MOVLW 'M' CALL DISPLAY MOVLW 'A' CALL DISPLAY MOVLW 'U' CALL DISPLAY MOVLW 'R' CALL DISPLAY MOVLW 'O' CALL DISPLAY MOVLW ' ' CALL DISPLAY CALL HOME2 BSF PORTC,6 ;INVIA DATI MOVLW ' ' CALL DISPLAY MOVLW ' ' CALL DISPLAY MOVLW 'C' CALL DISPLAY MOVLW 'L' CALL DISPLAY MOVLW 'A' CALL DISPLAY MOVLW 'S' 12 CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL RETURN DISPLAY 'S' DISPLAY 'E ' DISPLAY '' DISPLAY '5' DISPLAY 'a' DISPLAY '' DISPLAY 'S' DISPLAY ' T' DISPLAY ' E' DISPLAY '' DISPLAY Gestione tastierino esadecimale Analizzando lo schema elettrico della scheda principale e tenuto conto della struttura hardware del tastierino, si nota che la lettura di tale periferica può essere fatta portando a livello basso una colonna ( o una riga ) e fare la scansione ( lettura ) delle righe ( colonne ). Quando un tasto, che si trova sulla colonna suddetta, viene azionato, la riga corrispondente a questo tasto si trova a livello basso e come tale può essere letta. Configurando le colonne come ingressi e le righe come uscite, con opportuna scansione, si può stabilire il tasto azionato. Per leggere se è azionato uno dei tasti corrispondenti alla riga 1 ( tasti *, 0, #, D ), si porta RB0, collegato a tale riga, a livello basso, mentre RB1, RB2 e RB3 vengono posti a livello alto. Successivamente si interrogano gli ingressi (colonne ) da RB4 a RB7. Se essi sono alti significa che nessun tasto è azionato. Se invece un ingresso è basso significa che il tasto corrispondente a quella riga è azionato. Ad esempio, se viene trovato basso RB7 significa che il tasto azionato è *. Quando viene incontrato un livello basso, tramite una istruzione di salto, si va a caricare l’accumulatore con un codice che corrisponde ad un determinato tasto e si torna al programma chiamante che avrà cura di leggere l’accumulatore per stabilire il tasto azionato. Nel programma viene utilizzato anche il software che consente di eliminare i rimbalzi dei contatti. La logica seguita è la seguente: a) quando viene riconosciuto un livello basso su uno degli ingressi, si chiama una routine di ritardo di 20ms che consente di ignorare lo stato della periferica finché ci sono i rimbalzi. b) Trascorso tale tempo, si attende che il tasto venga rilasciato ( si testa se l’ingresso viene portato a livello alto ). c) Riconosciuto questo evento si richiama la routine di ritardo e si torna al MAIN. I valori restituiti al programma chiamante sono i seguenti: • • • • • • • • • • • Tasto 0 Tasto 1 Tasto 2 Tasto 3 Tasto 4 Tasto 5 Tasto 6 Tasto 7 Tasto 8 Tasto 9 Tasto A valore restituito valore restituito valore restituito valore restituito valore restituito valore restituito valore restituito valore restituito valore restituito valore restituito valore restituito 0 1 2 3 4 5 6 7 8 9 10 13 • • • • • Tasto B Tasto C Tasto D Tasto * Tasto # valore restituito valore restituito valore restituito valore restituito valore restituito 11 12 13 14 15 Il valore restituito viene utilizzato come puntatore per accedere alla tabella che contiene i codici ASCII dei singoli tasti. Viene riportata di seguito parte di routine per la lettura del tastierino esadecimale: TASTIERA MOVLW MOVWF BTFSS GOTO BTFSS GOTO BTFSS GOTO BTFSS GOTO B'00001110' PORTB PORTB,4 TASTOD PORTB,5 TASTOCANC PORTB,6 TASTO0 PORTB,7 TASTOAST ;SCANSIONE COLONNE ;PREMUTO D? ;PREMUTO #? ;PREMUTO 0? ;PREMUTO *? MOVLW MOVWF BTFSS GOTO BTFSS GOTO BTFSS GOTO BTFSS GOTO B'00001101' PORTB PORTB,4 TASTOC PORTB,5 TASTO9 PORTB,6 TASTO8 PORTB,7 TASTO7 ;SCANSIONE COLONNE MOVLW MOVWF BTFSS GOTO BTFSS GOTO BTFSS GOTO BTFSS GOTO B'00001011' PORTB PORTB,4 TASTOB PORTB,5 TASTO6 PORTB,6 TASTO5 PORTB,7 TASTO4 MOVLW MOVWF BTFSS GOTO BTFSS GOTO BTFSS GOTO BTFSS GOTO GOTO B'00000111' PORTB PORTB,4 TASTOA PORTB,5 TASTO3 PORTB,6 TASTO2 PORTB,7 TASTO1 TASTIERA CALL BTFSS GOTO CALL MOVLW RETURN MS_20 PORTB,6 LP1 MS_20 0 ;RITARDO ELIMINA RIMBALZI ;ATTENDI RILASCIO PULSANTE CALL BTFSS GOTO CALL MOVLW RETURN MS_20 PORTB,7 LP2 MS_20 1 ;RITARDO ELIMINA RIMBALZI ;ATTENDI RILASCIO PULSANTE CALL BTFSS GOTO CALL MOVLW RETURN MS_20 PORTB,6 LP3 MS_20 2 ;RITARDO ELIMINA RIMBALZI ;ATTENDI RILASCIO PULSANTE ;PREMUTO C? ;PREMUTO 9? ;PREMUTO 8? ;PREMUTO 7? ;SCANSIONE COLONNE ;PREMUTO B? ;PREMUTO 6? ;PREMUTO 5? ;PREMUTO 4? ;SCANSIONE COLONNE ;PREMUTO A? ;PREMUTO 3? ;PREMUTO 2? ;PREMUTO 1? ;SE NESSUN TASTO PREMUTO, ESEGUI NUOVA SCANSIONE TASTO0 LP1 ;RITARDO ELIMINA RIMBALZI ;RITORNA CODICE TASTO PREMUTO TASTO1 LP2 ;RITARDO ELIMINA RIMBALZI ;RITORNA CODICE TASTO PREMUTO TASTO2 LP3 ;RITARDO ELIMINA RIMBALZI ;RITORNA CODICE TASTO PREMUTO TASTO3 14 LP4 CALL BTFSS GOTO CALL MOVLW RETURN MS_20 PORTB,5 LP4 MS_20 3 ;RITARDO ELIMINA RIMBALZI ;ATTENDI RILASCIO PULSANTE CALL BTFSS GOTO CALL MOVLW RETURN MS_20 PORTB,7 LP5 MS_20 4 ;RITARDO ELIMINA RIMBALZI ;ATTENDI RILASCIO PULSANTE CALL BTFSS GOTO CALL MOVLW RETURN MS_20 PORTB,6 LP6 MS_20 5 ;RITARDO ELIMINA RIMBALZI ;ATTENDI RILASCIO PULSANTE CALL BTFSS GOTO CALL MOVLW RETURN MS_20 PORTB,5 LP7 MS_20 6 ;RITARDO ELIMINA RIMBALZI ;ATTENDI RILASCIO PULSANTE CALL BTFSS GOTO CALL MOVLW RETURN MS_20 PORTB,7 LP8 MS_20 7 ;RITARDO ELIMINA RIMBALZI ;ATTENDI RILASCIO PULSANTE CALL BTFSS GOTO CALL MOVLW RETURN MS_20 PORTB,6 LP9 MS_20 8 ;RITARDO ELIMINA RIMBALZI ;ATTENDI RILASCIO PULSANTE CALL MS_20 ;RITARDO ELIMINA RIMBALZI BTFSS GOTO CALL MOVLW RETURN PORTB,5 LP10 MS_20 9 ;ATTENDI RILASCIO PULSANTE ;RITARDO ELIMINA RIMBALZI ;RITORNA CODICE TASTO PREMUTO CALL MS_20 ;RITARDO ELIMINA RIMBALZI BTFSS GOTO CALL MOVLW RETURN PORTB,4 LP11 MS_20 0X0A ;ATTENDI RILASCIO PULSANTE ;RITARDO ELIMINA RIMBALZI ;RITORNA CODICE TASTO PREMUTO CALL MS_20 ;RITARDO ELIMINA RIMBALZI BTFSS GOTO CALL MOVLW RETURN PORTB,4 LP12 MS_20 0X0B ;ATTENDI RILASCIO PULSANTE ;RITARDO ELIMINA RIMBALZI ;RITORNA CODICE TASTO PREMUTO CALL MS_20 ;RITARDO ELIMINA RIMBALZI BTFSS GOTO CALL MOVLW RETURN PORTB,4 LP13 MS_20 0X0C ;ATTENDI RILASCIO PULSANTE ;RITARDO ELIMINA RIMBALZI ;RITORNA CODICE TASTO PREMUTO CALL MS_20 ;RITARDO ELIMINA RIMBALZI PORTB,4 LP14 MS_20 0X0D ;ATTENDI RILASCIO PULSANTE ;RITARDO ELIMINA RIMBALZI ;RITORNA CODICE TASTO PREMUTO TASTO4 LP5 ;RITARDO ELIMINA RIMBALZI ;RITORNA CODICE TASTO PREMUTO TASTO5 LP6 ;RITARDO ELIMINA RIMBALZI ;RITORNA CODICE TASTO PREMUTO TASTO6 LP7 ;RITARDO ELIMINA RIMBALZI ;RITORNA CODICE TASTO PREMUTO TASTO7 LP8 ;RITARDO ELIMINA RIMBALZI ;RITORNA CODICE TASTO PREMUTO TASTO8 LP9 ;RITARDO ELIMINA RIMBALZI ;RITORNA CODICE TASTO PREMUTO TASTO9 LP10 TASTOA LP11 TASTOB LP12 TASTOC LP13 TASTOD LP14 BTFSS GOTO CALL MOVLW RETURN TASTOCANC ;RITARDO ELIMINA RIMBALZI ;RITORNA CODICE TASTO PREMUTO 15 CALL MS_20 ;RITARDO ELIMINA RIMBALZI PORTB,5 LP15 MS_20 0X0E ;ATTENDI RILASCIO PULSANTE ;RITARDO ELIMINA RIMBALZI ;RITORNA CODICE TASTO PREMUTO MS_20 ;RITARDO ELIMINA RIMBALZI PORTB,7 LP16 MS_20 0X0F ;ATTENDI RILASCIO PULSANTE LP15 BTFSS GOTO CALL MOVLW RETURN TASTOAST CALL LP16 BTFSS GOTO CALL MOVLW RETURN ;RITARDO ELIMINA RIMBALZI ;RITORNA CODICE TASTO PREMUTO ;**********************ROUTINE DELAY 20MS*************************************** MS_20 CLRF MS LP_MS2 MOVLW D'20' SUBWF MS,0 BTFSS STATUS,2 GOTO LP_MS2 RETURN ;****** ROUTINE MOLTIPLICAZIONE TRA DUE NUMERI A 8 BIT MUL MOVLW 8 MOVWF CONT CLRW CLRF RL MUL1 RRF MPR BTFSC STATUS,0 ADDWF MPD,0 MOVWF RH RRF RH,0 RRF RL DECFSZ CONT GOTO MUL1 MOVWF RH RETURN ;******** ROUTINE DIVISIONE DIV CLRF QUOZ MOVLW 8 MOVWF CONT D1 BCF STATUS,0 RLF QUOZ BCF STATUS,0 RLF RL RLF RH MOVF DIVISORE,0 SUBWF RH,0 BTFSS STATUS,0 GOTO D2 MOVWF RH INCF QUOZ D2 DECFSZ CONT GOTO D1 RETURN Controllo della potenza fornita al motore La tecnica PWM è caratterizzata da un generatore di onde quadre che alimenta, tramite interfaccia di potenza, un generico carico. L’onda quadra ha periodo T e durata dell’impulso t. Nell’ipotesi che Vcc sia l’ampiezza dell’impulso, la tensione media fornita al carico vale Pm = Vcc*t/T. Il termine t/T si chiama duty cycle e viene di norma fornito in %. Variando il duty cycle, vale a dire mantenendo T costante e facendo variare t, la tensione media sul carico può variare da 0 a Vcc e così pure la potenza da 0 ad un certo valore massimo. Dunque variando t, si modula la potenza fornita al carico. Interfaccia pwm nel pic16f877a Il microcontrollore della scheda di pompaggio dispone di due uscite PWM ,RC2/CCP1 e RC1/CCP2, che sono controllate via software agendo su opportuni registri dedicati. 16 Di seguito si analizza come controllare l’uscita RC2/CCP1; analoghi discorsi valgono per l’altra uscita PWM. I registri dedicati al controllo dell’uscita CCP1 in modalità PWM sono T2CON, TMR2, PR2, CCPR1L CCPR1H e CCP1CON. Il funzionamento è il seguente: - Quando il contatore a 8 bits TMR2, comandato dal clock del processore, raggiunge il valore contenuto nel registro PR2, l’uscita PWM si porta alta automaticamente , TMR2 viene azzerato, il contenuto del registro CCPR1L e i 2 bit 5 e 4 del registro CCP1CON vengono trasferiti in CCPR1H. Quest’ultimo registro non è accessibile da software ma è solo un latch. - L’uscita rimane alta finchè TMR2 raggiunge il valore contenuto nel registro CCPR1H. Da quanto esposto, per variare il duty cycle è necessario variare il contenuto di CCPR1L mentre il registro PR2 è utilizzato per stabilire il periodo T. Attraverso questa è possibile far girare più lentamente il motore della pompa negli ultimi due giri di erogazione al fine di ottenere un’erogazione più precisa. Viene riportata di seguito la parte di codice che permette la diminuzione di velocità motore in pwm: MOVLW MOVWF MOVLW MOVWF MOVLW MOVWF MOVLW MOVWF 0XFF PR2 B'00000100' T2CON 0X9F CCPR1L B'00001111' CCP1CON ;RALLENTA MOTORE Motore con Encoder Lettura giri e posizione rotore principale della pompa (encoder) Per monitorare istante per istante la posizione e i giri dell’ingranaggio principale del motore e permettere un dosaggio preciso, è stato progettato e creato un encoder composto principalmente da due accoppiatori ottici “cny70” e due trigger di schmitt “cd4093” usati come squadratori di segnale e interfacce di linea come mostrato di seguito. 17 Fotodiodi I due sensori sono posti dietro l’ingranaggio del motore ( dietro i due fori (foto a) ), al quale è stato applicato un adesivo con stampati due cerchi suddivisi a sua volta in quattro spicchi colorati in alternanza di bianco e nero (foto b) foto a foto b sensori (posti dietro il motore) Immagine della sede dell’ingranaggio con fori (senza ingranaggio) Ogni sensore emette un fascio di luce all’infrarosso che va a colpire la superficie del rotore che è suddiviso in spicchi bianchi e neri. Se la superficie colpita è nera il fascio viene assorbito e il microcontrollore legge un livello logico 1. Al contrario se la superficie colpita è bianca il fascio viene riflesso e il microcontrollore legge il livello logico 0. Inoltre per il controllo del funzionamento, lo stato di ogni sensore permette di gestire due diodi led posti nella scheda di controllo principale. Con questa tecnica il microcontrollore è in grado di capire la posizione esatta e in numero di giri effettuati dal rotore con una risoluzione di un quarto di giro. Questa codifica è detta a codice gray in quanto lo stato dell’encoder a due bit si alterna cambiando un solo bit. (fig. c) Fig. c 00 01 10 11 18 Di seguito sono riportate le 4 possibili letture della posizione rotore (i sensori vengono posti esattamente sopra i due fori) lettura “01” lettura “00” lettura “10” Viene riportata di seguito la parte di codice che permette la lettura dei sensori: LPA1 MOVF BTFSC GOTO CALL CALL MOVLW ANDWF SUBWF BTFSC GOTO SETH STATUS,2 PIPPO1 DS1 LED_ENCODER 0X0C PORTA,0 ENCODER,0 STATUS,2 LPA1 CALL MOVLW ANDWF SUBWF BTFSS GOTO INCF MOVLW SUBWF BTFSS GOTO LED_ENCODER 0X0C PORTA,0 ENCODER,0 STATUS,2 LPA2 GIRI 4 GIRI,0 STATUS,2 LPA1 ;CONTROLLA SE PARTE ALTA SETTORI E' NULLA ;VISUALIZZA LED STATO ENCODER ;CONTROLLA SE SUPERATO PRIMO SETTORE LPA2 ;VISUALIZZA LED STATO ENCODER ;CONTROLLA SE FATTO UN GIRO ;AGGIORNA CONTEGGIO GIRI ;CONTROLLA SE FATTI 4 GIRI CLRF GIRI Master scheda di comando (scala 1:1) Lato componenti 19 lettura “11” Master scheda encoder (scala 2:1) Lato componenti 20 Lato rame Posizione componenti Scheda principale (scala 1:1) 21 Posizione componenti Encoder (scala 2:1) 22