Diferencia entre revisiones de «Vibrómetro»

Sin resumen de edición
Sin resumen de edición
Línea 27: Línea 27:
const int control_pin = 25;
const int control_pin = 25;
const int bias_pin = 26;
const int bias_pin = 26;
const int amplitude = 255;
const int neutral = 127;
const int neutral = 127;


int control_dac_val = neutral;
void setup() {
  Serial.begin(115200);


void setup() {
  dacWrite(bias_pin, 150);
 
  Serial.begin(115200);
   pinMode(34, INPUT);
   pinMode(34, INPUT);
   analogSetAttenuation(ADC_0db);
   analogSetAttenuation(ADC_0db);
}


  // Cuando control está 127, Vout = 0.
int dac = 127;
  dacWrite(bias_pin, 118);
  dacWrite(control_pin, control_dac_val);
}


void loop() {
void loop() {
   #define BUFELEMS 32
   const int amplitude = 20; // max = 120
  #define SAMP_PERIOD_MS 32
   const int center = 127;
 
  int x = analogRead(34);
  int buf[BUFELEMS];
  if (x > 2500) dac++;
   for (int i = 0; i < BUFELEMS; i++) {
   if (x < 1500) dac--;
    buf[i] = analogRead(34);
   if (dac < 0) dac = 0;
    delay(SAMP_PERIOD_MS);
   if (dac > 255) dac = 255;
   }
 
  int sum = 0;
   for (int i = 0; i < BUFELEMS; i++) {
    sum += buf[i];
   }
  const int adc_avg = sum / BUFELEMS;


   const int adc_target = 2047;
   dacWrite(control_pin, dac);
 
  int error = adc_avg - adc_target;
  if (error >  100) error =  10;
  if (error < -100) error = -10;
  control_dac_val -= error;


   if (control_dac_val <= 0)  control_dac_val = 0;
   Serial.print("0 5000 ");
   if (control_dac_val >= 255) control_dac_val = 255;
  Serial.print(dac * 10);
   dacWrite(control_pin, control_dac_val);
   Serial.print(" ");
   Serial.println(x);
   delay(1);
}
}
</syntaxhighlight>
</syntaxhighlight>