Sensores capacitivos y potenciómetros
danyraziel20 de Septiembre de 2012
1.635 Palabras (7 Páginas)537 Visitas
ráctica numero 9 Sensores capacitivos y potenciómetros
1.- Sensores de nivel hecho con varillas:
Para este circuito se hizo un divisor con capacitores, uno fijo y otro el hecho por las varillas. El diagrama del circuito quedo de la siguiente manera:
Las variaciones de voltaje respecto a la altura a la que se introducían las varillas dentro del agua se muestran en la siguiente tabla:
Altura [cm]
Voltaje de salida [v]
4
0.99
10
0.97
15
0.96
19.5
0.93
23
0.92
Podemos ver que las variaciones de voltaje son muy pequeñas, pensamos que se debe a que el estaban muy separadas las varillas y que el aislante era demasiado grueso.
A continuación se muestra la grafica de altura a la que se está introduciendo contra el voltaje de salida:
2.-Sensor capacitivo de toque.
I. Encender un led cuando se toca y cuando se suelta se apaga
II. Encender una carga cuando se toca y se suelta, y cuando lo volvemos a tocar y soltar se apaga la carga.
Para estos dos incisos se diseño y construyo el siguiente circuito:
Utilizamos un microcontrolador ATMEGA8. Y un puente con resistencias y capacitores para usar el sensor capacitivo de toque.
El diseño del sensor capacitivo es de dos círculos concéntricos como se muestra en la siguiente figura:
Se utilizo papel para cubrir el sensor, la capacitancia medida sin tocar el capacitor fue de 7 uF, al momento de tocarlo con el pulgar la capacitancia sube a 10 uF.
Ya en el puente para el acondicionamiento al no tocarlo tenemos un voltaje de 1.5 v, al momento de tocarlo el puente arroja un voltaje de 4.3 v. Que es lo suficiente para que el AVR lo reconozca como un 1 lógico y de esta manera mediante el programa diseñado realicemos las dos acciones solicitadas.
El programa utilizado fue el siguiente:
;Configuracion del AVR a utilizar y declaracion de variables
.include "m8def.inc"
.def temp=r16
.def giro=r17
;Vector de interrupcion de reset
.org 0x00
rjmp reset
reset: ;Configuracion de la pila
ldi temp,low(ramend)
out spl,temp
ldi temp,high(ramend)
out sph,temp
;configuracion del Puerto B y C como salida
ser temp
out ddrb,temp
out ddrc,temp
;Configuracion de Puerto D como entrada
clr temp
out ddrd,temp
;Cargar variable giro con cero
ldi giro,0
begin: ;Mandamos al Puerto C el valor de “giro” que es donde está conectado el motor
out portc,giro
ldi temp,0 ;Cargamos con cero a “temp”
out portb,temp ;Mandamos al Puerto b el valor de “temp”
;Preguntamos si hay un uno en el pin 0 del puerto D que es donde esta la salida del puente de capcitores y resistencias, si hay un uno va a la etiqueta encendido, si hay un cero regresa a la etiqueta begin
sbis pind,0
rjmp begin
encendido:
;En esta parte , cargamos “temp” con 2 y lo mandamos por el puerto b para que de esta manera encendamos el led
ldi temp,2
out portb,temp
;Preguntamos si hay un cero en el pin 0 del Puerto D, que es donde tenemos el touch sensor, si hay un cero significa que se dejo de tocar y vamos hacia la etiqueta inversión, de lo contrario regresamos a la etiqueta encendido
sbic pind,0
rjmp encendido
inversion:
;En esta parte analizamos el valor de “giro” de esta manera sabemos si el motor estaba encendido o apagado,
cpi giro,0 ;Comparamos “giro” con 0 para saber si estaba apagado
breq carga1
rjmp otro
carga1: ;Si estaba apagado mandamos 48 al puerto C para encender el motor
ldi giro,48
rjmp begin
otro:
cpi giro,48;Comparamos “giro” con 48 para saber si estaba encendido
breq carga0
rjmp begin
carga0: ;Cargamos giro con cero para apagar le motor
ldi giro,0
rjmp begin ;regresamos al principio del programa
3.- Sensor de posición resistivo:
I. Potenciómetro para medir en grados la posición con un vástago.
Para este punto se diseño y construyo el siguiente circuito:
Se utilizo un pontenciometro de 1K al cual se le adapto un vástago para poder mover la perilla. Se utilizo un microcontrolador AVR ATEMGA8535 con el cual mediante el convertidor analógico a digital hacemos la lectura del voltaje que da el potenciómetro. El voltaje de referencia utilizado para el ADC del AVR fue de 5v
Se realizaron las mediciones de resistencia y voltaje que arrojaba el potenciómetro a intervalos de 30° de 0° a 300°. Teniendo estos valores en el AVR desplegábamos en displays de 7 segmentos el valor en grados correspondiente al voltaje de entrada en el ADC dado por la posición del potenciómetro.
Como desplegaríamos las posiciones cada 30 grados decidimos dejar un display que siempre indicara cero ya que nunca cambiaria que es el que corresponde a las unidades.
En las siguiente tabla se engloban las mediciones y datos esperados:
Posicion [°]
Resistencia [ohms]
Voltaje [v]
Valor ADC [decimal]
0
43
0
0
30
70
0.17
08
60
157
0.7
35
90
283
1.28
61
120
360
2
100
150
460
2.58
129
180
580
3.12
156
210
720
3.83
192
240
850
4.37
220
270
880
4.9
246
300
918
5.04
253
A continuación se muestra la grafica de variación de posición contra voltaje.
A continuación se muestra el código del programa diseñado para el control de este circuito:
;Configuracion del AVR y de variables
.include "m8535def.inc"
.def temp=r16
.def adc_low=r17
.def adc_high=r18
.def distance=r19
.def decena=r20
.def temp2=r21
.def t1=r22
.def t2=r23
.def t3=r24
;Configuracion de los vectores de interrupcion
.org 0x00
rjmp reset
.org 0x0E ;Configuracion del vector de interrupción del ADC
rjmp adc_complete
.org 0x15
reset: ;Configuracion de la pila
ldi temp,low(ramend)
out spl,temp
ldi temp,high(ramend)
out sph,temp
;Configuración de puertos B, C y D como salida
ser temp
out ddrb,temp
out ddrc,temp
out ddrd,temp
;Configuración de Puerto A como entrada
clr temp
out ddra,temp
;Configuracion del ADC en 8 bits
ldi temp,0x21
out admux,temp
ldi temp,(1<<aden)|(1<<adate)|(1<<adie)|(5<<adps0)
out adcsra,temp
sei;Inicializacion de las interrupciones
;inicializacion del ADC
sbi adcsra,adsc
begin:
;En cada parte que se indica “gX” corresponde a una posición.
;Primero se compara el valor del ADC con el valor decimal esperado que se ha calculado de acuerdo al voltaje medido para esa posicion
;g0
cpi adc_high,0
breq g0
cpi adc_high,1
breq g0
brne s1
;En caso de que el valor coincide se manda a llmar unas subrutinas que cargan a la variable temp con el valor necesario para desplegar en displays los numerous que nos representan en grados la posicion a la cual se encuentra el potenciometro. Si el valor no concide se sigue con la siguiente etiqueta sx, para comparar con otro valor.
g0:
rcall cero
out portc,temp
rcall cero
out portd,temp
rcall delay
rjmp begin
s1:
;g30
cpi adc_high,2
breq g30
cpi adc_high,3
breq g30
cpi adc_high,4
breq g30
cpi adc_high,5
breq g30
brne s2
g30:
rcall cero
out portc,temp
rcall tres
out portd,temp
rcall delay
rjmp begin
s2:
;g60
cpi adc_high,32
breq g60
brne s3
g60:
rcall cero
out portc,temp
rcall seis
out portd,temp
rcall delay
rjmp begin
s3:
;g90
cpi adc_high,61
breq g90
brne s4
g90:
rcall cero
out portc,temp
rcall nueve
out portd,temp
rcall delay
rjmp begin
s4:
;g120
cpi adc_high,97
breq g120
brne s5
g120:
rcall
...