Go Down

Topic: attachInterrupt: variare pwm per la durata dell'interrupt  (Read 135 times) previous topic - next topic

Colossus86

Ciao a tutti,
in pratica sto cercando di leggere i giri di una ventola controllata via pwm con il pin tachimetrico.
Finchè tengo il valore del pwm a 255, la lettura è perfetta, ma quando la abbasso, l'arduino mi legge sballato perchè alle variazioni del tachimetro, aggiunge quelli del pwm.
Pensavo di risolvere il problema mettendo per la durata della misurazione (es. 1 secondo) il pwm a 255, ma non riesco a far funzionare la cosa. Mi rimangono fissi i giri che imposto sotto (per ora sono fissi, ma dopo li faro' variare in proporzione alla temperatura rilevata da un DS18B20 usando map.

 Giri1 = 0; //Azzare il numero di giri per il calcolo
 pwm1 = 255;
 sei(); // Attiva gli interrupt
  delay (1000); //Aspetta un secondo
 cli(); // disattiva gli interrupt
 // leggiamo su 1 secondo, gli impulsi x60 e si hanno gli RPM
 // ma con le ventole a 2 o 4 poli abbiamo gia doppi o quadrupli impulsi al giro
 // quindi riscaliamo il fattore moltiplicvativo x 30 con 2 poli (x15 con 4 poli)
 numGiri1 = ((Giri1  * 30));

// funzione interrupt ventola
void rpm1 ()
{
  Giri1++;
}


consigli?

Grazie

cyberhs


Colossus86

non guardate la funzione map che finiro' di sistemare dopo.
Per ora il pwm lo regolo manualmente per fare le prove.
Ah il tutto su una MEGA 2560

Code: [Select]
#include <OneWire.h>
#include <DallasTemperature.h>
 
//nome e lettura sensore 1
#define ONE_WIRE_BUS 53
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);


int tempMin1 = 23;
int tempMax1 = 31;

//variabile lettura sensore
int tempValue = 0;
//float temperature= 0;

//pin collegamento tachimetro
int RPM = 2;
// controllo velocita' ventola
int FAN1 = 6; //pin controllo pwm
//imposta frequenza pwm ventola 1
int pwm1 = 0;

volatile int Giri1; //numero di giri al secondo
int numGiri1;


void setup(void)
{
// start serial port
Serial.println("Dallas Temperature IC Control Library Demo");
//pin tachimetro in lettura
pinMode(RPM, INPUT);
//imposto pin controllo pwm come output
pinMode(FAN1, OUTPUT);
//avvio libreria sensori
sensors.begin();

//quando lancio l'interrupt, conta quante volte cambia lo stato (acceso-spento)
attachInterrupt(digitalPinToInterrupt(2), rpm1, RISING);

//imposta timer 4  (pin 6,7,8) a 31khz
TCCR4B = TCCR4B & 0b11111000 | 0x01;

Serial.begin(9600);
}
 
 
void loop(void)

{
// blocco lettura e scrittura temperatura
Serial.print(" Requesting temperatures...");
sensors.requestTemperatures(); // Send the command to get temperatures
Serial.println("DONE");
Serial.print("Temperature for Device 1 is: ");
Serial.print(sensors.getTempCByIndex(0));
   
   
//sezione giri ventola
 Giri1 = 0; //Azzare il numero di giri per il calcolo
 pwm1 = 255;
 sei(); // Attiva gli interrupt
  delay (1000); //Aspetta un secondo
 cli(); // disattiva gli interrupt
 // leggiamo su 1 secondo, gli impulsi x60 e si hanno gli RPM
 // ma con le ventole a 2 o 4 poli abbiamo gia doppi o quadrupli impulsi al secondo
 // quindi riscaliamo il fattore moltiplicvativo x 30 con 2 poli (x15 con 4 poli)
 numGiri1 = ((Giri1  * 30));


//regolazione velocita' ventola
//regolRpm();
pwm1 = 200;
analogWrite(FAN1, pwm1);

visualizza();

}

 
//////////////
/* Funzioni */
//////////////

// funzione interrupt ventola1
void rpm1 ()
{
  Giri1++;
}
/*
//funzione regolazione velocita'
void regolRpm(){
   //regolazione rpm 1
  if (((int)(temperature) >= tempMin1) && ((int)(temperature) <= tempMax1)) {
      pwm1 = map((int)(temperature), tempMin1, tempMax1, 120, 255);
      analogWrite(FAN1, pwm1);
  }
 
  if ((int)(temperature) > tempMax1)
  {
    pwm1=255;
    analogWrite(FAN1, pwm1);
  }
 
  if ((int)(temperature) < tempMin1)
  {
    pwm1 = 0;
    analogWrite(FAN1, pwm1);
  }
}
*/
//funzione scrittura dati su seriale
void visualizza(){
  //Serial.print(temperature);
 // Serial.print("c");
  Serial.print("  ");
  Serial.print(pwm1,DEC);
  Serial.print(" rpm");
  Serial.print(" (");
  Serial.print(numGiri1, DEC);
  Serial.println(")");
}

Go Up