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.
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


0