Sensor de Temperatura

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 17

SEP

DGIT

GOBIERNO DEL ESTADO DE MICHOACÁN


INSTITUTO TECNOLÓGICO DE ESTUDIOS SUPERIORES DE
ZAMORA

INGENIERIA ELECTRONICA

MICROCONTROLADORES

REPORTE DE PRACTICA SENSOR

PROFESOR: ARNOLDO ULISES VILLALOBOS GUERRA

GRUPO: 6B

PRESENTAN:
ARREGUIN MIRANDA JORGE LUIS
SALOMON MEDINA ALVARO EDUARDO

ZAMORA MICHOACÁN 09 DE JUNIO DEL 2018


INTRODUCCION
El Microcontrolador es un circuito integrado que es el componente principal de
una aplicación embebida. Es como una pequeña computadora que incluye
sistemas para controlar elementos de entrada/salida. También incluye a un
procesador y por supuesto memoria que puede guardar el programa y sus
variables (flash y RAM). Funciona como una mini PC. Su función es la de
automatizar procesos y procesar información.
El microcontrolador se aplica en toda clase de inventos y productos donde se
requiere seguir un proceso automático dependiendo de las condiciones de
distintas entradas.

Un microcontrolador al menos tendrá:

Microprocesador.
Periféricos (unidades de
entrada/salida).
Memoria.
DESARROLLO
Durante la realización de la práctica del sensor de temperatura nos dimos a la
tarea de configurar los fuses y el puerto C en el microcontrolador y en el
quemador todo esto para poder utilizar una pantalla LCD y poder realizar el
sensor de temperatura para el cual utilizamos el sensor LM35 y un amplificador
operacional.

Para esto el profesor nos dio una guía con los pasos a seguir para poder
configurar el quemador y el puerto C los cuales se muestran a continuación:
Primero hay que leer los fuses

A continuación habilitar modo experto


Posteriormente deshabilitar JTAG

Por último escribir fuses

El AVR8 Burn facilita modificar los fuses, por ejemplo si se desea modificar la frecuencia
interna del oscilador a 8Mhz se da click en fuses.
Posteriormente en opciones de oscilador/reloj, después en oscilador RC interno
calibrado y se selecciona 8Mhz en la frecuencia nominal.

Y por último se da clic en escribir fuses. (se tiene que tener conectado el programador al micro
y la pc.)
Después de esto a todos los programas que se realicen se deberá fijar la frecuencia de 8mhz en
el codevision (wizard).

CRISTAL EXTERNO

PRIMERO READ FUSES

Una de las ventajas de trabajar con cristal externo es precisamente la exactitud. Si se


desea trabajar con un cristal de 16Mhz. Se selecciona la pestaña de cristal externo o resonador
cerámico, se selecciona crystal y se elige el rango de frecuencia de 8.0Mhz-16Mhz.
Por ultimo escribir fuses (se tiene que tener conectado el programador al micro y la
pc.)

Una vez que se modificaron los fuses para trabajar con cristal exteno lo siguiente es
colocar el cristal y los capacitores.

La configuración de los fuses queda guardada (NO ES NECESARIO REPETIR LOS PASOS),
así que a los programas que se quieran guardar en el micro deberán de llevar la frecuencia de
16Mhz en el wizard.

Código
/*******************
This program was created by the CodeWizardAVR V3.24
Automatic Program Generator
© Copyright 1998-2015 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date : 10/05/2018
Author :
Company :
Comments:
Chip type : ATmega16
Program type : Application
AVR Core Clock frequency: 16.000000 MHz
Memory model : Small
External RAM size :0
Data Stack size : 256
*******************/

#include <io.h>

#include <delay.h>

// Alphanumeric LCD functions


#include <alcd.h>
//unsigned char c ;
unsigned long int T,G, dato;

unsigned long int D, Dr, U, de;


// Declare your global variables here

// Voltage Reference: AVCC pin


#define ADC_VREF_TYPE ((0<<REFS1) | (1<<REFS0) | (1<<ADLAR))

// Read the 8 most significant bits


// of the AD conversion result
unsigned char read_adc(unsigned char adc_input)
{
ADMUX=adc_input | ADC_VREF_TYPE;
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=(1<<ADSC);
// Wait for the AD conversion to complete
while ((ADCSRA & (1<<ADIF))==0);
ADCSRA|=(1<<ADIF);
return ADCH;
}

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization


// Port A initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRA=(0<<DDA7) | (0<<DDA6) | (0<<DDA5) | (0<<DDA4) | (0<<DDA3) |
(0<<DDA2) | (0<<DDA1) | (0<<DDA0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) |
(0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0);

// Port B initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) |
(0<<DDB2) | (0<<DDB1) | (0<<DDB0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) |
(0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);

