Hola a todos, es un placer estar de nuevo por acá pidiendo sus aportes y comentarios.
Estoy implementando un barrido digital para simular el comportamiento de un potenciometro, que luego incorporare a otro sketch, que adjunto mas adelante en el cual interesa usar la salida DAC del DUE para hacer pruebas.
Usando la entrada digital 11 como entrada para el pulsador, necesito realizar un barrido usando un pulsador normalmente abierto entre los valores de 0 a 2 con pasos de 0.1 esto para simular digitalmente el comportamiento de un potenciomentro que tendré conectado mas adelante.
En realidad ya pude hacerlo pero quisiera sus opiniones, quizás pueda hacerlo de una forma mas sencilla o eficiente tal que consuma menos recursos de mi placa arduino, en este caso el Due, puesto que este sketch solo hace parte de otro aun mas grande que voy a incorporar.
int estadoActual1=0; //Guarda el estado actual del pulsador
int estadoActual2=0;
int estadoUltimo=0; //Guarda el último estado del pulsador
int contador=0; //Guarda las veces que se presiona el pulsador
void setup() {
pinMode(11,INPUT);
Serial.begin(9600);
}
void loop() {
float Vcc;
float paso=0.1;
float Vi=0;
estadoActual1=digitalRead(11);
delay(10);
estadoActual2=digitalRead(11);
// comprobando que los dos estados son iguales y asi solucionar el efecto bounce
if (estadoActual1 == estadoActual2){
if(estadoActual1 != estadoUltimo) { if(estadoActual1 == HIGH) { if(contador>=20) {contador=0;}
contador = contador + 1;
Vcc= Vi + contador*(paso);
Serial.println("Esta es la pulsacion n°: ");
Serial.println(contador);
Serial.println("Valor de vcc n°: ");
Serial.println(Vcc);
}
}
}
estadoUltimo= estadoActual1;
}
En la continuación del proyecto adjunto el código, este consiste en leer una entrada análoga de 60Hz, y luego realizar un control con ella, en este básicamente me gustaría saber como puedo usar las salidas DAC del arduino DUE para verificar algunos comportamientos del código con la salida DAC en un osciloscopio. Específicamente las variables que necesito son V1 y V2 del código, puesto que la señal de entrada es V1 y esta la integro internamente usando un filtro digital pasa-bajos de orden uno y luego asignandola a la variable V2.
uint32_t tiempo=0;
float V1,V2,V3=1,V4,V5,V6,V7,deltaT=0.1,V2a;
float T=1/60.0,Vcc;
float V2ant=0.1,V1ant=0,V10;
int tiempo2=0,tiempo3=0;
uint32_t now;
void setup() {
Serial.begin(250000);
pinMode(A0,INPUT); //Lectura señal AC
pinMode(A1,INPUT); //Lectura señal potenciometro.
pinMode(11,INPUT); //Lectura Señal pulsador para hacer un barrido.
pinMode(12,OUTPUT); //Pulso de encendido SCR1 y SCR2
pinMode(13,OUTPUT); //Pulso de encendido SCR3 y SCR4
}
void loop() {
now=micros();
deltaT=(now-tiempo)*10-6;
tiempo=now;
V1=analogRead(A0)*2.0/1023.0-1.0;
V2=deltaT*(V1-V2ant*0.0001)+V2ant; // Filtro de primer orden pasa bajos que a bajas frecuencias se comporta como un integrador.
V2a=(V2/V3);
if (V2>V3){V3=V2;}else{V3=V3;}
V4=1+V2a;
V5=1-V2a;
// V3=1;// Detector de picos
// V4=V3+V2a;
// V5=V3-V2a;
// Vcc=2.0*analogRead(A1)/1023.0;
// if (Vcc>V4 && Vcc>V5 && Vcc<V4 && Vcc<V5){if (V4>V5){Vcc=V4;}else{Vcc=V5;}}
// if (Vcc<V4 && Vcc<V5){if (V4<V5){Vcc=V4;}else{Vcc=V5;}}
//if (Vcc<=0.33){Vcc=0.33;}
//if (Vcc>=1.6){Vcc=1.6;}
V2ant=V2;
V1ant=V1;
// Codigo para realizar barrido
////////////////////////////////////////////
// Finaliza estructura que realiza el barrido
if (V4>Vcc){
V6=0;}else{V6=1;tiempo2=now;}
if (V5>Vcc){
V7=0;}else{V7=1;tiempo3=now;}
if (V6==V7){if(tiempo2>tiempo3){V6=0;digitalWrite(13,LOW);V7=1;digitalWrite(12,HIGH);}else{V6=1;digitalWrite(13,HIGH);V7=0;digitalWrite(12,LOW);}}else{
if(V6==1){digitalWrite(13,HIGH);}else{digitalWrite(13,LOW);};
if(V7==1){digitalWrite(12,HIGH);}else{digitalWrite(12,LOW);}}
// if (micros()>100000){}
//Serial.println(V2a);
// Serial.println(deltaT);
Serial.print("Vcc: ");
Serial.println(Vcc);
//Serial.print("Angulo SCR1: ");
//Serial.println(acos(Vcc-1.0)*180.0/3.1416);
//Serial.print("Vo(alpha): ");
//Serial.println(acos(2*V1*cos(acos(Vcc-1.0))));
//Serial.print("Angulo SCR2: ");
// Serial.println(acos(1.0-Vcc)*180.0/3.1416);
//Serial.print("Vo(alpha): ");
//Serial.println(acos(2*V1*cos(acos(1.0-Vcc))));
//yolocoloqSerial.println(acos(Vcc-1.0)*180.0/3.1416);Serial.print(' ');Serial.print(acos(1.0-Vcc)*180.0/3.1416);
// Serial.print(Vcc);Serial.print(' ');Serial.println(V4);
//Serial.print(Vcc);Serial.print(' ');Serial.print(V4);Serial.print(' ');Serial.println(V5);
}
Muchas gracias a Todos.