DAC_ADC_DMA
DESCRIPCIÓN
El acceso directo a memoria (DMA, del inglés direct memory access) permite a cierto tipo de componentes del microcontrolador acceder a la memoria del sistema para leer o escribir independientemente del CPU principal.
Una transferencia DMA consiste principalmente en copiar un bloque de memoria de un dispositivo a otro. En lugar de que la CPU inicie la transferencia, la transferencia se lleva a cabo por el controlador DMA. En este caso se moverán los datos obtenidos por el ADC a un registro declara como variable en la memoria RAM definido como adc_ch0[]. Tal operación no ocupa al procesador y, por ende, éste puede efectuar otras tareas. Las transferencias DMA son esenciales para aumentar el rendimiento de aplicaciones que requieran muchos recursos.
OBJETIVO
Al realizar este programa será utilizada la tarjeta FRDM-KL25Z y los objetivos a lograr serán los siguientes:
- Realizar por medio del DAC una onda senoidal de 60Hz.
- Por medio del ADC medir esta onda generada para poder almacenarla posteriormente en muestras usando el DMA.
- Poder utilizar el DMA por medio de dos canales distintos (en la FRDM-KL25Z hay 4 canales).
- Configurar adecuadamente los dos canales utilizados desde los registros de origen, de destino, el tamaño del bloque a transferir, etc.
- Realizar el monitoreo de datos por medio de FreeMaster.
- Poder modificar la señal senoidal generada (en amplitud y frecuencia) mediante FreeMaster.
HARDWARE
Para esta práctica se requiere solamente:
- tarjeta FRDM-KL25Z
- puente físico para conectar DAC con ADC
ARQUITECTURA DEL SOFTWARE
Se explica brevemente lo que debe hacer nuestro programa:
- El programa se encargará de sacar por medio del DAC una señal senoidal de 60Hz y amplitud Maxima 1.15Vcc.
- Debido a que la FRDMKL25Z solo maneja un umbral de voltaje de 0 a 3.3Vcc a la señal senoidal generada se le deberá sumar un offset de 1.15Vcc para que pueda apreciarse su forma completa en el rango de voltaje que maneja el DAC.
- EL DAC será disparado automática y periódicamente por un timmer TU1 de esta manera no se tendrá que recurrir a interrupciones o instrucciones dentro de las funciones o programa principal.
- El ADC estará midiendo esta señal senoidal generada con una frecuencia de muestreo de 3,840Hz.
- El ADC estará configurado de manera que esté realizando mediciones periódicas, es decir será disparado continuamente por un timmer TU2. De esta manera no se tendrá que recurrir a interrupciones o instrucciones dentro de las funciones o programa principal.
- Es necesario hacer físicamente un puente entre el pin de salida del DAC y el pin de entrada del ADC.
- Los valores obtenidos por el ADC serán directamente almacenados en otro registro, esta tarea será ejecutada por el canal 1 del DMA.
- Este ciclo se estará generando permanentemente pero también podrán modificarse dos variables que son la amplitud y la frecuencia de la onda senoidal.
- Hay dos funciones específicas para poder variar la frecuencia y valores de amplitud de la señal senoidal.
- Para modificar y a su vez monitorear la señal senoidal se usará FREEMASTER el cual tendrá estas dos variables como entradas.
DIAGRAMAS DE BLOQUES
Figura 1. Diagrama de flujo de la función main()
Figura 2. Diagrama de flujo de la función
mide_rms()
Figura 3. Diagrama de flujo de la función
gen_sen()
Figura 4. Diagrama de flujo de la interrupcion TU1_OnCounterRestart()
Figura 5. Diagrama de flujo de la interrupción
DMAT1_OnComplete()
Figura 6. Diagrama de flujo de la interrupción
DMAT2_OnComplete()
TABLA DE FUNCIONES
ProccesorExpert.c
|
|
main()
|
//
Función principal del programa, en esta se inicializan los dispositivos ADC,
DAC, los dos canales del DMA y los timmer’s que dispararán al DAC y al ADC.
Tambien
este programa tiene el bucle infinito encargado primero de modificar los
datos para el DAC el cual leerá los datos del registro gen_seno[] el cual
previamente es moficiado por la función gen_sen().
Después
la función mide_rms() encargada de realizar la medición de la señal generada
utilizando el ADC.
|
gen_sen()
|
//
Función que modifica el registro declarado gen_seno[], este registro contiene
los 32 datos usados como base para generar un ciclo senoidal de 1.15Vcc y es
el que será desplegado continuamente por el DAC. Sumándole al registro un
OFFSET para que la señal se muestre en el rango de 0 a 3.3Vcc y la multiplica
por una escala de 0 a 100 según lo que mandemos con FreeMaster.
|
mide_rms()
|
//
Función encargada de calcular el Vrms medido por el ADC, para realizar bien
esta tarea será necesario utilizar 32 muestras obtenidas por el ADC y después
aplicar la formula siguiente:
|
Events.c
|
|
DMAT1_OnComplete
(LDD_TUserData *UserDataPtr)
|
//
Esta función se encarga de asignar las direcciones donde iniciará y donde
terminará el bloque en el cual serán almacenadas las 64 muestras obtenidas
por el ADC para que posteriormente el DMAT1 reescriba los datos en dicho
bloque.
|
TU1_OnCounterRestart
(LDD_TUserData *UserDataPtr)
|
//
Esta interrupción del TU1 es la encargada de dar periódicamente la
instrucción al DAC para que este despliegue los datos leídos del registro
declarado en el programa como seno[].
|
DMAT2_OnComplete
(LDD_TUserData *UserDataPtr)
|
//
Esta interrupción hace que el DMAT2 transfiera los datos obtenidos (al medir
la señal senoidal con el ADC) al FreeMaster.
|
CONFIGURACIÓN DE LOS COMPONENTES
DMAT1
Canal 1 del DMA, este será el canal principal y que se encargará de almacenar los datos en el registro declarado como adc_ch0[] cada que el ADC realiza una medición hasta hacer un acumulado de 64 mediciones.
DMAT2
Este canal del DMA se encargará de hacer un acumulado de datos para estarlos enviando por medio de UART y FreeMaster, el envío de datos será de dos en dos bytes.
AD1
Dispositivo ADC con sus respectivas configuraciones y con el cual se leera la señal generada por el DAC, se puede ver en la configuración que haremos referencia a TU2 que será quien dispare automáticamente la lectura del ADC.
DA1
Dispositivo DAC encargado de general la señal senoidal.
TU1
Este dispositivo es el timmer que se encargará de disparar al DAC para que continué generando la señal de salida.
FMSTR1
Configuración para el Free Master.
DMA1
Esta es la configuración general del DMA la cual será agregada automáticamente por Proccesor Expert.
TU2
Este timmer será el responsable de disparar las mediciones del ADC, y será generado al agregarlo dentro de la configuración del AD1 mencionada anteriormente.
el proyecto es muy interesante y muy bueno, intente probar este ejemplo pero al configurar la variables dentro del programa FreeMaster leyendo en varios lugares y ejemplos de como configurar el freemaster, al comenzar la comunicacion me sale un error de Can not detect the board information! The communication
ResponderEliminarwill be paused. Error code: 0x80000101. podria pedirle el archivo .pmp para probar el ejemplo?. muchas gracias por el proyecto