TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: ppalou en 07 de Enero de 2005, 06:17:00

Título: Generador Funciones
Publicado por: ppalou en 07 de Enero de 2005, 06:17:00
Buenas,

Tengo que programar un generador de funciones (sinusoidal, triangular y cuadrada) con una PIC 16F877 y un DAC.
Me han recomendado realizar una tabla con los valores típicos del seno y irla recorriendo tan rápido como marque un timer.
Lo de pasarle estos valores al DAC no lo tengo muy claro porqué estos valores oscilan entre 0 y 1 (en el caso del seno ) y solo se pueden poner valores enteros en la salida, en el portb por ejemplo.

Alguien ha hecho alguna vez algo similar? Gracias
Título: RE: Generador Funciones
Publicado por: Modulay en 07 de Enero de 2005, 06:21:00
Sabes que DAC vas a utilizar?
A qué frecuencias va a trabajar?
Título: RE: Generador Funciones
Publicado por: ppalou en 07 de Enero de 2005, 06:28:00
Escrito originalmente por Modulay
Sabes que DAC vas a utilizar?
A qué frecuencias va a trabajar?


El DAC aun no lo he comprado, por lo que puedo usar el que me recomendeis.
A la salida del DAC necesito como mínimo 1 amperio y los valores de tensión deben oscilar entre +8 i -8 V pero para esto ya me preocupare de mirar los datasheet de los correspondientes DAC que me podais recomendar.

En cuanto a la frecuencia debe ir de 0 a 8Khz, debo ser capaz de cambiarla con botones de más y menos frecuencia, pero esta parte la tengo más o menos programada. El problema lo tengo con esto que comentaba, con lo los valores que pasarle al DAC.

Gracias
Título: RE: Generador Funciones
Publicado por: oshow en 07 de Enero de 2005, 08:03:00
Holas...

Nunca he trabajado con un ADC, pero recuerdo que en un examen (hace tiempo ya...) hicimos algo que quizas te pueda orientar. Pongo el documento (está mal escaneado y sólo tengo el enunciado)



La cuestión es que se quiere sacar una tensión entre 0 y 5V, entonces mediante la ecuación de la senoide, se van hallando los valores que hay que sacar al puerto B.

Es decir que para un tiempo t por ejemplo de 10 ms se tiene que llevar al puerto B el valor 2,5+2,5*sen(100*pi*10ms)=2.5V, este valor de tensión es el que se debe llevar al adc.Esto se puede hacer mediante una simple regla de tres.

Por ejemplo la tensión máxima que hay que sacar serían 5V y como disponemos de 8 bits, haces una regla de tres para sacar el valor a llevar al adc.

255-------5V
XXX-------2,5V (2.5+2.5*sen(100*pi*10ms))

Lo que salga en la x es lo que tienes que llevar al puerto B para sacar ese nivel de tensión. (unos 128 maomenos)

Ahora tienes que extrapolar esto a tu problema, tendrás que hacer los calculos para sacar +/-8V en lugar de 0/5V y a distintas frecuencias.

Es un trabajo largo, la verdad es que en el examen fue una putada, no por la dificultad, sino por el tiempo.

No se si es exactamente lo que preguntas, pero a mi me ha sonado a esto, pienso que podrías hacerlo de esta forma (entre otras posibles que seguro habrá).

Un saludo.

Título: RE: Generador Funciones
Publicado por: Modulay en 07 de Enero de 2005, 08:13:00
Bueno,con esos datos ya creo que alguien que se haya manejado con DACS te puede orientar sobre cual elegir,aunque  el DAC por sí solo no creo que pueda proporcionarte la corriente que comentas,necesitarás una etapa de potencia a su salida para tal fin.Sobre la gama de valores que le debes ir mandando al DAC,lo veo simple.No estoy seguro,pero supongo que estos dispositivos,al igual que los ADC,cuentan con pines destinados a conectar tensiones de referencia.Por ejemplo,si el DAC es de 8 bits y le mandas el dato 11111111,dará supuestamente a su salida el valor de tensión máximo,que sería +Vref (tensión de referencia),con respecto a masa o a una tension -Vref de 0 voltios.Si le mandas un 0 (00000000),te dará una tensión de 0 V,y así todos los valores intermedios,256 valores posibles en total para 8 bits...
A ver si alguien nos ilustra un poco con el uso de estos dispositivos
Título: RE: Generador Funciones
Publicado por: cHiPmAn en 07 de Enero de 2005, 08:52:00

Hay un generador de muy bajo coste q vende maxim. Su referencia es el MAX038 y creo q genera todas las señales que necesitas y se puede ajustar el duty, amplitud,...

Espero que te sirva de ayuda.

Salu2!
Título: RE: Generador Funciones
Publicado por: ppalou en 10 de Enero de 2005, 02:35:00
Escrito originalmente por cHiPmAn

Hay un generador de muy bajo coste q vende maxim. Su referencia es el MAX038 y creo q genera todas las señales que necesitas y se puede ajustar el duty, amplitud,...



