Está en la página 1de 18

UNIVERSIDAD NACIONAL DE SAN AGUSTIN

FACULTAD DE INGENIERIA DE PRODUCCION Y SERVICIOS ESCUELA PROFESIONAL DE INGENIERIA ELECTRNICA

CURSO: Laboratorio de Microcontroladores y Microprogramacin DOCENTE: Ing. Wildor Ferrel TEMA: Conversin Analgico-Digital GRUPO: TURNO: 01:00-14:30 PM - Jueves. INTEGRANTES: Cuba Mamani, Jaime Gerson Ramos Yerba, Julio Cesar 20-12-2011 AREQUIPA PERU

CONTROL PID DE UN MOTOR DC CON MICROCONTROLADOR


En Proteus organizar el control, en lazo cerrado, de un motor DC con el microcontrolador 16F877. El motor a controlar es del modelo MOTOR-ENCODER del Proteus. El microcontrolador genera la seal PWM y mide la velocidad de rotacin del eje del motor. El microcontrolador recibe la velocidad de referencia (setpoint) como nivel de voltaje desde un potencimetro (un nivel de voltaje corresponde a una velocidad de rotacin). El microcontrolador determina el error (diferencia de la velocidad de referencia y la velocidad medida) y calcula la seal de mando mediante la estrategia de control PID. La seal de mando, que es un nmero con signo en complemento a dos, indica si se aumenta o disminuye el ancho de pulso y en qu medida. La velocidad de referencia y la velocidad medida se visualizan en una pantalla LCD de texto.

El Driver usado es el L293D que nos sirve para controlar el giro del motor.

Los registros usados son:

Los bits 5-3 CHS2:CHS0.- Seleccin de canal analgico a convertir. Se selecciona uno de los ocho canales AN0,...,AN7 colocando en estos tres bits el nmero binario

correspondiente al canal deseado. (Los canales analgicos a usar debern tener sus bits TRIS correspondientes seleccionados como entradas). El bit 2 GO/DONE.- Bit de inicio y fin de conversin.- Con el convertidor encendido, poniendo este bit en 1 se inicia la conversin del canal seleccionado. Este bit permanece en 1 durante la conversin y es limpiado automticamente por el convertidor al terminar la conversin. El bit 0 ADON.-Encendido del convertidor. Al poner este bit en 1 el convertidor se enciende y al ponerlo en 0 se apaga y no consume corriente.

El bit 7 ADFM.- Seleccin de formato del resultado. Al ponerlo en 1 se selecciona resultado de 10 bits justificado a la derecha. Y con un 0 se selecciona justificacin a la izquierda. En la siguiente seccin se explica con mayor detalle. Bits 3-0 PCFG3:PCFG0.- Bits de configuracin de las entradas del convertidor. Configuran las patitas de entrada del convertidor de acuerdo a la siguiente tabla, (en donde A = Entrada Analgica D = Entrada /Salida digital)

Los Registros de Resultados.

Diagrama de Flujo Inicio

Configuracin de los puertos D y B como salidas Configuracin de PR2 para el PWM: FF Configuracin ADCON1 para el resultado a la izquierda y RA0 como entrada: 0E Configuracin T2CON, pre escalador 1/16: 06 Configuracin CCP1 para PWM: 0C Configuracin del timer 0 Configuracin del LCD

Bucle, Espera la interrupcin

Bucle

Bucle, espera una interrupcin del ADC y va mostrando la velocidad de referencia y la del motor

Configuramos el PWM, timer0 y el ADC


Realiza la conversin ADC Inicializa el LCD y el PID

Salimos de la interrupcin

Cdigo Ensamblador (ASM) LIST P=16F877 INCLUDE "P16F877.INC" frech frecl n1 n2 n3 n var tm0 wtemp statemp d1 adcr org 0x00 goto inicio equ 0x27 equ 0x28 equ 0x29 equ 0x30 equ 0x31 equ 0x32 equ 0x33 equ 0x34 equ 0x35 equ 0x36 equ 0x20 equ 0x37

