Skip to content
Snippets Groups Projects
Verified Commit 254eb3bb authored by Andrea Trentini's avatar Andrea Trentini
Browse files

fanloop con adattamento pwm

parent bf47577d
Branches
No related tags found
No related merge requests found
//#define SENSORE 4 // sulla board Arduino UNO solo 2,3
#define SENSORE 2
#define ATTUATORE 12
#define ATTUATORE 3
#define RUMORE 50 // soglia minima interrupt
// TODO 'volatile' (vedere se si può creare un esperimento ad-hoc, non banale)
volatile long timestamp=0;
volatile long durata=0;
volatile long durataMedia=0; // media mobile (molto corta, a 2 elementi)
volatile boolean updated=false;
long durataDesiderata=100; // inverso velocità
float duty=.7; // %
int periodpwm=800; //millis
int periodpwm=2000; //millis
//boolean fai=true; // per il "monitor"
......@@ -47,13 +53,13 @@ Task blinkTask(2*TASK_SECOND, TASK_FOREVER, blink);
///////////////////////////////////////////////////////
boolean dutyOn=false;
//Task pwmDeiPoveryTask(periodpwm*(1-duty), TASK_FOREVER, pwmDeiPovery);
//void pwmDeiPovery(){
Task pwmDeiPoveryTask(periodpwm*(1-duty), TASK_FOREVER, [](){
Task pwmDeiPoveryTask(periodpwm*(1-duty), TASK_FOREVER, pwmDeiPovery);
void pwmDeiPovery(){
//Task pwmDeiPoveryTask(periodpwm*(1-duty), TASK_FOREVER, [](){
Serial.println("pwm");
Serial.println(dutyOn);
noInterrupts(); // non compila in fn anonima
if(dutyOn){
digitalWrite(ATTUATORE,HIGH);
pwmDeiPoveryTask.setInterval(periodpwm*duty);
......@@ -62,11 +68,17 @@ Task pwmDeiPoveryTask(periodpwm*(1-duty), TASK_FOREVER, [](){
digitalWrite(ATTUATORE,LOW);
pwmDeiPoveryTask.setInterval(periodpwm*(1-duty));
}
interrupts(); // non compila in fn anonima
//delay(periodpwm*(duty));
//delay(periodpwm*(1.0-duty));
dutyOn=!dutyOn;
});
duty+=(durataMedia-durataDesiderata)*.001;
if(duty>=1) duty=1.0;
//});
}
......@@ -75,14 +87,15 @@ Task pwmDeiPoveryTask(periodpwm*(1-duty), TASK_FOREVER, [](){
void setup() {
Serial.begin(115200);
pinMode(SENSORE,INPUT); // c'è qualcosa che non va? ;)
pinMode(SENSORE,INPUT_PULLUP);
pinMode(ATTUATORE,OUTPUT);
pinMode(LED_BUILTIN,OUTPUT);
// CONFIGURAZIONE
attachInterrupt(
digitalPinToInterrupt(SENSORE),
rispostaInterrupt,
lap,
RISING);
......@@ -103,9 +116,13 @@ void loop() {
//boolean scattato=digitalRead(SENSORE); // non serve più
if(updated) {
//Serial.print(timestamp);
//Serial.print(F(","));
Serial.print(durata);
Serial.print(F(","));
//Serial.print(F("durata:"));
//Serial.print(durata);
Serial.print(F("media:"));
Serial.print(durataMedia);
Serial.print(F(",desiderata:"));
Serial.print(durataDesiderata);
Serial.print(F(",duty:"));
Serial.println(duty*100);
//Serial.print(",");
//Serial.println(scattato);
......@@ -132,7 +149,7 @@ void loop() {
}
void rispostaInterrupt() {
void lap() {
//noInterrupts(); // non si può invocare da dentro, non ha effetto, va usata fuori per marcare sezioni critiche, qui dentro parte già a interrupt disabilitati
/* versione "monitor" (dei poveri)
......@@ -148,8 +165,9 @@ void rispostaInterrupt() {
//Serial.println("int!"); //da non fare...
long m=millis();
if((m-timestamp)>5) { // per eliminare gli interrupt spuri
if((m-timestamp)>RUMORE) { // per eliminare gli interrupt spuri
durata=m-timestamp;
durataMedia=(durataMedia+durata)/2;
timestamp=m;
updated=true;
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment