[Aporte] Tutorial ARM Cortex-M3 - LPC1768

#81
la variable contador, la estoy limitando a 8, osea pregunto si contador es igual a 8 y si es igual, muestro el dato y después pongo el contador en 0.

Voy a probar la función que me pasaste vos. Che te hago una pregunta, viste que te pregunte si habías probado varios canales de ADC en simultáneo? Yo estuve probando pero me pasa algo raro, se me copia el valor del primer canal. Debería parar y arrancar el canal de ADC una vez que termine de convertir?

Gracias
 
#82
la variable contador, la estoy limitando a 8, osea pregunto si contador es igual a 8 y si es igual, muestro el dato y después pongo el contador en 0.
En el fragmento de código que subiste no se vió, pero seguís teniendo problemas con la división.

Che te hago una pregunta, viste que te pregunte si habías probado varios canales de ADC en simultáneo? Yo estuve probando pero me pasa algo raro, se me copia el valor del primer canal. Debería parar y arrancar el canal de ADC una vez que termine de convertir?

Gracias
Como te dije ante (prestá más atención a los mensajes!), en la mayoría de los uC, hay que hacer una conversión de descarte c/vez que cambias de canal, ya que de lo contrario tomás el valor del canal anterior.
 
#83
Leí el mensaje, diculpa que hago preguntas obvias, pero soy nuevo en esto. Agradezco mucho tu ayuda.



Estuve probando el código, pero me da error en la función promediar_datos

Código:
 if(flag_timer1) //Configuro el timer1 (o cualquier timer disponible), para que c/cierto tiempo envíe el promedio móvil por uart (ej. c/1 seg). 
           { 
              promediar_datos(muestra_adc,&promedio_movil); //Funcion que promedia las muestras 
              convertir_digitos_u16_serie(peso,promedio_movil);
			  GUI_Text(90,144,"PESO",White,Red);
			  GUI_Text(90,160,peso,White,Red);
			 // enviar_string_uart0(" Conversion promediada= \n");  
             // envia_u16_string_uart0((u16)(promedio_movil)); 
           }
..\USER\main.c(369): error: #159: declaration is incompatible with previous "promediar_datos" (declared at line 182)

Código:
void promediar_datos(u16 muestras[],unsigned long int *promedio_movil) 
{ 
    u8 cont; 
     
    *promedio_movil=0; 
    for(cont=0;cont<MUESTRAS_MAX;cont++) 
        *promedio_movil+=muestras[cont]; 
                                     
    *promedio_movil=(u16)(*promedio_movil/MUESTRAS_MAX); 
}
 
Última edición:
#84
Seguro que el error está en la declaración de la variable de tipo "unsigned long int" por u32, usá un typedef o directamente reemplazá u32.

Fijate que también tengas las definiciones de u8 y u16.
 
#85
se les ocurre alguna forma de usar el LPC1768 para medir la frecuencia de una señal analógica?

Pense en usar el ADC y contar las veces que pasa el offset que hay que ponerle a la señal (para que no tenga valores negativos) en un tiempo, pero no se si sera muy correcto...
 
#86
hola
podrian ayudarme a conseguir un pitido intermitente a una frecuencia de 900Hz. primero tiene que ser fijo y luego pasar a ser intermitente, se que tengo que utilizar un DAC pero no se como.
muchas gracias
 
#88
tiene que dar una salida analogica

Código:
#include "LPC17xx.H"
#define DAC_BIAS 0x00010000
uint32_t f=900; //900Hz
 void DACInit(void);
int main(void)
{
	
	/*inicializar  DAC*/
	DACInit();
		while(1){
			
		LPC_DAC->DACR=(f<<6) | DAC_BIAS;
		
	}
}

	 void DACInit(void)
{
	
	LPC_PINCON->PINSEL1=0x00200000; // p0.26 como DAC salida
	return;
}
este es el codigo que he utilizado para el pitido fijo pero no funciona, soy nueva en esto y no tengo ni idea de como hacerlo
 