;;;;;;;;;;;;;;interrupcion;;;;;;;;;;;;;;; org 0x04 movwf swapf movwf btfsc goto bcf movlw addwf decfsz goto movf movwf movf movwf call goto isradc bcf call ;call finisr swapf movwf swapf swapf retfie statemp,0 STATUS wtemp,1 wtemp,0 PIR1,6 ctpwm adcini

wtemp STATUS,0 statemp PIR1,6 isradc INTCON,2 0x27 TMR0,1 tm0,1 finisr TMR1L,0 frecl TMR1H,0 frech timer0inc finisr

;;;;;;;;;;;;;inicio;;;;;;;;;;;;;;;;;;

inicio bsf clrf clrf movlw movwf movlw movwf movlw movwf movlw movwf movlw movwf movlw movwf bcf movlw movwf movlw movwf clrf clrf clrf clrf movlw movwf movlw movwf movlw movwf call call ;call bucle call call movf call call call call call call goto corpwm MOVF MOVWF MOVF bcd mostrar adcr,0 mnnn segf mostrar3 PID corpwm adcini bucle CCPR1L,0 BYTE_L1 0x00 ;rutina que hace la correccion del ; ancho de pulso STATUS,RP0 TRISD TRISB b'00000001' TRISC b'10010111' OPTION_REG 0xff PR2 0x0E ADCON1 0x01 TRISA 0x40 PIE1 STATUS,RP0 b'00000110' T1CON b'11100000' INTCON PORTD PORTC PORTB CCPR1L 0x06 T2CON b'00001100' CCP1CON b'01000000' ADCON0 timer0inc LCD_INI adcini ;Banco1 ;puertos D,B como salidas

;carga periodo ;para el PWM ;resultado a la izquierda y entrada A0 ; analgicas

;Banco 0

;inicializa Ciclo de trabajo en cero ;configura Timer 2 ;preescalador 1/16, enciende Timer 2 ;Configura el modulo CCP1 para PWM ;canal A0 ;Inicia LCD

;espera una interrupcion

MOVWF MOVF MOVWF MOVF MOVWF BTFSC CALL MOVF MOVWF MOVF MOVWF CALL MOVF MOVWF return timer0inc movlw movwf clrf clrf movlw clrf movwf bsf return adcini bsf call bsf return ctpwm movf btfss goto movf movwf movwf asd movf movwf return

BYTE_H1 MN_L,0 PR_L MN_H,0 PR_H MN_H,7 COMPPR PR_L,W BYTE_L2 PR_H,W BYTE_H2 SUMA RES_L,0 CCPR1L

.18 tm0 TMR1L TMR1H 0x27 TMR0 TMR0 T1CON,0

ADCON0,0 ret ADCON0,2

adcr STATUS,Z asd ADRESH,0 CCPR1L adcr ADRESH,0 adcr

;carga resultado anterior en W

;carga resultado anterior en W

;;;;;;;;;;;;;;;;;;;;bin a bcd ;;;;;;;;;;;;;;;;; ;esta rutina se encarga de convertir el resultado guardado en el ;registro var a su equivalente en BCD para mostrarlo en la pantalla lcd, ;en paralelo con la conversion AD. ;el resultado lo almacena en los registros: n1(unidades),n2(decenas) ;n3(centenas). ;n3 se obtiene restando 100 de var e incrementar n3 por cada resta ;hasta que el resultado sea menor que 100