Lo siento pero no me sirve, no puedo usar un chip que sea un generador de funciones. Debo hacerlo mediante un microcontrolador más un DAC.
Título: RE: Generador Funciones
Publicado por: pocher en 10 de Enero de 2005, 07:19:00
Usando la función sin van a haber problemas, ya que tarda mucho tiempo en ejecutarse (bastantes ms) con lo cual quizá no se pueda conseguir la frecuencia deseada.

Para usar una tabla que es como te recomendaron, vas a tener que meter "unos cuantos valores" si no quieres ver la función seno en forma de escalera.

Haciéndolo con una tabla creo que no habrá ningún tipo de problema.

Un saludo
Título: RE: Generador Funciones
Publicado por: ppalou en 11 de Enero de 2005, 03:02:00
La tabla la he tenido que hacer de 64 posiciones pq si la hacia de 128 me decia que no tenia suficiente RAM (en una pic 16F877)

La he rellenado asi para que lleguen 8 bits al DAC (la tabla simula una onda triangular, la sinusoidal la dejo para luego):

for(i=0;i<31;i++){
      taula = 8*i;
   }
   i=32;
   for(j=32;j<63;j++){
      taula[j] = (8*i)-1;
      i--;
   }  

Lo probé encima de la PIC directamente con un DAC q tenia por ahi y no me acaba de funcionar.

Sabeis como puedo simular esto con el simulador de oshonsoft  para ver el tipo de onda que me sacaria? no hay manera de añadir la etapa de un DAC al simulador verdad?

Gracias por vuestro tiempo
Título: RE: Generador Funciones
Publicado por: pocher en 11 de Enero de 2005, 06:54:00
No entiendo como lo has hecho. El tiempo támpoco creo que lo usas. ¿Como sacarías entonces una triangular de 50Hz (T=20ms) por ejemplo?
Título: RE: Generador Funciones
Publicado por: ppalou en 12 de Enero de 2005, 01:43:00
[cita title=Escrito originalmente por pocher]No entiendo como lo has hecho. El tiempo támpoco creo que lo usas. ¿Como sacarías entonces una triangular de 50Hz (T=20ms) por ejemplo?[/cita]


Primero relleno la tabla con valores para luego ir recorreriendola:

freq = 100; // por ejemplo
if(start == 1){ // generador ON
     if(i == 64){
         i = 0;
     }
     port_c = taula;
     i++;
     delay_ms(freq);
}
Título: RE: Generador Funciones
Publicado por: Nocturno en 12 de Enero de 2005, 04:35:00
Para evitar malentendidos, deberías activar la casilla "Usa codigos Mi@" que tienes activa al redactar tu mensaje.

Al tenerla activa, MiArroba interpreta la secuencia "" como letra en cursiva y por eso, en tus dos programas no aparece el índice detrás de la variable taula y se malinterpretan.
Esa es la causa, además, de que aparezcan en cursiva a partir de ese punto del programa.
Título: RE: Generador Funciones
Publicado por: ppalou en 12 de Enero de 2005, 05:24:00
[cita title=Escrito originalmente por nocturno66]Para evitar malentendidos, deberías activar la casilla "Usa codigos Mi@" que tienes activa al redactar tu mensaje.

Al tenerla activa, MiArroba interpreta la secuencia "" como letra en cursiva y por eso, en tus dos programas no aparece el índice detrás de la variable taula y se malinterpretan.
Esa es la causa, además, de que aparezcan en cursiva a partir de ese punto del programa.[/cita]

Gracias, lo que tenía que hacer era desactivarla para que no interprete la como cursiva

Está el código corregido
Título: RE: Generador Funciones
Publicado por: pocher en 12 de Enero de 2005, 06:45:00
A ver, ya voy entendiendo cosas.

Unos consejillos:

- Estas usando una amplitud para la triangular de 8, ¿porqué no la usamos de 5V, que es el margen del PIC?

- La ecuación de la rampa de subida está bien, pero la ecuación que aplicas para calcular los puntos en la rampa de bajada creo que está mal.

- En las ecuaciones de ambas rectas sigue sin aparecer el tiempo y creo que debiera.

- Para el tiempo entre punto y punto aplicas delay_ms(freq); esto creo que también estaría mal. El tiempo entre punto y punto sería el periodo dividido entre el número de puntos a representar, en tu caso 64.

Un saludo
Título: RE: Generador Funciones
Publicado por: Nocturno en 12 de Enero de 2005, 06:58:00
Yo creo que no está expresado de una manera muy inteligible, pero que funcionaría, o al menos eso es lo que me parece. No obstante, creo que sería más fácil de interpretar si la rampa de bajada la escribes así:
 
for(i=31;i>0;i--){
   taula[63-i] = (8*i);  
}
Título: RE: Generador Funciones
Publicado por: ppalou en 12 de Enero de 2005, 08:37:00
Escrito originalmente por pocher
A ver, ya voy entendiendo cosas.

Unos consejillos:

