Estoy construyendo un osciloscopio de hobby en ATmega16. Estoy probando ADC generando una onda cuadrada a 2 kHz con pequeña amplitud y aplicándola al pin ADC a través de una entrada capacitiva con un divisor de voltaje para cambiar el nivel cero.
Así es como se ve la señal después de ser muestreada por ADC:
Se ve bien, pero después de que empiezo a cambiar el nivel cero ajustando el potenciómetro, obtengo estos picos extraños:
Después de cambiar el nivel un poco más alto, se ve bien de nuevo:
En general, obtengo 3 rangos donde aparecen los picos.
ADMUX = (1 << REFS0); // AVCC with external capacitor at AREF pin
ADCSRA = (1 << ADEN)
| (1 << ADIE)
| (1 << ADATE)
| (1 << ADPS0)
| (1 << ADPS1)
| (1 << ADPS2); // Division factor = 128
MCUCR |= 1 << SM0;
MCUCR |= 1 << SE; // Sleep-mode enabled
ADCSRA |= (1 << ADSC);
volatile uint8_t adcLow;
volatile uint8_t adcHigh;
int main(void) {
....
while (1) {
if (ADCSRA != 0x00) {
USARTSendByte(adcLow);
USARTSendByte(adcHigh);
}
}
}
ISR(ADC_vect) {
adcLow = ADCL;
adcHigh = ADCH;
}
Los picos claramente se recortan a valores muy particulares (probablemente una potencia de dos) o está utilizando números enteros con signo que son demasiado pequeños para contener el valor total.
No proporcionó el código fuente completo, así que supongo que aquí. Probablemente intente ajustar el valor medido a un número entero demasiado pequeño. Haz un volcado de los valores que obtengas y encuentra los picos en ellos. Luego observe la representación binaria de estos números y vea si puede encontrar algo en común.
Con una estimación rápida, la distancia entre dos picos es de aproximadamente 1,28 V, un poco coincidentemente demasiado cerca del tamaño de un número entero de 8 bits con signo.
Aconsejo usar definiciones de tipo como int8_t
[-128:127], uint8_t
[0:255], int16_t
[-32768:32767], uint16_t
[0:65535], int32_t
[-2147483648:2147483647] y uint32_t
[0:4294967295], que muestra claramente cómo grande es la variable.
adcLow
y adcHigh
son del uint8_t
tipo por lo que el tamaño es suficiente para contener valores ADC.int value = (buffer[i + 1] << 8 | (buffer[i] & 0xFF))
en Java.
Ignacio Vázquez-Abrams
Ashton H.
tom l
yippie
uint16_t adcValue = ADC;
Ashton H.
Ashton H.
yippie