;n2 se obtiene de restar lo que queda de var con 10 e incrementar n2 por cada resta ;hasta que el resultado sea menor que 10 ;n1 es lo que queda en var puesto que es menor que 10. ;luego de obtener n1,n2,n3 salta a la rutina mostrar que los muestra en ;la pantalla. cuando regresa verifica si termino la conversion AD ;si termino regresa. bcd movf btfss goto movf mnnn movwf clrf clrf clrf obn3 movlw subwf btfss goto incf goto ob addwf obn2 movlw subwf btfss goto incf goto obn1 addwf addwf bcf vn1 movlw subwf btfss goto movwf incf vn2 movlw subwf btfss return movwf incf .10 n2,0 STATUS,DC n2 n3 .10 n1,0 STATUS,DC vn2 n1 n2 var,0 n1,1 STATUS,C .10 var,1 STATUS,C obn1 n2,1 obn2 var,1 ;suma 100 a var, la ultima resta no conto ;obtiene n2 ;resta 10 a var y lo guarda en var ;verifica si resultado es menor que 10 ;si, si sale de esta rutina ;si, no. incrementa n2 y vuelve a restar ;obtiene n1 ;suma 10 a var, la ultima resta no conto ;el resultado es n1 .100 var,1 STATUS,C ob n3,1 obn3 var n1 n2 n3 ;limpia registros n1,n2,n3 ;para una nueva conversion ;obtiene n3 ;resta 100 a var y lo guarda en var ;verifica si resultado es menor que 100 ;si, si sale de esta rutina ;si, no. incrementa n3 y vuelve a restar frech,1 STATUS,Z mayor frecl,0

return mayor movlw movwf movlw movwf movwf incf movwf goto .2 n3 .5 n2 n1 frecl,0 var obn3

;;;;;;;;;;;;tabla 7 seg;;;;;;;;; HEX_7SEG MOVF n,0 ADDWF RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW

PCL,F B'00111111' ;0 B'00000110' ;1 B'01011011' ;2 B'01001111' ;3 B'01100110' ;4 B'01101101' ;5 B'01111101' ;6 B'00000111' ;7 B'01111111' ;8 B'01101111' ;9

;;;;;;;;;;;,;mostrar en lcd;;;;;;;;;;;;;;;;,;;;; mostrar movlw iorwf iorwf iorwf cursor movlw call mostrar3 movlw iorwf iorwf iorwf fecuencia movlw call movlw call call return carga_n movf

b'00110000' n1,1 n2,1 n3,1 0x80 LCD_REG b'00110000' n1,1 n2,1 n3,1 'F' LCD_DATOS ':' LCD_DATOS carga_n

;pone n1,n2,n3 en el formato ASCII

;verifica tipo de sensor ;Coloca el dato enviado en la DDRAM

;pone n1,n2,n3 en el formato ASCII

;Visualiza caracter ;Visualiza n3,n2,n1

n3,0

call movf call movf call return segf movlw call return

LCD_DATOS n2,0 LCD_DATOS n1,0 LCD_DATOS

;Visualiza caracter ;Visualiza caracter ;Visualiza caracter ;muestra el mensaje de la segunda fila ;segunda fila lcd

b'11000000' LCD_REG

;;;;;;;;;;CONTROL LCD;;;;;;;;;;;;;;;;; LCD_E bsf nop bcf return LCD_REG bcf movwf call goto LCD_DATOS bsf movwf call goto LCD_INI movlw call movlw call movlw call return

PORTB,2 PORTB,2

;Activa lcd ;Espera 1uS ;Desactiva lcd

PORTB,0 PORTD retardo_255us LCD_E PORTB,0 PORTD retardo_255us LCD_E b'00111000' LCD_REG b'00000110' LCD_REG b'00001100' LCD_REG

;Modo instruccion ;Saca el codigo de instruccion ;pierde 255uS. ;habilita el lcd ;Modo dato ;saca valor ASCII por RD ;pierde 255uS. ;habilita el lcd ;configura lcd ;Codigo de instruccion ;incrementa la posicin del cursor ;pantalla On,cursor Off,Parpadeo de cursor Off

;;;;;;;;;;;;;;;;;control PID;;;;;;;;;;;;;;;;; ;Declaracin de variables ;**************** Variables de PID******************* KP KD KI EN ENN SUM_L SUM_H MN_L MN_H EQU EQU EQU EQU EQU EQU EQU EQU EQU 0X20 0X21 0X22 0X23 0X24 0X25 0X26 0X38 0X39

