Microcontroladores - Controlador Discreto ON-OFF

 
Vista:
Imágen de perfil de Carlos Alberto
Val: 2
Ha aumentado 1 puesto en Microcontroladores (en relación al último mes)
Gráfica de Microcontroladores

Controlador Discreto ON-OFF

Publicado por Carlos Alberto (1 intervención) el 23/02/2021 02:50:25
Buen día a todos, compañeros.
Soy un estudiante y apenas me estoy adentrando en el mundo de los microcontroladores. He venido a consultar ya que me pidieron leer una entrada de voltaje analógico usando un ATMEGA328P. Lo hice haciendo uso del ADC y probé que la salida sí funcionara. Una vez superado eso, debo calcular en una variable la diferencia entre un valor fijo y el valor de lectura. Si esta diferencia es mayor o igual que 0 debo poner en alto un pin de salida, en caso contrario será estado bajo. Aquí mi problema, pues al principio probé mi código con un valor de consigna de 2.5 y funcionó, pero cuando pruebo otro valor no respeta la regla. Sé que me estoy equivocando en cómo interpreta el uC los números negativos y seguramente en otras cosas, pero repito, no tengo experiencia en este campo. Adjunto mi código aquí, les agradezco mucho de antemano su ayuda.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/*
 * Comparador Voltaje.c
 *
 * Created: 17/02/2021 09:09:29 p. m.
 * Author : Carlos Sánchez
 */
 
#define F_CPU 16000000L
#include <avr/io.h>
#include <util/delay.h>
 
//Función de inicialización para el ADC
void ADC_init(void)
{
	//Se indica el voltaje de referencia (en este caso AVcc), la salida se posiciona a la izquierda en el reg ADC y
 se establece el ADC0 como entrada
	ADMUX  |= (1<<REFS0);
	//Se habilita el ADC y se usa un preescalador de 128 para que 16MHz/128 = 125kHz (valor dentro del rango adecuado)
	ADCSRA |= (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
}
 
int main(void)
{
	ADC_init();
 
	//Se inhabilita la entrada digital de ADC0 para ahorro de energía
	DIDR0  |= (1<<ADC0D);
 
	//Se inician variables
	float setpoint = 3, Vref = 5, valor_dec, err;
 
	//Se habilita el primer bit del puerto D como salida
	DDRD = 1;
	//Bucle para leer el voltaje de entrada continuamente
	while (1)
	{
		//Inicia la conversión
		ADCSRA |= (1<<ADSC);
		//Se convierte el valor de salida del ADC a decimal
		valor_dec = (ADC*Vref)/1024;
		//Cálculo del error
		err = setpoint - valor_dec;
		//Encendido o apagado del led
		if (err>=0) PORTD = 1;
		else        PORTD = 0;
	}
		return 0;
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder