"Bare metal" code for ESP32
Embedding the .cpp scripts on ESP32 requires
- VS Code editor
- PlatformIO addon istalled within
This page contains follwing two examples
- Example 1: Using timers and ISR functions on this microcontroller
- Example 2: Creating embedded signal generator, reusing "Signal Generator code"
Example 1. : ISR functions
- Functions called with internal "ticker" clock
- Explained here:
/*
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| CASE 1
loop()
_______________________________________
____| |______
0 1000msec
ticker()
____ ____ ____ ____ ___
_____| |___| |___| |__| |___| |_____
1000 msec
Rezultat:
etsWatchdog counter: 0
Watchdog counter: 1
Watchdog counter: 2
Watchdog counter: 3
Watchdog counter: 4
Watchdog counter: 5
Watchdog counter: 6
Watchdog counter: 7
Watchdog counter: 8
Watchdog counter: 9
|............................... cycle of 10 done ...... |
Watchdog counter: 10
Watchdog counter: 11
...
//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| CASE 2
case2: zovi funkciju, svakih 100 msec, tj. u sekundi 10x i na kraju 5 sec
izbaci counter ...
___________________________________________________________
____| |______
0 5000 msec
(counter c+=50)
svakih 100 msec izvrsi funckiju
svakih 10 izvrsavanja obavjesti da je ciklus od 10 zavrsen
_____||||||||||__|||||||||||_|||||||||||_|||||||||||_|||||||||||_
(msg) (msg) (msg) (msg) (msg)
Rezultat:
etWatchdog counter: 0
|............................... cycle of 10 done ...... |
|............................... cycle of 10 done ...... |
|............................... cycle of 10 done ...... |
|............................... cycle of 10 done ...... |
|............................... cycle of 10 done ...... |
Watchdog counter: 50
*/
main.cpp
#include "Arduino.h"
#include < Ticker.h >
//|**********************************************************************************|
//| Globals
int watchDogCount = 0;
double dt = 0.01;
Ticker secondTick;
// ova funkcija se poziva svakih sekundu
void ISRwatchDog()
{
watchDogCount++;
if(watchDogCount %10 == 0)
{
Serial.println("|............................... cycle of 10 done ...... |");
}
}
void setup() {
Serial.begin(115200);
double CALL_TIME = 1;
secondTick.attach(CALL_TIME,ISRwatchDog); // ovaj ticker ju poziva svakih sekundu ...
}
void loop() {
double T_SKETCH = 1000; //| sketch ticks in 5 sec
Serial.printf("Watchdog counter: %d\n", watchDogCount); //|
delay(T_SKETCH);
}
Example 2: Creating embedded signal generator
- Two scripts should be fleshed onto the ESP32 for this to work
- signalgen.h is a succeessor of previously defined signal_gen.h
- Pay special attention to the paltform.ini file which determines the flash procedure of chip
- Adjust here the baud-rate indicated with green arrows
main.cpp
#include "Arduino.h"
#include "signalgen.h"
#include < Ticker.h >
// GLOBALS
int Callcounter = 0; //| conter is set o zero
int LoopCounter = 0;
double mytime = 0; //| starting time
Ticker secondTick; //| ticker object
double newTime;
//| ::signalgen
signalgen sineWave(1e3,50); //| generate sinewave object
signalgen RandSignal; //| random signal
double dt = 1/sineWave.getFS(); //| take generator sampling fequency
//[ISR_2]
void ISRsineWave()
{
Callcounter++;
double t = dt*Callcounter; // time dt ...
double r = RandSignal.rand_normal(0.0,1); // random signal ...
double s = 2*sineWave.sinus_const(t); // sinus content ...
newTime = micros();
Serial.printf("%.3f*", r);
// Serial.printf("%.4f, %.4f*", t, s);
// Serial.println(s);
}
//|||||||||||||||||||||||||||||| SETUP and LOOP
void setup()
{
Serial.begin(115200);
//| 1/512 = 0.001953125
//| 1/500 = 0.002
//| 1/1000 = 0.001
//| 1/2000 = 0.000005
//| 1/1024 = 0,0009765625
//| 1/800 = 0.00125 x nece puni 1000
double CALL_TIME = 0.001;
secondTick.attach(CALL_TIME, ISRsineWave);
}
void loop()
{
//double mytime= 0;
//==================================================================
// This is the sketch time
//double T_SKTECH = 1000;
//delay(T_SKTECH);
//Callcounter = 0;
Serial.flush();
}
signalgen.h
#pragma once
#include < cmath >
#include < Arduino.h >
#include < random >
#include < chrono >
#include < cstdlib >
using namespace std;
//|***************************************************************************************
//| Signal generator class for ESP32
//| fs is at its maximum at 18740 Hz ! // see appendix for measurement reference
//| Appendix/ C++ /ESP32 sampling rate CLICK HERE
//|***************************************************************************************
class signalgen
{
private:
double fs, dt, freq;
double PI_ = 3.14159265358979323846;
public:
signalgen();
signalgen(double, double);
~signalgen();
double sinus_const(double);
double cos_const(double);
double rand_normal(double, double);
double getFS();
};
signalgen::signalgen()
{
}
signalgen::signalgen(double f_s, double f )
{
if(fs < 18740.0 )
{
this->fs = f_s;
this->dt = 1/fs;
this->freq = f;
}
else if( fs > 18740 )
{
Serial.println("Maximal sampling frequency allowed ist 18.740 kHz");
this->fs = 18740.0;
this->dt = 1/fs;
this->freq = f;
}
}
signalgen::~signalgen()
{
}
// returns from private sampling frequency
double signalgen::getFS()
{
return this->fs;
}
// |||||||||||||||||||||||||||||||||||||||||||| :: generate sine
double signalgen::sinus_const(double dt)
{
double f = this->freq;
return sin(2*PI_*f*dt);
}
// |||||||||||||||||||||||||||||||||||||||||||| :: generate cosine
double signalgen::cos_const(double t)
{
double f = this->freq;
return cos((2*PI_*f*t)/fs);
}
// |||||||||||||||||||||||||||||||||||||||||| :: generate normal distributed value ...
double signalgen::rand_normal(double mu, double stddev)
{
// start from some number genreated by the clock ...
unsigned seed = std::chrono::steady_clock::now().time_since_epoch().count();
std::default_random_engine gen(seed); // generator
std::normal_distribution distribution(mu,stddev); // distribution
double number = distribution(gen); // random number...
return number;
}
Serial port should stream now
- function value in four digits < float >
- * star sign that shows that sequenece ended
- output looks for this case like here indicated random value,*, random value, * Serial.printf("%.3f*", r);"... 3.083*0.449*0.848*1.846* ...
- CAUTION
- This way of printing to serial is not the best option to do it !
ESP32 features overview :
- Up to 18 12-bit Analog to Digital converters.
- Two 8-bit Digital to Analog converters.
- 10 capacitive touch switch sensors.
- Four SPI channels.
- Two I2C interfaces.
- Two I2S interfaces (for digital audio).
- Three UARTs for communications.
- Up to 8 channels of IR remote control.
- Up to 16 channels of LED PWM (pulse width modulation).
- An integrated Hall-effect sensor.
- An ultra-low-power analog preamp.
- An internal low-dropout regulator.