#89
A ver, insisto que no es necesario usar el DAC para generar un pitido, alcanza usando una señal digital en forma alternada a la frecuencia que buscas para generar el sonido buscado.

Dicho esto, volviendo al tema del DAC, un DAC es un periférico que solo se encarga de tirar a la salida el nivel de tensión que vos le indicaste y su rango de funcionamiento irá de 0 a 3,3v.

El problema conceptual que tenés, es que vos nunca actualizas el valor del DAC, para generar una señal por ej. senoidal vas a tener que ir tirando los niveles de tensión que forman una senoidal en un determinado tiempo.

Por ej. para que entiendas mejor, suponé una senoidal de 1kHz que solo la vas a muestrear en 10 pts, eso implica que necesitas actualizar el valor del DAC cada 1mS/10=100uS, por lo tanto además de usar un DAC vas a necesitas un timer.

Te recomiendo que leas la Séptima Parte - DAC del tutorial.
 
#92
¿cómo de preciso son las interrupciones externas en cuanto a la subida/bajada de flanco? Quiero decir... saltarían con una señal analógica senoidal de 0.2v de amplitud y 50hz de frecuencia por ejemplo?
 
#94
Te tiro una ayuda.

Entonces leyendo esa hoja, ¿se puede hacer lo que decís?
No vi nada en esa hoja. Lo lleve a la practica y no me funcionó.

Mirando el ADC, hay una cosa que no entiendo.
¿para qué sirve configurar el clock?

Entiendo que sirve para que el ADC esté convirtiendo continuamente con una frecuencia debida al clock, pero en las simulaciones no parece que sea así, sino que necesita de un Timer para que cada X segundos convierta (puesto que se ha activado de nuevo con LPC_ADC->ADCR=(1<<ADC_START); en el Timer)

si no es así, cómo es?

Mi propósito es muestrear una señal a 100kHz conectada al ADC, por tanto, el ADC debe estar continuamente convirtiendo a 100kHz y guardando los valores.

Gracias
 
#95
No vi nada en esa hoja. Lo lleve a la practica y no me funcionó.
Si te metés en la sección "Static Characteristics", vas a encontrar un cuadro acerca de las características eléctricas de los pines en general donde menciona:

Vih-min=0,7.Vdd
Vil-max=0,3.Vdd
Vhys=0,4.Vdd (está mal en la hoja)

Por lo tanto si Vdd=3,3v:

Vih-min=2,31v
Vil-max=0,99v
Vhys=1,32v

Esto quiere decir que para detectar un nivel como alto, este deberá ser mayor a 2,31v, para detectar un nivel bajo la tensión deberá ser menor a 0,99v.

En el medio hay una banda de tensiones que están fuera de esos límites y como los puerto no tienen un schmitt interno, en esos valores la entrada puede valer cualquier cosa.

En tu caso, como la señal es de 0,2v => no superás esa banda de incertidumbre y por lo tanto es imposible que funcione, incluso tampoco superás la tensión máxima de 0,99v de un nivel bajo. Por otro lado tenés el problema de que al ser una senoidal, tu paso por la zona "prohibida" es lento y puede provocar falsos disparos.

¿Qué haría yo?

1) Amplifico esa señal a niveles más comodos.
2) Armo un schmitt trigger con operacionales o utilizo integrados ya armados para esta función que sean compatibles con los nuevos niveles de tensión que vas a tener.

Tené en cuenta que tal vez necesites agregar un offset (una continua) a esa senoidal.

Mirando el ADC, hay una cosa que no entiendo.
¿para qué sirve configurar el clock?

Entiendo que sirve para que el ADC esté convirtiendo continuamente con una frecuencia debida al clock, pero en las simulaciones no parece que sea así, sino que necesita de un Timer para que cada X segundos convierta (puesto que se ha activado de nuevo con LPC_ADC->ADCR=(1<<ADC_START); en el Timer)

si no es así, cómo es?

Mi propósito es muestrear una señal a 100kHz conectada al ADC, por tanto, el ADC debe estar continuamente convirtiendo a 100kHz y guardando los valores.

