TP3 ej 5 y 6 - nachocarballeda/embebidos_fiuba GitHub Wiki
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
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 ;
}