frecuencia de salida pwm

hola colegas tengo una duda que es la siguiente necesito poder variar la frecuencia la salida de un puerto pwm lo cual por lo que vi ronda los 490 hz yo necesito tener un rando de 1 a 40 khz y poder variarlo ! lo que encontre en el foro es modificar el valor del prescaler pero solo me da un tipo de frecuencia determinada en una tabla que es la variacion segun el divisor ! pero no puedo , corrijo no se me ocurre ni encuentro como poder cambiar esta frecuencia y poder variarla ! si alguno ya pudo solucionar esto me gustaria que me ayuden ! gracias ! 8) 8) 8)

Prueba con la función tone, aunque creo que la frecuencia mínima de tone es de 31 Hz, pero la máxima es de 8 MHz.

http://www.arduino.cc/en/Reference/Tone

https://code.google.com/p/rogue-code/wiki/ToneLibraryDocumentation#Ugly_Details

no hay forma de bajar a unos pocos hz mas ? tengo que simular rpm y por las cuentas tengo que tener un rago de 16 a 166 hz para obte unas 1000 rpm a 7000 no estaria mal la funcion tone pero me gustaria encontrar la forma de poder obtener esas frecuencias , sabes si las soporta arduino ? me lo deja hacer ? hay muy poca info sobre como variar la frecuencias de salida en las salidas pwm !

Puedes hacerte con un generador de funciones barato, como el que hizo jopapa en su dia.

Link generador de funciones jopapa

El modulo AD9850 se encuentra facil en ebay.

La manera de hacerlo puede resultar un poco complicada, hay que modificar el prescaler del timer correspondiente. Mira este link
De este modo

pinMode(3, OUTPUT);
  pinMode(11, OUTPUT);
  TCCR2A = _BV(COM2A1) | _BV(COM2B1) | _BV(WGM21) | _BV(WGM20);
  TCCR2B = _BV(CS22);
  OCR2A = 180;
  OCR2B = 50;

En un Duemilanove daría estos resultados.

Output A frequency: 16 MHz / 64 / 256 = 976.5625Hz
Output A duty cycle: (180+1) / 256 = 70.7%
Output B frequency: 16 MHz / 64 / 256 = 976.5625Hz
Output B duty cycle: (50+1) / 256 = 19.9%

Por favor indica que arduino estas usando

hola sur byte mira de ese modo lo intente uso un arduino mega por el momento pero igual no me sirvio no pupuedo hacer variables ya que los divisores del prescaler estan definidos en los valores ya conocidos que pusiste ej 8 16 64 etc , yo lo que intento hacer es tener un sierto rango en el cual pueda variar ! en especifico como puse ir de 16 hz a 166 hz igual encontre el modulo ese que me gusto mucho aparte por lo confiable que es !

Bueno, acá tienes una librería que es muy fácil de usar. TimerOne Puedes fijar la frecuenta a través del período o sea 16hz => 1/16=62500 useg 166Hz => 1/166 = 6024 useg

TimerOne & TimerThree Libraries

TimerOne and TimerThree let you use the built-in 16 bit timers. Download: TimerOne.zip Download: TimerThree.zip

Hardware Requirements

These libraries use Timer1 and Timer3. Each timer controls PWM pins. While uses these libraries, analogWrite() to those pins will not work normally, but you can use the library pwm() function.=

Board TimerOne PWM Pins TimerThree Arduino Uno 9, 10 Arduino Leonardo 9, 10, 11 5 Arduino Mega 11, 12, 13 2, 3, 5

The timer is configured to repetitively measure a period of time, in microseconds. At the end of each period, an interrupt function can be run. The PWM pins can also be configured to switch during a portion of the period. If using TimerThree, replace "Timer1" with "Timer3".

Configuration

Timer1.initialize(microseconds); Begin using the timer. This function must be called first. "microseconds" is the period of time the timer takes. Timer1.setPeriod(microseconds); Set a new period after the library is already initialized. Run Control

Timer1.start(); Start the timer, beginning a new period. Timer1.stop(); Stop the timer. Timer1.restart(); Restart the timer, from the beginning of a new period. Timer1.resume(); Resume running a stopped timer. A new period is not begun.

PWM Signal Output

Timer1.pwm(pin, duty); Configure one of the timer's PWM pins. "duty" is from 0 to 1023, where 0 makes the pin always LOW and 1023 makes the pin always HIGH. Timer1.setPwmDuty(pin, duty); Set a new PWM, without reconfiguring the pin. This is slightly faster than pwm(), but pwm() must be used at least once to configure the pin. Timer1.disablePwm(pin); Stop using PWM on a pin. The pin reverts to being controlled by digitalWrite(). Interrupt Function

Timer1.attachInterrupt(function); Run a function each time the timer period finishes. The function is run as an interrupt, so special care is needed to share any variables beteen the interrupt function and your main program. Timer1.detachInterrupt(); Disable the interrupt, so the function no longer runs.

Hola.

No me hagas mucho caso, pues soy todavia un novato, pero tal vez te convenga mas la placa Due, pues tengo entendido que tiene salidas analogicas verdaderas, encontré esto por ahi

http://forum.arduino.cc/index.php?topic=131323.0

y también esto, como documentación de las funciones analógicas del Due

http://www.prometec.net/funciones1/

Saludos.

Todas las salidas PWM son verdaderas. El problema que se te plantea es el que a mi tambien se me plantea. Nunca he logrado definiendo del modo que te he dicho que funcione el pin, a menos que use una rutina ISR definida como tal. Luego te digo como porque ahora no tengo tiempo.

Sinceramente no se porque, pero me leí toda la guia de Nick Gammon (que te recomiendo) y esta en tutorial (yo la traduje) y no funciona a menos que escribas una ISR (o sea la interrupción correspondiente) como cuando le pones ISR(TIMER0_COMPA_vect)

Mira este tutorial de Interrupciones que seguro te va a funcionar porque a mi tambien.

Prometo ponerme con el tema porque denota que hay un truco que desconozco.

Yo quería mantener una frecuencia determinada en mi salida PWM y buscando en el foro en inglés encontré esta librería que puede que te sirva.Para mi fue perfecto y quedó todo perfecto.Os dejo también un video en el que fijan la frecuencia que quieren correctamente.Un saludo.

http://forum.arduino.cc/index.php?topic=117425.0 https://www.youtube.com/watch?v=9JXGIeM3BSI