Gracias
El clock interno del ADC sirve para fijar la velocidad máxima con la que trabajará el ADC. Por ej. si configurás al ADC en 100kHz, sabés que una conversión te demorará 1/100kHz=10uS, de ese tiempo no podés escapar, siempre que conviertás, como mínimo tardás 10uS entre conversión y conversión.

Entonces tenés dos formas de usarlo:

- Disparo continuo.
- Disparo único.

Disparo continuo, el ADC está a full convirtiendo sin que nadie le diga nada y c/vez que termina con una interrupción deberías leer el dato de conversión. La frecuencia de conversión estará dada por el clock interno del ADC.

En cambio el disparo único sirve para hacer conversiones en forma esporádica, no necesariamente en forma periódica. Pero si se desea hacer en forma periódica se lo puede utilizar en conjunto con un timer, de esta forma (según yo lo veo) vas a tener un mayor control sobre los tiempo.

Si en tu aplicación tenés que muestrear en forma periódica a 100kHz, configuralo en forma continua a esa frecuencia y en la rutina de interrupción almacená el nuevo valor de conversión.
 
#96
Cosme, excelente tutorial!!!!!
Has probado algo con DMA?
Estoy con una aplicacion (ver topic 42254.0 del foro todopic ya que no puedo postear enlaces) en la que necesito sacar datos de forma serie muy rápido. Para ello eso el SPP0 como SPI y uso solo el MOSI. Eso ya lo tengo funcionando, pero quiero optimizar el código usando DMA.
Yo configuro como disparador del DMA un Match register de un timer. Luego configuro como source un array de char, como dest el registro DR del SSP0, la cantidad de bytes, etc. etc. Pongo el analizador logico en MOSI y veo que los datos salen perfecto. Pero salen en el primer Match del Timer con el MR0... la duda es, que debo hacer luego de que salen por primera vez los datos para que vuelvan a salir en el próximo Match?

Saludos!
 
#98
se les ocurre alguna forma de usar el LPC1768 para medir la frecuencia de una señal analógica?

Pense en usar el ADC y contar las veces que pasa el offset que hay que ponerle a la señal (para que no tenga valores negativos) en un tiempo, pero no se si sera muy correcto...
Puedes hacerlo utilizando los timers en modo captura, por ejemplo capturando dos flancos de subida consecutivos en una señal cuadrada.



Me encanta este tutorial Cosme, me es muy útil. Por casualidad, has trabajado con la pantalla táctil que se puede incorporar a la tarjeta? Estuve cacharreando con ella y intentando mostrar datos capturados del ADC, no encuentro una función o una manera de conseguir visualizar en ella las adquisiciones :/
Me mire el manual de usuario y las diferentes librerías pero nada :(
Alguno sabéis como podría hacerlo?
 
Última edición:
#99
Me encanta este tutorial Cosme, me es muy útil. Por casualidad, has trabajado con la pantalla táctil que se puede incorporar a la tarjeta? Estuve cacharreando con ella y intentando mostrar datos capturados del ADC, no encuentro una función o una manera de conseguir visualizar en ella las adquisiciones :/
Me mire el manual de usuario y las diferentes librerías pero nada :(
Alguno sabéis como podría hacerlo?
Gracias.

Lamentablemente cuando compré el kit, no compré la pantalla, ahora me arrepiento un poco de eso, pero bue... :rolleyes:.
 
Una duda que me surgió. El ADC tiene una capacidad de conversión de 200KHz, pero me resulta poco creible. Serían 200000 conversiones por segundo, es raro.
Siguiendo tu código vos habilitas un timer0 para que pregunte si hay conversión de ADC
configura_timer0(25000,1000);
Por lo que estuve leyendo este timer interrumpe cada un segundo, es así?

Luego configuras el adc:

(convertir_adc(0,250,&valor_adc)>0)

Aca los estarías configurando a 100KHz?

Gracias por las aclaraciones
Saludos
 
Arriba