;Resultado

;************** Variables de Multiplicacin ********* MD MR MD_H PR_H PR_L CNT DIR EQU EQU EQU EQU EQU EQU EQU 0X40 0X41 0X42 0X43 0X44 0X45 0X46

;*************** Variables de Suma*************** ; Primer nmero BYTE_L1 BYTE_H1 ; Segundo nmero BYTE_L2 BYTE_H2 ; Resultado: RES_L RES_H

EQU EQU EQU EQU EQU EQU

0X47; 0X48; 0X49; 0X50; 0X51; 0X52;

;************** Variables Auxiliares ************** PR_L0 PR_H0 BYTE_L11 BYTE_H11 RES_L0 RES_H0 SIGNO EQU 0X53 EQU 0X54 EQU 0X55 EQU 0X56 EQU 0X57 EQU 0X58 EQU 0X59

;***** Velocidades del Motor VELOR EQU 0X60 VELOM EQU 0X61 SUMAA EQU 0X62 ; Limpiamos registros CLRF KP CLRF KD CLRF KI CLRF EN CLRF ENN CLRF SUM_L CLRF SUM_H CLRF MN_L CLRF MN_H CLRF MD CLRF MR CLRF MD_H

CLRF CLRF CLRF CLRF CLRF CLRF CLRF CLRF CLRF CLRF CLRF CLRF CLRF CLRF CLRF CLRF CLRF

PR_L PR_H CNT DIR BYTE_L1 BYTE_H1 BYTE_L2 BYTE_H2 RES_L RES_H PR_L0 PR_H0 BYTE_L11 BYTE_H11 VELOM VELOR SUMAA

; Ingreso de datos:;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MOVLW MOVWF MOVLW MOVWF MOVLW MOVWF MOVf MOVWF MOVf MOVWF CALL GOTO 0X0A KP 0X05 KD 0X0D KI CCPR1L,0 VELOR frecl,0 VELOM PIDcon FINAL

PIDcon ; Deteccin de Error EN. Si EN=0. Regresa inmediatamente CLRF STATUS ;ENN MOVF EN,W MOVWF ENN ;EN MOVF VELOM,W SUBWF VELOR,W BTFSC STATUS,Z GOTO FINAL MOVWF EN MOVF ENN,W ADDWF SUMAA,F

;************* Desarrollo de la frmula ***********

;***************** Primer Parntesis ************** ;****************** Primer trmino *************** ; Producto KD*EN MOVF KD,W MOVWF MD MOVF EN,W MOVWF MR CALL MULTIPLICACION MOVF PR_L,W MOVWF BYTE_L1 MOVF PR_H,W MOVWF BYTE_H1 ; Producto KD*ENN MOVF KD,W MOVWF MD MOVF ENN,W MOVWF MR CALL MULTIPLICACION CALL COMPPR MOVF PR_L,W MOVWF BYTE_L2 MOVF PR_H,W MOVWF BYTE_H2 ; Suma SUMA 01 CALL SUMA ; Redefiniendo nuevos nmeros MOVF RES_L,W MOVWF BYTE_L11 MOVF RES_H,W MOVWF BYTE_H11 ;********************************************** ;************* Segundo Parntesis ************* ; Producto KI*EN MOVF KI,W MOVWF MD MOVF EN,W MOVWF MR CALL MULTIPLICACION MOVF PR_L,W MOVWF BYTE_L1 MOVF PR_H,W MOVWF BYTE_H1 ; Producto KI*(Sumatoria de errores) MOVF KI,W MOVWF MD MOVF SUMAA,W MOVWF MR CALL MULTIPLICACION MOVF PR_L,W MOVWF BYTE_L2 MOVF PR_H,W

