const int pwmPin = 9; // Pin PWM
const int buttonPin = 2; // Pin del pulsador
const int maxPwmValue = 255; // Valor máximo de PWM
const int numSamples = 256; // Número de muestras para la forma de onda
const unsigned long debounceDelay = 300 ; // the debounce time; increase if the output flickers
int mode = 0; // Modo actual: 0 = senoidal, 1 = exponencial creciente, 2 = exponencial decreciente
int buttonState = 0; // Estado actual del botón
int lastButtonState = 0; // Estado anterior del botón
unsigned long wavePreviousMillis = 0; // Para el temporizador de la forma de onda
// Frecuencia de la forma de onda (puede ser modificada)
float frequency = 100.0;
unsigned long sampleInterval; // Intervalo entre muestras
// Tablas de formas de onda
byte sineWave[numSamples];
byte expIncWave[numSamples];
byte expDecWave[numSamples];
void button_interrupt_handler()
{
static uint32_t last_entry = 0 ;
if ( millis() - last_entry > debounceDelay ) {
last_entry = millis() ;
buttonState = digitalRead(buttonPin);
if (buttonState != lastButtonState) {
if (buttonState == HIGH) {
mode = (mode + 1) % 3;
}
}
lastButtonState = buttonState;
}
}
void setup() {
pinMode(pwmPin, OUTPUT);
pinMode(buttonPin, INPUT);
attachInterrupt(digitalPinToInterrupt(buttonPin), button_interrupt_handler, FALLING);
Serial.begin(9600);
void generar_tablas();
}
void loop() {
unsigned long currentMillis = millis();
// Seleccionar la tabla de la forma de onda según el modo
byte *waveTable;
switch (mode) {
case 0:
waveTable = sineWave;
break;
case 1:
waveTable = expIncWave;
break;
case 2:
waveTable = expDecWave;
break;
}
// Generar la forma de onda en la salida PWM usando millis()
static int sampleIndex = 0;
if (currentMillis - wavePreviousMillis >= sampleInterval) {
wavePreviousMillis = currentMillis;
analogWrite(pwmPin, waveTable[sampleIndex]);
Serial.println(waveTable[sampleIndex]);
sampleIndex = (sampleIndex + 1) % numSamples;
}
}
void generar_tablas() {
// Calcular el intervalo entre muestras basado en la frecuencia
sampleInterval = 100000 / (frequency * numSamples);
// Generar tabla de onda senoidal
for (int i = 0; i < numSamples; i++) {
sineWave[i] = (byte)((sin(2 * PI * i / numSamples) + 1) * (maxPwmValue / 2));
}
// Generar tabla de onda exponencial creciente
for (int i = 0; i < numSamples; i++) {
expIncWave[i] = (byte)(maxPwmValue * (1 - exp(-5.0 * i / numSamples)));
}
// Generar tabla de onda exponencial decreciente
for (int i = 0; i < numSamples; i++) {
expDecWave[i] = (byte)(maxPwmValue * exp(-5.0 * i / numSamples));
}
}