[SOLUCIONADO] PWM con TimerOne varia la frecuencia de 10hz en 10hz,no me funciona

Buenas, estoy intentando variar la frecuencia de un PWM con un potenciómetro, pero quiero que la variación la haga de 10hz en 10hz .

Partiendo de este código que hice para generar la PWM con su potenciometro:

#include <TimerOne.h>

const int potFreqPin1 = A0;       // Pin analógico para el potenciómetro de frecuencia del pin 11
int freq1 = 0;                    // Variable para almacenar la frecuencia del pin 11
int dutyCycle1 = 50;              // Duty cycle fijo para el pin 11
unsigned long periodMicros1 = 0;  // Variable para almacenar el período en microsegundos del pin 11

void setup() {

  pinMode(11, OUTPUT);  // Configurar el pin 11 como salida para la PWM
  Timer1.initialize();  // Inicializar Timer1 para la PWM del pin 11
  Timer1.pwm(11, 512);
  Timer1.attachInterrupt(timerISR1); 
}

void loop() {
  // Leer el valor del potenciómetro de frecuencia para el pin 11 y mapearlo al rango deseado
  int potFreqValue1 = analogRead(potFreqPin1);
  freq1 = map(potFreqValue1, 0, 1023, 10, 3200);

  // Calcular el período en microsegundos 
  periodMicros1 = 1000000 / freq1;

  // Configurar el período y el duty cycle del Timer1 (pin 11)
  Timer1.setPeriod(periodMicros1 - 1);  // Restar 1 para ajustar la frecuencia
  Timer1.setPwmDuty(11, periodMicros1 * dutyCycle1 / 100);

}

// Función de interrupción del temporizador 1 (pin 11)
void timerISR1() {
  static boolean state1 = HIGH;
  digitalWrite(11, state1);
  state1 = !state1;
}

Hice este otro código para variar la frecuencia de 10hz en 10hz, pero no me funciona, podéis por favor ver el código y guiarme en la solución:

#include <TimerOne.h>

const int potFreqPin1 = A0;
int freq1 = 0;
int dutyCycle1 = 50;
unsigned long periodMicros1 = 0;
int lastPotValue1 = 0;
int currentPotValue1 = 0;

void setup() {
  pinMode(11, OUTPUT);  // Configurar el pin 11 como salida para la PWM
  Timer1.initialize();  // Inicializar Timer1 para la PWM del pin 11
  Timer1.pwm(11, 512);
  Timer1.attachInterrupt(timerISR1);  

void loop() {
  currentPotValue1 = analogRead(potFreqPin1);
  if (currentPotValue1 > lastPotValue1) {
    freq1 += 10; // Aumentar la frecuencia en 10Hz
  } else if (currentPotValue1 < lastPotValue1) {
    freq1 -= 10; // Disminuir la frecuencia en 10Hz
  }
  freq1 = constrain(freq1, 10, 3200); // Limitar la frecuencia dentro del rango válido
  lastPotValue1 = currentPotValue1;

  periodMicros1 = 1000000 / freq1;

  // Configurar el período y el duty cycle del Timer1 (pin 11)
  Timer1.setPeriod(periodMicros1 - 1);  // Restar 1 para ajustar la frecuencia
  Timer1.setPwmDuty(11, periodMicros1 * dutyCycle1 / 100);
}

// Función de interrupción del temporizador 1 (pin 11)
void timerISR1() {
  static boolean state1 = HIGH;
  digitalWrite(11, state1);
  state1 = !state1;
}

Yo mido en el simulador en el pin 11,
T = 11mseg cuando el potenciometro esta casi en 0 V y 4.23mseg cuando esta en 5V
Esos son períodos entonces :
11 mseg => 90.90 Hz
4.23mseg => 236.40 Hz

Revisa tus cables

Intenta esto

  currentPotValue1 = analogRead(potFreqPin1);
  freq1 = map(currentPotValue1, 0, 1023, 10, 3200);
  //freq1 = constrain(freq1, 10, 3200); // Limitar la frecuencia dentro del rango válido

Gracias Surbyte, mañana revisare todas las conexiones y probare lo que me dices.

Buenas Surbyte,

Lo primero cambie esta linea de código que me dijiste, ya que con la mía no respetaba el rango de frecuencia:

freq1 = map(currentPotValue1, 0, 1023, 10, 3200);

Pero me sigue sin funcionar que aumento o disminuya de 10 en 10hz.
Estoy pensando que si en vez de un potenciómetro coloco un encoder será mas facial de hacer por cada cambio de estado del encoder.

Gracias

¿Y si haces

freq1 = map(currentPotValue1, 0, 1023, 1, 320) * 10;

?

Y sí, con un encoder vas a tener un mejor control.

Buenas, antes de nada gracias por al ayuda y consejos recibidos.

Al final opte por montar un encoder y trabaja perfecto cada movimiento varia 10Hz. Dejo aqui el código por si alguien le hace falta algún día.

#include <TimerOne.h>
#include <Encoder.h>

const int encoderPinA = 2;  // Pin A del encoder 1
const int encoderPinB = 4;  // Pin B del encoder 1

Encoder encoder(encoderPinA, encoderPinB);
int lastEncoderValue = 0;

int freq = 0;                     // Variable para almacenar la frecuencia del pin 11
int dutyCycle = 50;               // Duty cycle fijo para el pin 11
unsigned long periodMicros = 0;  // Variable para almacenar el período en microsegundos del pin 11


void setup() {
  pinMode(11, OUTPUT);

  Timer1.initialize();  // Inicializar Timer1 para la PWM del pin 11
  Timer1.pwm(11, 512);
  Timer1.attachInterrupt(timerISR);  // Adjuntar la función de interrupción del temporizador 1
}

void loop() {
  // Leer el valor actual del encoder para el pin 11
  int currentEncoderValue = encoder.read();
  freq += (currentEncoderValue - lastEncoderValue) * 10 ; // Variación de 10 Hz por movimiento
  lastEncoderValue = currentEncoderValue;

  // Calcular el período en microsegundos 
  periodMicros = 1000000 / constrain(freq, 10, 3000);


  // Configurar el período y el duty cycle del Timer1
  Timer1.setPeriod(periodMicros - 1);  // Restar 1 para ajustar la frecuencia
  Timer1.setPwmDuty(11, periodMicros * dutyCycle / 100);

}

// Función de interrupción del temporizador 1
void timerISR() {
  static boolean state = HIGH;
  digitalWrite(11, state);
  state = !state;
}













This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.