MOVWF ; Suma SUMA 02 CALL MOVF MOVWF MOVF MOVWF ; Suma SUMA 03 MOVF MOVWF MOVF MOVWF CALL MOVF MOVWF MOVF MOVWF

BYTE_H2 SUMA RES_L,W BYTE_L2 RES_H,W BYTE_H2 BYTE_L11,W BYTE_L1 BYTE_H11,W BYTE_H1 SUMA RES_L,W BYTE_L2 RES_H,W BYTE_H2

;*********************************************** ;************ Trmino sin parntesis *********** MOVF MOVWF MOVF MOVWF CALL MOVF MOVWF MOVF MOVWF ; Suma SUMA 04 CALL KP,W MD EN,W MR MULTIPLICACION PR_L,W BYTE_L1 PR_H,W BYTE_H1 SUMA

;********************* Resultado ******************* MOVF MOVWF MOVF MOVWF RETURN RES_L,W MN_L RES_H,W MN_H

;************* Rutina de Multiplicacin ******** MULTIPLICACION ; Testeo del signo de los nmeros BTFSC MD,7 CALL COMPMD BTFSC MR,7 CALL COMPMR CLRF PR_L

CLRF PR_H CLRF MD_H CLRF DIR MOVLW 0X08 MOVWF CNT TEST_BIT RRF MR,F BTFSC STATUS,C CALL SUMAR CALL DESPLAZAR DECFSZ CNT,F GOTO TEST_BIT ; Testeamos el signo del producto BTFSC DIR,0 CALL COMPPR RETURN ; Rutinas de Multiplicacion SUMAR MOVF MD,W ADDWF PR_L,F BTFSC STATUS,C INCF PR_H,F MOVF MD_H,W ADDWF PR_H RETURN DESPLAZAR BCF STATUS,C RLF MD,F RLF MD_H,F RETURN ; Complemento a dos de los nmeros negativos ; Complemento a dos del Multiplicando COMPMD COMF MD,F INCF MD,F INCF DIR,F RETURN ; Complemento a dos del Multiplicador COMPMR COMF MR,F INCF MR,F INCF DIR,F RETURN ; Complemento a dos del Producto COMPPR MOVF PR_L,W MOVWF PR_L0 COMF PR_L0,F MOVF PR_H,W MOVWF PR_H0

COMF INCF BTFSC INCF MOVF MOVWF BCF INCF MOVF ADDWF RETURN

PR_H0,F PR_L0,F STATUS,C PR_H PR_L0,W PR_L STATUS,C PR_H0,F PR_H0,W PR_H,F

;******************* Rutina de Suma ************************ SUMA ;***************** SUMAL ************** MOVF trabajo ADDWF BYTE_L2,W ;Suma W con byte-bajo del segundo nmero. Se guarda en W BTFSC STATUS,C ; Testea si existe acarreo C CALL Inc_Res_H ; S. C=1. Incrementa el byte-alto del resultado MOVWF RES_L ; No. C=0. Copia el resultado byte-bajo ;****************** SUMAH ************* MOVF BYTE_H1,W ; Copia byte-alto del primer nmero al registro de trabajo ADDWF BYTE_H2,W ; Suma W con byte-alto del segundo nmero. Se guarda en W ADDWF RES_H,W ; No. C=0. Suma W con byte-alto del resultado MOVWF RES_H BCF STATUS,C RETURN ;******************************************************************** ; Cuando hay acarreo en la parte baja del byte Inc_Res_H INCF RES_H,F ; Incrementa el byte-alto del resultado BCF STATUS,C ; Limpia el bit C (acarreo) RETURN FINAL CLRF EN CLRF ENN CLRF SUMA RETURN ;;;;;;;;;;;;;;retardos:;;;;;;;;; retardo_255us clrf b1 decfsz goto BYTE_L1,W ;Copia byte-bajo del primer nmero al registro de

d1 d1, f b1

return ret movlw movwf re decfsz goto return end d1 re .15 d1

Diagrama de Bloques

También podría gustarte