Pages: [1] 2   Go Down
Author Topic: Ayuda con diente de sierra  (Read 2111 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 3
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Estimados, 

necesito generar una señal diente de sierra en el arduino uno y ser mostrada en el osciloscopio, la verdad es que no se por donde partir. si alguien
me puede ayudar se los agradecería.
Logged

Cordoba
Offline Offline
God Member
*****
Karma: 40
Posts: 683
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Con pwm y un operacional en modo integrador
Logged

El que pregunta aprende, el que responde aprende a responder.

Offline Offline
Newbie
*
Karma: 0
Posts: 3
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

es posible generar la señal diente de sierra de forma interna dentro del arduino? que es lo que tengo que hacer
Logged

Cordoba
Offline Offline
God Member
*****
Karma: 40
Posts: 683
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

no puedes, no posees un conversor digital a analogico interno, lo qeu puedes hacer es que con PWM varias la frecuencia de la onda cuadrada, esta ingresa a un Operacional configurado como integrador y vas a obtener una señal bastante parecida a eso.

http://blog.bricogeek.com/noticias/arduino/generador-de-ondas-casero-con-arduino/

http://books.google.com.ar/books?id=Jd-TIqo3EkIC&pg=PA163&lpg=PA163&dq=diente+de+sierra+operacional&source=bl&ots=sCilULiA9B&sig=3pXmsv_92tYj-yFWtiWark4OMSE&hl=es&sa=X&ei=LGTfUe_8E-OHyAH5g4HYDw&ved=0CCoQ6AEwAA#v=onepage&q=diente%20de%20sierra%20operacional&f=false
Logged

El que pregunta aprende, el que responde aprende a responder.

Offline Offline
Newbie
*
Karma: 0
Posts: 3
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Muchas gracias MAxid
Logged

Offline Offline
Jr. Member
**
Karma: 1
Posts: 78
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola, una pregunta sobre el tema:

no puedes, no posees un conversor digital a analogico interno,

Con el arduino mega se podría? Tengo entendido que tiene un DAC interno, o es otra cosa?.
No estoy muy puesto en estos temas...
Logged

Cordoba
Offline Offline
God Member
*****
Karma: 40
Posts: 683
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Es un DAC, pero ni el Mega1280 ni el 2560 traen DAC interno.
Pero en el ejemplo que te pase se hace muy simple, sino busca en google hay cientos de circuitos similares.
si quieres aprender usa lo que te expliqué
Logged

El que pregunta aprende, el que responde aprende a responder.

Offline Offline
Newbie
*
Karma: 0
Posts: 3
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola, quisiera saber como generar la señal diente sierra con el arduino Due, teniendo en cuanta que dicho arduino si cuenta con dos DAC's internos, la señal la genero con codigo pero la frecuencia no es la necesaria, necesito la señal a una frecuencia minima de 1Khz, con una resolucion de 12Bits, si alguien sabe como lo puedo hacer le agradecerian me ilustraran respecto al caso
Logged

Anaco, Venezuela
Offline Offline
Jr. Member
**
Karma: 8
Posts: 88
Electronic Engineer
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola,

      Aqui hay un ejemplo para generar ondas entre 1Hz y 170Hz con el DUE http://arduino.cc/en/Tutorial/DueSimpleWaveformGenerator. Al parecer la limitación allí es el tiempo de espera del analogRead().

      Pero como tu quieres es un 1Khz, saquemos cuentas:

       Si tienes 12 bits, significa valores entre 0 y 4095.
       
       Si quieres 1Khz significa que cada 1ms tienes que mandar una rampa completa de 0 a 4095. Es decir, a máxima resolución tienes que mandar 4096 valores cada 1ms, por lo tanto necesitas mandar 1 nuevo valor cada 1/4096 ms = 244ns.

      El Arduino DUE trabaja a 84Mhz, algo asi como 11ns cada ciclo. Asi que si el DAC responde rápido parece posible.

      Yo siendo tu mando a escribir valores al DAC de 0 a 4095 de manera sucesiva y veo como se comporta la salida y cual es esa máxima frecuencia que obtengo, y a partir de alli le agrego algunos *nop* o codigo de retraso que no haga nada para ajustar la frecuencia. Lo otro es que veas cada cuanto puedes generar una interrupcion y trabajes con eso. Y si no alcanzas la resolucion en lugar de aumentar en pasos de 1 lo haces en pasos de 4 por ejemplo, una cuenta rapida serian interrupciones cada 1ms y pasas valores entre 0 y 3996 aumentados de 4 en 4.

       Son ideas, montalas para comprobarlas.

Saludos.
       
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 2
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola Luis_AM3C, estoy haciendo lo mismo que marcos y me parece buena la idea de:
"...y a partir de alli le agrego algunos *nop* o codigo de retraso que no haga nada para ajustar la frecuencia."
pero donde encuentro información acerca de esto o, si no es mucha molestia, ¿me podrías decir como se hace eso en el DUE?

"Lo otro es que veas cada cuanto puedes generar una interrupcion y trabajes con eso."
o esta, por favor.
y  Gracias!
Logged

Palencia, Spain
Offline Offline
God Member
*****
Karma: 25
Posts: 502
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Creo que partiendo del código que propone Luis_AM3C, es posible obtener ese diente de sierra (lo que yo no sabía es que el due sí tiene puerto analógico).
Creo que más importante que crear un código rápido es crear un código "regular", es decir que en cada iteracción realice el mismo número de operaciones, para evitar irregularidades al cambiar condiciones (que se alcance el pico máximo o mínimo de la señal). A partir de ahí, si aparte de la frecuencia de la señal no estamos excesivamente condicionados por la amplitud máxima, no deberíamos tener demasiadas pegas para obtener la frecuencia (más o menos aproximada) deseada.
Propongo el siguiente código:
Code:
void setup() {
  analogWriteResolution(12);  // set the analog output resolution to 12 bit (4096 levels)
}
void loop() {
int numincrementos=10;
int fine_tune=0;

int valor=0;
int incremento=4000/numincrementos;
int maxval=incremento*numincrementos
      while(1){  
            analogWrite(DAC0, valor);  // write the selected waveform on DAC0
            valor+=incremento;
            valor=(valor>maxval?0:valor);
            delayMicroseconds(fine_tune);
      }
}
A partir de ahí, podremos jugar primero con la variable numincrementos, hasta obtener el resultado superior al Khz más cercano, y después con la variable fine_tune, terminar de aproximar. Hablo totalmente de forma teórica, pues no dispongo de un Due. Si alguien lo prueba, por favor, que comparta el resultado.
« Last Edit: August 05, 2013, 01:51:31 pm by noter » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 3
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Acabo de probar el codigo, en el Due y sale error en la siguiente linea

            valor=(valor>maxval?0;valor);

el error que sale es: expected ':'before';' token

El interrogante en la linea de programacion ¿Que significa?
Logged

Palencia, Spain
Offline Offline
God Member
*****
Karma: 25
Posts: 502
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Perdón por la errata. Me pillaste fuera y sólo pude corregirla desde el teléfono móvil.
La instrucción (expresión?valor si verdadero:valor si falso) devuelve uno de los dos valores, dependiendo de la evaluación de la expresión. Es el equivalente a iif de visual basic.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 3
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Amigo que verguenza pero no entendi bn lo que me trato de decir, es que no conozco visual basic, si he utilizado el comando "if" pero en otros lenguajes de programacion ccomo "ISE o el de C", pero mas o menos como debe ir la linea donde sale el error.?
Logged

Palencia, Spain
Offline Offline
God Member
*****
Karma: 25
Posts: 502
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Está ya editada y corregida en mi post inicial. Cambia el punto y coma por dos puntos. Espero que no haya más erratas, pero es que lo escribí "al vuelo".
Saludos.
Logged

Pages: [1] 2   Go Up
Jump to: