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
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;
}