Estoy enviando los resultados de ADC desde un controlador ATmega16 a una PC a través de CP2102 . Baudrate: 0.5Mb / s, 8 bits de datos, 1 bit de parada, sin paridad. He escrito un software para visualizar los datos recibidos. Este es un ejemplo de los resultados de ADC de muestrear una señal de onda sinusoidal:
Enalgúnmomento,miPCestababajounacargapesadayesteeselresultadoquetuve:
En mi pregunta anterior asumí que estos picos fueron causados por el propio ADC . Sin embargo, ahora se ve claramente que estos picos son causados por errores de transmisión.
Por lo que entiendo, este problema ocurre debido al desbordamiento del búfer de CP210 TX. ¿Mi suposición es correcta? Y si es así, ¿qué se puede hacer para evitar esto?
Además de estos picos, también he encontrado otro problema. Estoy enviando dos bytes consecutivamente (ADCL y ADCH). Lo que he notado es que a veces se intercambian los bytes recibidos (es decir, se recibe ADCH antes de ADCL).
He volcado algunos datos donde ocurren los picos (el primer byte es ADCH, el segundo es ADCL y el número es el valor entero resultante)
Ejemplo 1:
821 : 00000011, 00110101
803 : 00000011, 00100011
783 : 00000011, 00001111
1018 : 00000011, 11111010
740 : 00000010, 11100100
718 : 00000010, 11001110
694 : 00000010, 10110110
Ejemplo 2:
229 : 00000000, 11100101
237 : 00000000, 11101101
246 : 00000000, 11110110
255 : 00000000, 11111111
10 : 00000000, 00001010
276 : 00000001, 00010100
289 : 00000001, 00100001
Actualización: se agregó rutina de inicialización de inicio de sesión
#define F_CPU 16000000UL
#define USART_BAUDRATE 500000
#define BAUD_PRESCALE ((F_CPU / (USART_BAUDRATE * 16UL)) - 1)
void USARTInit() {
UBRRH &= ~(1 << URSEL);
UBRRH = (unsigned char) (BAUD_PRESCALE >> 8);
UBRRL = (unsigned char) BAUD_PRESCALE;
UCSRB = (1 << TXEN) | (1 << RXEN) | (1 << RXCIE);
UCSRC = (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0); // 1 stop bit, 8-bit data length
}
Actualización: agregó una prueba simple para usart
He deshabilitado ADC y he reemplazado mi rutina principal con un simple bucle:
for (uint16_t i = 0; i < 1023; i++) {
USARTSendByte(uint8_t(i));
USARTSendByte(uint8_t(i >> 8));
}
Cuando inicio el terminal en mi computadora y pongo el sistema bajo una gran carga (muchos procesos en segundo plano) a veces recibo resultados como estos:
...
252 : 00000000, 11111100
253 : 00000000, 11111101
254 : 00000000, 11111110
255 : 00000000, 11111111
0 : 00000000, 00000000
257 : 00000001, 00000001
513 : 00000001, 00000010
769 : 00000001, 00000011
260 : 00000001, 00000100
261 : 00000001, 00000101
...