1- Estas usando una amplitud para la triangular de 8, ¿porqué no la usamos de 5V, que es el margen del PIC?

2- La ecuación de la rampa de subida está bien, pero la ecuación que aplicas para calcular los puntos en la rampa de bajada creo que está mal.

3- En las ecuaciones de ambas rectas sigue sin aparecer el tiempo y creo que debiera.

4- Para el tiempo entre punto y punto aplicas delay_ms(freq); esto creo que también estaría mal. El tiempo entre punto y punto sería el periodo dividido entre el número de puntos a representar, en tu caso 64.

Un saludo



1- Lo tengo que hacer con un margen de 0 a 8 V porqué así me lo indica el enunciado de la práctica Sonrisa
2 - Ok, usaré la que ha comentado nocturno66  
3 y 4- Lo del tiempo creo que lo he entendido, por ejemplo para 4 Khz hago 1/(4000)·(64) = 3"90625 micro segundos . Pero solo se hacerlo con delay_us(3.90625) , no es así que lo tengo que hacer?
Título: RE: Generador Funciones
Publicado por: pocher en 12 de Enero de 2005, 12:23:00
Como se trata de diseñar un generador de frecuencia variable, para cada valor de frecuencia vas a tener rectas diferentes de diferentes pendientes por eso necesitas para hacer la tabla las ecuaciones de las rectas dependiendo del tiempo.

Aunque la frecuencia sea otra tú usas siempre la misma tabla y eso no puede ser.

Hazte unos ejemplos con papel para dos frecuencias y mira a ver que pasa.

Respecto al intervalo de tiempo entre punto y punto, sí está bien, a eso me refería.

Un saludo
Título: RE: Generador Funciones
Publicado por: Nocturno en 12 de Enero de 2005, 23:26:00
Pocher, no sé si es que estoy espeso, pero no acabo de entenderte.
Veamos. Dices que para frecuencias distintas, la ecuación de las rectas de subida y bajada es distinta, o sea, el coeficiente "a" cambia, puesto que podemos considerar que "b" es 0.

     y=ax+b

Puesto que en el ejemplo que nos ocupa, la variable x es el tiempo transcurrido, su modificador no es otro que la Frecuencia, y esto es precisamente lo que ppalou ha considerado variable con su Delay.
Tal y como yo lo veo, debería funcionar correctamente.

Aunque tengo una duda, delay_us(3.90625), ¿esto funciona con decimales?
Título: RE: Generador Funciones
Publicado por: pocher en 13 de Enero de 2005, 00:23:00
Lo mismo el que está zumbao soy yo, cosa casi segura.

Con la tabla de ppalou siempre se obtienen los mismos valores de y (voltajes)(0,8,16,...) y luego para las x las agranda o las acorta dependiendo de T/64, pero para cualquier valor de T, según la tabla de ppalou, siempre  los correspondientes valores de y siempre van a ser los mismos con lo que la pendientes seran diferentes pero incorrectas.

Para un valor de T los valores de x y de y han de ser diferentes que para otro valor de T (los valores de y no pueden ser constantes para valores diferentes de T).

Está jodidillo de entender, yo creo que es así.

En el delay_us(3.90625) está claro que no se pueden poner decimales dentro, tendría que aproximar.

Título: RE: Generador Funciones
Publicado por: ppalou en 13 de Enero de 2005, 02:05:00
La gráfica que ha dibujado nocturno66 seria el funcionamiento ideal de mi generador de funciones, a partir de unos valores de amplitud fijos voy variando la frecuencia, la cual debo ser capaz de aumentar/disminuir en tiempo de ejecución.

Lo del delay está claro que lo decia a modo teórico, lo voy a hacer aproximando

Esta tarde probaré en la PIC a ver que tal funciona esto, ya os contaré, gracias
Título: RE: Generador Funciones
Publicado por: ppalou en 14 de Enero de 2005, 14:21:00
Me ha funcionado bien!!!!!!!!!!!! Me dibuja correctamente la onda triangular, lo que no me acaba de funcionar es el tema de cambiar la frecuencia en tiempo de ejecución, si aumento en 1 us mas o menos deberia disminuir en 1Khz la frecuencia y viceversa pero no se pq no hace caso, se queda siempre igual la frecuencia.

Ahora para seguir con esto, la tabla la he tenido que hacer "solo" de 64 valores pq la pic no tenia más memoria, se pueden guardar los valores de la tabla en una memoria externa y cargarlos a la PIC en tiempo de ejecución, es posible?

Gracias
Título: RE: Generador Funciones
Publicado por: pachopic en 17 de Enero de 2005, 21:25:00
HOLA :

Mira este link:
http://www.angelfire.com/electronic/jagp/sem4/proy3comp3.html

el codigo esta en C++ y usan un DAC0808, pero con algunas modificaciones podria usarse en ccs, Para un pic , incluso en VB....Sonrisa GiganteSonrisa GiganteSonrisa GiganteSonrisa Gigante

SUERTE...