Canzian Sara Liberali Marco 5AT A.S.2007/2008 PUNTATORE LASER AUTOMATICO CON COMANDO VIA ETHERNET Questo sistema permette di posizionare una luce laser in una determinata posizione data dalle coordinate che vengono inserite da un PC e trasmesse ad un altro che le invierà poi in seriale al microcontrollore PIC16F84A. Materiali utilizzati: 2 computer Alimentatore da +5V dc Alimentatore da +12V dc Cavo seriale 1:1 prolunga Sistema (scheda e motori passo passo unipolari) Dividiamo ora la spiegazione in due parti: parte hardware e parte software PARTE HARDWARE SCHEMA ELETTRICO In allegato alla pag. Calcoli di progetto Calcolo della resistenza di ogni fase del motore Indicando con R la resistenza generica che nello schema elettrico rappresenta le resistenze da R1 a R8 e con Q i transistor da Q1 a Q8, i calcoli sono i seguenti:
Usiamo un BC337-25 che ha un h FEmin di 160. Avendo una Vpp di 12V e una Rf (resistenza di fase di 70Ω) e sapendo che la Vcesat è di 0,2V possiamo calcolare la Icsat per poi trovare la Ibsat e quindi il valore della resistenza R. VPP Rf PIC R 2 1 Q 3 A livello basso il bjt è interdetto e quindi funziona come un interruttore aperto mentre a livello alto il bjt è in grado di pilotare la fase del motore. Dal grafico ricaviamo che con una V OHmin di 3.7V e con una I OH =Ibsat di 3.17mA Avremo Calcolo della resistenza relè I calcoli sono analoghi a quelli fatti per la resistenza delle fasi solo che in questo caso la Rf varrà 120Ω. 5V Rf PIC R 2 1 Q 3
PARTE SOFTWARE: SOFTWARE IN ASSEMBLY PER PIC 16F84: ;************************************************** ; Progetto Esami 2007/2008 ; Liberali Marco / Canzian Sara ;************************************************** PROCESSOR 16F84A RADIX DEC INCLUDE "P16F84A.INC" ERRORLEVEL -302 CONFIG 3FF1H N equ 23 RTS equ 0 CTS equ 1 TX equ 3 RX equ 4 LAS equ 2 swdir1 equ 0 swdir2 equ 4 swmot equ 3 ;0 se voglio mot1 ;1 se voglio mot2 btimer1 equ 0 ;Bit 0 di stimers - bit di On-Off di TMR1 btimer2 equ 1 ;Bit 1 di stimers - bit di On-Off di TMR2 n equ 9 ;Numero per inizializzare TMR0 in 'rtc' end1stp equ 1 end2stp equ 5 OP32exit equ 7 OP31exit equ 3 ; FILE REGISTER ORG 0CH ;Variabili di rtc w_stack res 1 s_stack res 1 stimers res 1 TMR1_L res 1 TMR1_H res 1 TMR2 res 1 TMR1 res 1 ;Variabili per lo Step Motor StepS res 1 ;Var. dello stato di rotazione del motore StepT res 1 ;Tempo in msec per efettuare mezzo passo Step1N res 1 ;Numero di mezzi passi del motore1 Step2N res 1 ;Numero di mezzi passi del motore2 Fptr1 res 1 ;Var. locale della fase attiva del motore Fptr2 res 1 ;Var. locale della fase attiva del motore ;Registri usati dalle subroutines per RS232 TmpReg res 1 ;Registro temporaneo ShiftReg res 1 ;Shift register BitCount res 1 ;Bit counter Count0 res 1 Tmp res 1 PBloc res 1 appoggio res 1 PxF res 1 PyF res 1 PxA res 1 PyA res 1 ; RESET VECTOR ORG 0x00 goto VectRes ORG 0x04 goto rtc ;ISR: Timeout TMR0
; Macro DELAY DELAY MACRO VALUE LOCAL Loop movlw VALUE movwf Tmp Loop decfsz Tmp, F goto Loop ENDM ; Subroutines per invio RS232 TxChar movwf ShiftReg movlw 8 movwf BitCount bcf PORTA, TX TxLoop btfss ShiftReg, 0 goto TxLo bsf PORTA, TX goto ctx TxLo bcf PORTA, TX ctx goto ctx rrf ShiftReg, 1 decfsz BitCount, 1 goto TxLoop bsf PORTA, TX DELAY 2 bsf PORTA, TX DELAY 2 ; Subroutines per ricezione RS232 RxChar clrf ShiftReg movlw 8 movwf BitCount DELAY 34 wdb btfss PORTA, RX goto RxBitL RxBitH bsf STATUS, C goto RxShift RxBitL bcf STATUS, C goto RxShift RxShift rrf ShiftReg, 1 decfsz BitCount, 1 goto wdb
movf ShiftReg,W ;******************** ISR Routine *************************** ;Questa routine implementa un RTC da 1msec per la gestione di ;due timers, TMR1 a 2 byte TMR1H e TMR1_L e TMR2. ;Usa: STimers: Byte contenente i bit di stato dei timer ; btimer: Bit di stato del timer: 1 = timer off ; 0 = timer on ; Per avviare il timer: ; movlw 0x30 ;load 12,5 sec: ; movwf TMR1_H ;12500 msec = 0x30D4 ; movlw 0xD4 ; ; movwf TMR1_L ; ; bcf stimers,btimer1 ; ; Attesa: ;Loop btfss stimers,btimer1 ; ; goto Loop rtc movwf w_stack ;Salva contesto... swapf STATUS, W movwf s_stack bcf INTCON,T0IF ;reset Interrupt timer0 flag movlw n ;n -> W e movwf TMR0 ;ricarica timer rt_tmr2 btfsc stimers,btimer2 ;Timer2 Spento? goto rt_back ;Si, esci decfsz TMR2,F ;Decrementa TMR_2, è zero? goto rt_back ;No, esci bsf stimers,btimer2 ;Si, Set btimer2 rt_back swapf s_stack,w ;Ripristina contesto movwf STATUS swapf w_stack,f swapf w_stack,w retfie ;Half Step Per il Motore1 HStp1 decf Step1N, f btfss StepS,swDir1 ;Test bit di direzione. decf Fptr1,W ;Queste istr. impiegano sempre btfsc StepS,swDir1 ;6 tempi istruzione in ogni caso incf Fptr1,W andlw 0x07 ;Conteggio in modulo 8 movwf Fptr1 ;(tieni solo bit LSB) call StpCd1 ; per puntare alla Transcode movwf PBloc movf PORTB,W andlw 0xF0 iorwf PBloc,W movwf PORTB StpCd1 addwf PCL,F retlw b'0001' retlw b'0011' retlw b'0010' retlw b'0110' retlw b'0100' retlw b'1100' retlw b'1000' retlw b'1001' ;Half Step Per il Motore2 HStp2 decf Step2N, f btfss StepS,swDir2 ;Test bit di direzione. decf Fptr2,W ;Queste istr. impiegano sempre btfsc StepS,swDir2 ;6 tempi istruzione in ogni caso
incf Fptr2,W andlw 0x07 ;Conteggio in modulo 8 movwf Fptr2 ;(tieni solo bit LSB) call StpCd2 ; per puntare alla Transcode movwf PBloc movf PORTB,W andlw 0x0F iorwf PBloc,W movwf PORTB StpCd2 addwf PCL,F retlw b'00010000' retlw b'00110000' retlw b'00100000' retlw b'01100000' retlw b'01000000' retlw b'11000000' retlw b'10000000' retlw b'10010000' ;MORE STEP MoreStp bsf INTCON, GIE ;attiva interroupt movf Step1N, f call HStp1 movf Step2N, f call HStp2 movf StepT, 0 movwf TMR2 bcf stimers, btimer2 LpMStp btfss stimers, btimer2 goto LpMStp movf Step2N, f goto MoreStp movf Step1N, f goto MoreStp bcf INTCON, GIE ;disattiva interroupt ;*** MAIN PROGRAM*** VectRes bsf STATUS,RP0 ;Attiva Banco 1 clrf TRISA ;Imposta PORTA bsf TRISA,RX movlw b'00000000' ;Imposta PORTB movwf TRISB movlw b'00000001' ;Pull-up ON, Prescaler 4 movwf OPTION_REG ;assegnato a TMR0 come Timer bcf STATUS,RP0 ;Attiva Banco 0 bsf INTCON,T0IE ;Abilita IRQ da TMR0 bcf INTCON,GIE ;Abilita IRQ clrf PORTA clrf PORTB bsf PORTA, TX ;Tx in stato di riposo bsf PORTA, RX ;Rx in stato di riposo bsf stimers,btimer1 ;Imposta timer come già scaduto
bsf stimers,btimer2 ;Imposta timer come già scaduto bsf PORTB, 7 bsf PORTB, 0 clrf PxA clrf PyA bsf StepS, swdir1 bsf StepS, swdir2 start btfsc PORTA, RX ;bit di start ricevuto? ;si, attiva ricezione movwf appoggio ;0XFF-appoggio=0? (quindi appoggio=0xff?) M1Lp btfsc PORTA, RX ;bit di start ricevuto? goto M1Lp ;si, attiva ricezione movwf appoggio movlw 0X07 ;0X00-appoggio=0? (quindi appoggio=0x00?) goto OP7 ;OP0= Reset Coordinate Motori (0,0) movlw 0X01 ;0X01-appoggio=0? (quindi appoggio=0x01?) goto OP1 ;OP1=Accendi Laser movlw 0X02 ;0X02-appoggio=0? (quindi appoggio=0x02?) goto OP2 ;OP2=Spegni Laser movlw 0X03 ;0X03-appoggio=0? (quindi appoggio=0x03?) goto OP3 ;OP3=Coordinate Motori(>>>2 BYTE<<<) movlw 0X04 ;0X04-appoggio=0? (quindi appoggio=0x04?) goto OP4 ;OP4=Test Connessione RS-232 movlw 0X05 ;0X05-appoggio=0? (quindi appoggio=0x05?) goto OP5 ;OP5=Tempo di passo StepTime movlw 0X06 ;0X06-appoggio=0? (quindi appoggio=0x06?) goto OP6 movlw 0X08 goto OP8 movlw 0X09 goto OP9 ; nessuna delle precedenti=errore OP7 clrf PxA
clrf PyA OP1 bsf PORTA, LAS OP2 bcf PORTA, LAS OP3 btfsc PORTA, RX ;bit di start ricevuto? goto OP3 movwf Step1N OP3z btfsc PORTA, RX ;bit di start ricevuto? goto OP3z movwf Step2N OP4 OP5 btfsc PORTA, RX goto OP5 movwf StepT OP6 call MoreStp OP8 bsf StepS, swdir1 bcf StepS, swdir2 OP9 bcf StepS, swdir1 bsf StepS, swdir2
end I FLOWCHART DEL SOFTWARE PER IL PIC E DEL SOFTWARE PER I DUE PC SONO ALLEGATI.