Codificación del DEMOQE128 - Gianluque/Proyecto-B GitHub Wiki

Para la adquisición y procesamiento de la data, se tenia que cumplir con las siguientes especificaciones:

* ADC DE 8 bits.
* Desarrollo de un filtro FIR del mayor orden posible.
* Adquisición, filtrado, entramado y envió de la data por puerto serial a 2kHz
* Hacer uso de uno o mas sensor analógicos y dos digitales.

Lectura de la data:

Como la intención del proyecto era mover la nave usando dos ejes del acelerómetro se necesitaba de entonces 2 canales de lectura del ADC, como este estaba muestreando a 8 bits de resolución entonces la data se almacenaba en 2 bytes respectivamente.

Filtro

Para el filtro se decidió realizar un filtro FIR del mayor orden posible y como se exigía poder realizar todas las operaciones a 8 bits de resolución a 2kHz entonces se necesitaba que el filtro realizara la convolución de la manera mas eficiente posible. Primeramente, había que considerar que los coeficientes del filtro los cuales se obtenían usando la función de Matlab, estaban en punto flotante, lo cual ralentizaba a nivel de cálculos la rapidez de procesamiento del filtraje, por lo que se decidió escalar los valores de los coeficientes multiplicándolos por 127 entre el valor máximo de ellos:

Coef*127/(Valor max)

Esto nos indica entonces que la salida de la data será en valores de un entero, es decir 16 bits, y para nuestro caso, se desea enviar dos enteros por puerto serial. Entonces para realizar lo cálculos de los valores del filtro de la manera más eficiente posible, se implementa un buffer circular el cual almacenará la data de ambos canales cuyo tamaño máximo es el orden del filtro. Así bien, como es necesario guardar la data mas antigua, el buffer circular está hecho de manera que guarde todos los datos a utilizar con una operación de escritura y saque el dato mas reciente almacenado con una operación de lectura. La función fir se encargará de realizar la multiplicación de la data y la irá almacenando en una variable entera.

// Filtro de la data
int fir(buffer *buffercito, char coef[], char tap ){

    int output=0;
    char *ptrco = coef;
    char i;

    for (i=0;i<=tap && *ptrco != 0;i++){
         // Se toma el valor mas reciente  del buffer y se multiplica por el primer valor del coeficiente   
		output+= (readn(buffercito,i)) * *ptrco++;
    }
 return output;

}

Entramado de la data

Debido a que se necesitan enviar la data equivalente a dos enteros, será necesario entonces utilizar un byte adicional para que se puedan establecer los bits de sincronización de la data, de la siguiente forma:

imagen

Se usa el bit más significativo del primer byte como 0 para establecer la sincronización de la data, el resto representa la data en si misma donde los dos primeros bytes corresponden al canal 1 y los otros dos al canal 2, el quinto byte es el que se uso como auxiliar el cual almacena la data de dos canales digitales y los bits mas significativos de cada byte, donde a representa el byte 1, b el byte 2 y así. Se decidió dejar el byte auxiliar de ultimo porque era más fácil realizar el entramado manejando enteros.

Envio de la data:

En el envío de la data se requiere enviar un bloque de 5 bytes, pero como la data es un entero pesa 6 bytes, es por ello que se decidió dejar el byte 5 como auxiliar de manera que toda la data este guardada en el byte mas significativo de ese entero, de manera que a la hora de enviar el bloque solo se pierda el byte el cual no fue utilizado.


// Envio de bloque de 5 bytes.
void SendData(int out[]){
	char error;
	char ptr;
	do{
		// Se envia un bloque de 5 bytes se pierde un byte no usado ya que es un arreglo de enteros.
		error = AS1_SendBlock(out,5,&ptr);
		

	
	}while(error!=ERR_OK);
}