TP3 ej 5 y 6 - nachocarballeda/embebidos_fiuba GitHub Wiki

Ejercicio 5

A partir del programa de ejemplo adc_dac, vamos a probar el funcionamiento del conversor A/D. Con un resistor de valor igual o superior a 1k, y según lo que muestra la imagen adc_dac_pins.png del ejemplo:

a. Conectar a través del resistor la entrada de A/D a 3.3v y verificar por la terminal de debug que indique el fondo de escala.

Tal como indica el enunciado se conecto el AD CH1 a 3.3V mediante un resistor para medir el fondo de escala, como se puede ver, el mismo es 1023.

b. Conectar a través del resistor la entrada de A/D a 0v y verificar por la terminal de debug que indique el valor nulo.

c. Conectar 2 resistores de igual valor de la siguiente manera: 3,3v -///-- A/D -///-- 0v y verificar por la terminal de debug que indique un valor cercano al centro de escala.

(0v .. 3,3V) -> RESISTOR -> A/D -> UART (USB).TX -> TERMINAL (PC) -> TEXTO (PC)

Los resistores utilizados no son iguales, por lo cual el valor final no es el centro de la escala.

Utilizamos un resistor de 1k y otro de 328 ohms. Por lo cual se da la siguiente relacion:

vo= vi* 328/(1000+328) = 0.246

Resultando el valor de cuenta esperado:

1024*0.246 = 252

Ejercicio 6

A partir del programa de ejemplo adc_dac, vamos a probar el funcionamiento del conversor D/A y vamos a verificarlo con el ejercicio anterior:

a. Modificar el ejemplo para que con las teclas numéricas (de 0 a 9) se pueda variar la tension de salida del DAC el valor de la salida DAC (donde el “0” corresponde con 0v y el “9” con 3,3v).

TECLA (0 - 9) -> TERMINAL (PC) -> UART (USB).RX -> DAC -> (0 - 3,3v)

Ingresando el caracter 0, se puede leer un valor cercano a 0 volts.

Ingresando el caracter 9, se puede leer un valor cercano a 3.3 volts.

b. Agregar al punto anterior la funcionalidad del ejercicio 5 para poder visualizar por la consola la variacion de tension que le aplicamos al A/D. Para ello se debe armar un loopback a través de puerto serie:

bornera 15 [DAC] --///-- bornera 11 [ADC (CH1)] con un resistor de valor igual o mayor a 1k.

TECLA (0..9) -> TERMINAL (PC) -> UART (USB).RX -> D4AC -> (0..3,3v) -> RESISTOR -> ( 0v .. 3,3V) -> RESISTOR -> A/D -> UART (USB).TX -> TERMINAL (PC) -> TEXTO (PANTALLA)

Programa utilizado para el punto 6:

#include "sapi.h"        // <= sAPI header

char global_c;

void onRx( void *noUsado )
{
   global_c = uartRxRead( UART_USB );
   printf( "Recibimos <<%c>> por UART\r\n", global_c );
}


/* FUNCION PRINCIPAL, PUNTO DE ENTRADA AL PROGRAMA LUEGO DE RESET. */
int main(void){

   /* ------------- INICIALIZACIONES ------------- */

   /* Inicializar la placa */
   boardConfig();

   /* Inicializar UART_USB a 115200 baudios */
   uartConfig( UART_USB, 115200 );
   // Seteo un callback al evento de recepcion y habilito su interrupcion
   uartCallbackSet(UART_USB, UART_RECEIVE, onRx, NULL);
   // Habilito todas las interrupciones de UART_USB
   uartInterrupt(UART_USB, true);

   /* Inicializar AnalogIO */
   /* Posibles configuraciones:
    *    ADC_ENABLE,  ADC_DISABLE,
    *    ADC_ENABLE,  ADC_DISABLE,
    */
   adcConfig( ADC_ENABLE ); /* ADC */
   dacConfig( DAC_ENABLE ); /* DAC */

   /* Configuración de estado inicial del Led */
   bool_t ledState1 = OFF;

   /* Contador */
   uint32_t i = 0;

   /* Buffer */
   static char uartBuff[10];

   /* Variable para almacenar valores temporales */
   uint16_t muestra = 0, muestra_anterior = 1024, valor_a_setear;
   uint16_t valor_leido_adc;

   /* Variables de delays no bloqueantes */
   delay_t delay1;
   delay_t delay2;

   /* Inicializar Retardo no bloqueante con tiempo en ms */
   delayConfig( &delay1, 100 );
   delayConfig( &delay2, 200 );


   /* ------------- REPETIR POR SIEMPRE ------------- */
   while(1) {

      /* delayRead retorna TRUE cuando se cumple el tiempo de retardo */
      if ( delayRead( &delay1 ) ){

    	 muestra = global_c - '0';

    	 if(muestra>=0 && muestra<=9) {
             if(muestra != muestra_anterior) {
	         valor_a_setear = muestra*113.77;
		 if(valor_a_setear > 1023) valor_a_setear = 1023;
		 printf( "Seteamos el DAC en  <<%u>> \r\n", valor_a_setear);
		 /* Escribo la muestra en la Salida AnalogicaAO - DAC */
		 dacWrite( DAC, valor_a_setear );
		 muestra_anterior = muestra;
             }
    	 }

      }

      /* delayRead retorna TRUE cuando se cumple el tiempo de retardo */
      if ( delayRead( &delay2 ) ){
         ledState1 = !ledState1;
         gpioWrite( LED1, ledState1 );

         valor_leido_adc = adcRead(CH1)*3.22;
		 printf( "Valor leido del ADC CH1 = <<%u>> mV \r\n", valor_leido_adc);
         /* Si pasaron 20 delays le aumento el tiempo */
         i++;
         if( i == 20 )
            delayWrite( &delay2, 1000 );
      }

   }

   /* NO DEBE LLEGAR NUNCA AQUI, debido a que a este programa no es llamado
      por ningun S.O. */
   return 0 ;
}
⚠️ **GitHub.com Fallback** ⚠️