// Port C initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRC=(0<<DDC7) | (0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (0<<DDC3) |
(0<<DDC2) | (0<<DDC1) | (0<<DDC0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTC=(0<<PORTC7) | (0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) |
(0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0);

// Port D initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRD=(0<<DDD7) | (0<<DDD6) | (0<<DDD5) | (0<<DDD4) | (0<<DDD3) |
(0<<DDD2) | (0<<DDD1) | (0<<DDD0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) |
(0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0 output: Disconnected
TCCR0=(0<<WGM00) | (0<<COM01) | (0<<COM00) | (0<<WGM01) | (0<<CS02)
| (0<<CS01) | (0<<CS00);
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Disconnected
// OC1B output: Disconnected
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) |
(0<<WGM11) | (0<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12)
| (0<<CS11) | (0<<CS10);
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0<<AS2;
TCCR2=(0<<PWM2) | (0<<COM21) | (0<<COM20) | (0<<CTC2) | (0<<CS22) |
(0<<CS21) | (0<<CS20);
TCNT2=0x00;
OCR2=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization


TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B)
| (0<<TOIE1) | (0<<OCIE0) | (0<<TOIE0);

// External Interrupt(s) initialization


// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=(0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00);
MCUCSR=(0<<ISC2);

// USART initialization
// USART disabled
UCSRB=(0<<RXCIE) | (0<<TXCIE) | (0<<UDRIE) | (0<<RXEN) | (0<<TXEN) |
(0<<UCSZ2) | (0<<RXB8) | (0<<TXB8);

// Analog Comparator initialization


// Analog Comparator: Off
// The Analog Comparator's positive input is
// connected to the AIN0 pin
// The Analog Comparator's negative input is
// connected to the AIN1 pin
ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC)
| (0<<ACIS1) | (0<<ACIS0);

// ADC initialization
// ADC Clock frequency: 1000.000 kHz
// ADC Voltage Reference: AVCC pin
// ADC Auto Trigger Source: ADC Stopped
// Only the 8 most significant bits of
// the AD conversion result are used
ADMUX=ADC_VREF_TYPE;
ADCSRA=(1<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) |
(1<<ADPS2) | (0<<ADPS1) | (0<<ADPS0);
SFIOR=(0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0);

// SPI initialization
// SPI disabled
SPCR=(0<<SPIE) | (0<<SPE) | (0<<DORD) | (0<<MSTR) | (0<<CPOL) |
(0<<CPHA) | (0<<SPR1) | (0<<SPR0);

// TWI initialization
// TWI disabled
TWCR=(0<<TWEA) | (0<<TWSTA) | (0<<TWSTO) | (0<<TWEN) | (0<<TWIE);

// Alphanumeric LCD initialization


// Connections are specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTC Bit 0
// RD - PORTC Bit 1
// EN - PORTC Bit 2
// D4 - PORTC Bit 4
// D5 - PORTC Bit 5
// D6 - PORTC Bit 6
// D7 - PORTC Bit 7
// Characters/line: 8
lcd_init(16);

while (3)
{
T=read_adc(0);
dato=(T*1000)/51; // Para recuperar tres digitos lo multiplicas *1000 para
recuperar 3 datos, porque al hacer la regla de 3 me daria .490 lo multiplico por
mil.

G=dato/1.8; //Nuestro dato se divide entre la ganancia que hayamos


elegido, si no usaramos
//amplificador, pudieramos omitir esta linea, simplemente
leyendo el LM35.
D=G/100; //Para obtener las decenas dividimos la ganancia entre 100
para separar los digitos
//No puede ser entre 10 como el ejemplo porque el resultado
nos daria milis.

Dr=G%100; //Usando el % recuperamos digitos, o bien es el residuo


de la division.

U=Dr/10; //El residuo lo dividimos entre 10 para obtener las unidades.

de=Dr%10; //Y para los decimales con el % recuperamos el decimal

lcd_gotoxy(2,0);
lcd_putsf("TEMPERATURA:");
lcd_gotoxy(10,1);
lcd_putsf("C");
lcd_gotoxy(7,1); //En estas lineas unicamente colocamos la posicion
de digitos
lcd_putsf(".");
lcd_gotoxy(9,1);
lcd_putchar(0xdf);

lcd_gotoxy(5,1);
lcd_putchar(0x30 + D); //Colocamos las lineas vistas en clase, ponemos
el codigo 0x30 y le sumamos C, U y de.
lcd_gotoxy(6,1);
lcd_putchar(0x30 + U);
lcd_gotoxy(8,1);
lcd_putchar(0x30 + de);
}
}
Resultados
CONCLUSIONES
Arreguin Miranda Jorge Luis: En general al concluir con la práctica del sensor
de temperatura puedo decir que fue muy interesante pero además tuvo sus
complicaciones ya que teníamos que hacer que el micro funcionara junto con el
sensor LM35 y con un amplificador operacional y al estar realizando el código y
al momento de explicarlo al profesor hubo algunos problemas pero finalmente
corregimos los errores en el código y concluimos satisfactoriamente la práctica.
Salomón Medina Álvaro Eduardo: En esta práctica se observó el
funcionamiento de un sensor de temperatura conectado a nuestro micro, para
después en nuestra pantalla LCD poder leer la lectura en la misma.
Con esta práctica pude aprender a juntar o sincronizar la parte de hacer
conversiones, imprimir en la pantalla y usar amplificadores operacionales.
En general me parece una práctica muy interesante que, aunque nos costó algo
de trabajo terminar, fue muy significativa para aprender a usar los
microcontroladores.

También podría gustarte