/************************************************************************************************* PROGRAMMINFO ************************************************************************************************** Funktion: ESP32 Frequenzgererator mit OLED 1,3" Display und Ser. Monitor Konfiguration Ti/Tp = 0-1023 Aufloesung 8-16 Bit ************************************************************************************************** Version: 10.04.2022 ************************************************************************************************** Board: ESP32vn IoT UNO V1.0.4 ************************************************************************************************** C++ Arduino IDE V1.8.13 ************************************************************************************************** Einstellungen: https://dl.espressif.com/dl/package_esp32_index.json http://dan.drown.org/stm32duino/package_STM32duino_index.json https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_dev_index.json ************************************************************************************************** **************************************************************************************************/ #include #include "SH1106.h" #define LEDC_CHANNEL_0 0 #define LEDC_TIMER_13_BIT 13 //SSD1306 display(0x3C, 21,22); SH1106 display(0x3C, 21,22); unsigned int pwmpin = 27; unsigned int freq = 1000; unsigned int duty_set_min = 0; unsigned int duty_set_max = 100; unsigned int duty_timer = 100; unsigned int duty_last = 100; unsigned int resolution = 10; unsigned int aresolution = pow(2,resolution)-1; unsigned int rduty=map(duty_set_max, 0, aresolution, 0, 100); hw_timer_t * timer = NULL; volatile uint8_t stat = 0; void IRAM_ATTR onTimer(){ stat=1-stat; if (stat==1)duty_timer=duty_set_max; else if (stat==0)duty_timer=duty_set_min; } void setup() { Serial.begin(115200); while (!Serial) { } delay(100); Serial.println(" ESP32 PWM GENERATOR"); Serial.println(" Kommandos:"); Serial.println(" 'f' aendere Frequenz"); Serial.println(" 'd' aendere Ti/Tp"); Serial.println(" 'r' aendere Aufloesung"); Serial.println(" 'p' aendere GPIO"); display.init(); ledcSetup(0, freq, resolution); ledcAttachPin(pwmpin, 0); ledcWrite(0, duty_set_max); screen(pwmpin,freq,duty_set_max,rduty); timer = timerBegin(1, 80, true); // timer 0, MWDT clock period = 12.5 ns * TIMGn_Tx_WDT_CLK_PRESCALE -> 12.5 ns * 80 -> 1000 ns = 1 us, countUp timerAttachInterrupt(timer, &onTimer, true); // edge (not level) triggered timerAlarmWrite(timer, 1000000, true); // 1000000 * 1 us = 1 s, autoreload true timerAlarmEnable(timer); // enable } void loop() { if (duty_last==duty_timer){ } else { duty_last=duty_timer; pwmsettings(pwmpin,freq,duty_last,resolution); } if (Serial.available()) { char cin = Serial.read(); byte cin1; switch (cin) { case 'f': Serial.println("Neue Freqenz in Hz"); while (!Serial.available()); freq = Serial.parseInt(); pwmsettings(pwmpin,freq,duty_set_max,resolution); Serial.print(" Neue Frequenz:"); Serial.print(freq); Serial.println("Hz"); break; case 'd': Serial.print("Neue Ti/T (0-"); Serial.print(aresolution); Serial.println(")"); while (!Serial.available()); duty_set_max = Serial.parseInt(); pwmsettings(pwmpin,freq,duty_set_max,resolution); Serial.print("Neue Ti/T:"); Serial.println(duty_set_max); break; case 'r': Serial.println("Neue Aufloesung (8-16)"); while (!Serial.available()); resolution = Serial.parseInt(); pwmsettings(pwmpin,freq,duty_set_max,resolution); Serial.print("Neue Aufloesung:"); Serial.print(resolution); Serial.println(" Bit Aufloesung"); break; case 'p': Serial.println("Neue Pin Nummer"); while (!Serial.available()); pwmpin = Serial.parseInt(); pwmsettings(pwmpin,freq,duty_set_max,resolution); Serial.print("Neu Pin Nummer:"); Serial.println(pwmpin); break; } } } void screen(unsigned int pwmpin,unsigned int freq, unsigned int duty_set_max,unsigned int rduty) { display.clear(); display.setTextAlignment(TEXT_ALIGN_CENTER); display.setFont(ArialMT_Plain_10); display.drawString(64, 3, "PWM GENERATOR"); display.setTextAlignment(TEXT_ALIGN_LEFT); display.drawString(2, 15, "Freq: " + String(freq)+"Hz"); display.drawString(2, 27, "Ti / T: "+String(duty_set_max)+" / "+String(aresolution)+" ("+String(rduty)+"%)"); display.drawString(2, 39, "Aufloesung: "+String(resolution)+" Bit"); display.drawString(2, 51, "Pin: "+String(pwmpin)); display.display(); } void pwmsettings(unsigned int pwmpin,unsigned int freq, unsigned int duty_set_max,unsigned int resolution) { aresolution = pow(2,resolution)-1; rduty=map(duty_set_max, 0, aresolution, 0, 100); ledcSetup(0, freq, resolution); ledcAttachPin(pwmpin, 0); ledcWrite(0, duty_set_max); screen(pwmpin,freq,duty_set_max,rduty); }