[SOLUCIONADO] 3 Pwm con Mega, no puedo variar frecuencia independiente

Quiero hacer 3 Pwm con Arduino Mega y que varie la frecuencia con 3 potenciómetro respectivamente.

De momento he generado solo 2 Pwm, la tercera por mas que lo he intentado no me sale.

Aunque con dos Pwm no me resuelve el proyecto que quiero hacer, tengo un problema con este código, que si no lo resuelvo de nada sirve generar otra Pwm mas.

El problema que tengo es que mueva el potenciómetro que mueva, me varia la frecuencia de ambas Pwm .

#include <TimerOne.h>
#include <TimerThree.h>

const int potFreqPin1 = A0;  // Pin analógico para el potenciómetro de frecuencia del pin 11
const int potFreqPin2 = A1;  // Pin analógico para el potenciómetro de frecuencia del pin 3

int freq1 = 0;          // Variable para almacenar la frecuencia del pin 11
int freq2 = 0;          // Variable para almacenar la frecuencia del pin 3
int dutyCycle1 = 50;    // Duty cycle fijo para el pin 11
int dutyCycle2 = 50;    // Duty cycle fijo para el pin 3
int periodMicros1 = 0;  // Variable para almacenar el período en microsegundos del pin 11
int periodMicros2 = 0;  // Variable para almacenar el período en microsegundos del pin 3

void setup() {
  pinMode(11, OUTPUT);  // Configurar el pin 11 como salida para la PWM
  pinMode(3, OUTPUT);   // Configurar el pin 3 como salida para la PWM

  Timer1.initialize();  // Inicializar Timer1 para la PWM del pin 11
  Timer1.attachInterrupt(timerISR1);  // Adjuntar la función de interrupción del temporizador 1

  Timer3.initialize();  // Inicializar Timer3 para la PWM del pin 3
  Timer3.attachInterrupt(timerISR3);  // Adjuntar la función de interrupción del temporizador 3
  Timer3.pwm(3, 512);  // Configurar el pin 3 para la PWM con un duty cycle del 50%
}

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, 200000);

  // Leer el valor del potenciómetro de frecuencia para el pin 3 y mapearlo al rango deseado
  int potFreqValue2 = analogRead(potFreqPin2);
  freq2 = map(potFreqValue2, 0, 1023, 10, 200000);

  // Calcular el período en microsegundos para ambos pines
  periodMicros1 = 1000000 / freq1;
  periodMicros2 = 1000000 / freq2;

  // 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);

  // Configurar el período del Timer3 (pin 3)
  Timer3.setPeriod(periodMicros2 - 1);
}

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

// Función de interrupción del temporizador 3 (pin 3)
void timerISR3() {
  static boolean state2 = HIGH;
  digitalWrite(3, state2);
  state2 = !state2;
}

Revisa la documentación de las librerías, por lo que he visto tienes que llamar al menos una vez a pwm() antes de usar setPwmDuty() para que se configure correctamente el timer y en el caso del timer1 no lo haces.

Para la tercera señal puedes usar la librería TimerFour para manejar el timer4 (obviamente).

Gracias MaximoEsfuerzo, voy a mirar las librerías, para la tercera PWM ya lo intente con TimerFour, pero no me generaba ninguna señal.
Voy a intentar solucionar primero el tema de los potenciómetros y luego pondré lo que hice con Timer4

Ya hice la llamada pwm() en ambos timer, pero sigo con el problema. No entiendo por que pasa eso con los potenciómetros

#include <TimerOne.h>
#include <TimerThree.h>

const int potFreqPin1 = A0;
const int potFreqPin2 = A1;

int freq1 = 0;
int freq2 = 0;
int dutyCycle1 = 50;
int dutyCycle2 = 50;
int periodMicros1 = 0;
int periodMicros2 = 0;

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

  Timer1.initialize();
  Timer1.pwm(11, 512);  // Configurar el pin 11 para la PWM con un duty cycle del 50%
  Timer1.attachInterrupt(timerISR1);

  Timer3.initialize();
  Timer3.pwm(3, 512);   // Configurar el pin 3 para la PWM con un duty cycle del 50%
  Timer3.attachInterrupt(timerISR3);
}

void loop() {
  int potFreqValue1 = analogRead(potFreqPin1);
  freq1 = map(potFreqValue1, 0, 1023, 10, 200000);

  int potFreqValue2 = analogRead(potFreqPin2);
  freq2 = map(potFreqValue2, 0, 1023, 10, 200000);

  periodMicros1 = 1000000 / freq1;
  periodMicros2 = 1000000 / freq2;

  Timer1.setPeriod(periodMicros1 - 1);
  Timer1.setPwmDuty(11, periodMicros1 * dutyCycle1 / 100);

  Timer3.setPeriod(periodMicros2 - 1);
  Timer3.setPwmDuty(3, periodMicros2 * dutyCycle2 / 100);
}

