Diferencia entre revisiones de «Vibrómetro»
Sin resumen de edición |
Sin resumen de edición |
||
| Línea 20: | Línea 20: | ||
const int amplitude = 255; | const int amplitude = 255; | ||
const int neutral = 127; | const int neutral = 127; | ||
int control_dac_val = neutral; | |||
void setup() { | void setup() { | ||
pinMode(34, INPUT); | |||
analogSetAttenuation(ADC_0db); | |||
// Cuando control está 127, Vout = 0. | |||
dacWrite(bias_pin, 118); | dacWrite(bias_pin, 118); | ||
dacWrite(control_pin, | dacWrite(control_pin, control_dac_val); | ||
} | } | ||
void loop() { | |||
#define BUFELEMS 32 | |||
#define SAMP_PERIOD_MS 32 | |||
int buf[BUFELEMS]; | |||
for (int i = 0; i < BUFELEMS; i++) { | |||
buf[i] = analogRead(34); | |||
delay(SAMP_PERIOD_MS); | |||
} | |||
int sum = 0; | |||
for (int i = 0; i < BUFELEMS; i++) { | |||
sum += buf[i]; | |||
} | |||
const int adc_avg = sum / BUFELEMS; | |||
const int adc_target = 2047; | |||
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; | |||
if (control_dac_val >= 255) control_dac_val = 255; | |||
dacWrite(control_pin, control_dac_val); | |||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||