void timerISR1() {
  static boolean state1 = HIGH;
  digitalWrite(11, state1);
  state1 = !state1;
}

void timerISR3() {
  static boolean state2 = HIGH;
  digitalWrite(3, state2);
  state2 = !state2;
}

periodMicros1/2 deberían ser unsigned long, fijate como está definido en la librería

void setPeriod(unsigned long microseconds)

Otra cosa no veo que pudiera provocar lo que dices.

Agrego:
TimerFour funciona igual a TimerOne y TimerThree, debería generar pulsos igual que éstas.

Gracias, ya tengo todo funcionando, incluido la 3 PWM son Timer4.

El problema a sido culpa mía, si no conecto los tres potenciómetros no funciona, al conectar solo uno por algún motivo mueve las tres PWM.

Te agradezco mucho tu ayuda. Muchas gracias

#include <TimerOne.h>
#include <TimerThree.h>
#include <TimerFour.h>  

const int potFreqPin1 = A0;  // Pin analógico para el potenciómetro de frecuencia del pin 11
const int potFreqPin2 = A1;  // Pin analógico para el potenciómetro de frecuencia del pin 3
const int potFreqPin3 = A2;  // Pin analógico para el potenciómetro de frecuencia del pin 6

int freq1 = 0;          // Variable para almacenar la frecuencia del pin 11
int freq2 = 0;          // Variable para almacenar la frecuencia del pin 3
int freq3 = 0;          // Variable para almacenar la frecuencia del pin 6
int dutyCycle1 = 50;    // Duty cycle fijo para el pin 11
int dutyCycle2 = 50;    // Duty cycle fijo para el pin 3
int dutyCycle3 = 50;    // Duty cycle fijo para el pin 6

unsigned long periodMicros1 = 0;  // Variable para almacenar el período en microsegundos del pin 11
unsigned long periodMicros2 = 0;  // Variable para almacenar el período en microsegundos del pin 3
unsigned long periodMicros3 = 0;  // Variable para almacenar el período en microsegundos del pin 6

void setup() {

  pinMode(11, OUTPUT);  
  pinMode(3, OUTPUT);   
  pinMode(6, OUTPUT);   

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

  Timer3.initialize();  // Inicializar Timer3 para la PWM del pin 3
  Timer3.attachInterrupt(timerISR3);  // Adjuntar la función de interrupción del temporizador 3
  Timer3.pwm(3, 512);  // Configurar el pin 3 para la PWM con un duty cycle del 50%

  Timer4.initialize();  // Inicializar TimerFour para la tercera PWM
  Timer4.attachInterrupt(timerISR4);  // Adjuntar la función de interrupción del temporizador 4
  Timer4.pwm(6, 512);  // Configurar el pin 6 para la PWM con un duty cycle del 50%
}

void loop() {

  // Leer el valor del potenciómetro de frecuencia para el pin 11 
  int potFreqValue1 = analogRead(potFreqPin1);
  freq1 = map(potFreqValue1, 0, 1023, 10, 1500);

  // Leer el valor del potenciómetro de frecuencia para el pin 3 
  int potFreqValue2 = analogRead(potFreqPin2);
  freq2 = map(potFreqValue2, 0, 1023, 5, 2000);

  // Leer el valor del potenciómetro de frecuencia para el pin 6
  int potFreqValue3 = analogRead(potFreqPin3);
  freq3 = map(potFreqValue3, 0, 1023, 5, 2500);

  // Calcular el período en microsegundos para los tres pines
  periodMicros1 = 1000000 / freq1;
  periodMicros2 = 1000000 / freq2;
  periodMicros3 = 1000000 / freq3;

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

  // Configurar el período y el duty cycle del Timer3 
  Timer3.setPeriod(periodMicros2 - 1);
  Timer3.setPwmDuty(3, periodMicros2 * dutyCycle2 / 100);

  // Configurar el período y el duty cycle del Timer4 
  Timer4.setPeriod(periodMicros3 - 1);
  Timer4.setPwmDuty(6, periodMicros3 * dutyCycle3 / 100);
}

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

// Función de interrupción del temporizador 3 
void timerISR3() {
  static boolean state2 = HIGH;
  digitalWrite(3, state2);
  state2 = !state2;
}

// Función de interrupción del temporizador 4 
void timerISR4() {
  static boolean state3 = HIGH;
  digitalWrite(6, state3);
  state3 = !state3;
}


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