Pagina 1 di 1

Cambio frequenza PWM blocca il programma

MessaggioInviato: 23 giu 2017, 15:27
da dadothebest
Ciao, vorrei controllare delle ventole da 2 pin con arduino e ho notato che variando la velocità tramite PWM emettono un fastidioso ronzio. Ho trovato su internet un modo per variare la frequenza del PWM e portarla a 31kHz così che non facciano più rumore. Sul setup del codice ho inserito:

Codice: Seleziona tutto
TCCR1B = (TCCR1B & 0b11111000) | 0X01;


che mi varia il timer 1 sui pin 9 e 10.
La ventola non emette più nessun ronzio ma appena viene dato il comando di accensione (che sia tramite pulsante o sensore di temperatura) la ventola parte come dichiarato ma il codice si blocca non eseguendo più nessun'altra funzione.
Se elimino la riga il tutto torna a funzionare come dovrebbe. Come mai questo comportamento?
Allego tutto il codice:

Codice: Seleziona tutto
#include <Time.h>
#include <TimeAlarms.h>
#include <DS3231.h>
#include <DS3232RTC.h>
#include <Wire.h>
#include <IRremote.h>
#include <LEDFader.h>
DS3231  rtc(SDA, SCL);
Time t;


//DEFINISCO RICEVITORE E TRASMETTITORE IR
int RECV_PIN = 13;
IRrecv irrecv(RECV_PIN);
IRsend irsend;
decode_results results;


//DEFINISCO I PIN UTILIZZATI
     #define router                  A0                                                           //RELE' 1
     #define voip                    A1                                                           //RELE' 2
     #define wii                     A3                                                           //RELE' 3
     //                              3                                                            //TRASMETTITORE IR
     #define PC                      4                                                            //RELE' 4
     #define led_sopra               11                                                            //TRANSISTOR GRANDE
     #define led_tv                  6                                                            //TRANSISTOR GRANDE                             
     #define stereo                  7                                                            //RELE' 5
     #define giradischi              8                                                            //RELE' 6
    // #define led_stato               5                                                            //TRANSISTOR PICCOLO                   
     #define ventola_alimentatore    10                                                           //TRANSISTOR GRANDE
     //                              11                                                           //RICEVITORE IR
     #define lampada                 12                                                           //RELE' 7                                                                                           
     #define ventola_generale        9                                                           //TRANSISTOR GRANDE                                       

     #define amp_giradischi          A2
     //#define SVILUPPI FUTURI                                                                    //RELE' 8, NON UTILIZZATO
     #define pulsante                A5
     #define interr_3luci            2


//FADE LED

LEDFader led_stato = LEDFader(5);


//COSTANTI VOIP E ROUTER
     unsigned long time;
     unsigned long tempoCorrente_Router_Voip;
     unsigned long tempo_Router_Voip=0;
     int stato_Router_Voip = 0;
     int Avvio_Router_Voip = 1;
     int Riavvio_Router_Voip = 0;


//FUNZIONE LED
     int stato_led_fade = 0;
     int contatore_led_fade = 0;     
     int numero_fade = 0;
     int stato_led_blink = 0;
     int contatore_led_blink = 0;
     int numero_blink = 0;

//INTERRUTTORE E PULSANTE
     int lettura_interruttore_3luci;



//PULSANTI IR
     #define ritardo_pulsante 500

     int stato_wii = 0;
     int lettura_pulsante_wii;
     int valore_precedente_pulsante_wii = LOW;
     unsigned long tempo_wii = 0;
     unsigned long tempoCorrente_wii;

     int stato_pc = 0;
     int lettura_pulsante_pc;
     int valore_precedente_pulsante_pc = LOW;
     unsigned long tempo_pc = 0;
     unsigned long tempoCorrente_pc;

     int stato_stereo = 0;
     int lettura_pulsante_stereo;
     int valore_precedente_pulsante_stereo = LOW;
     unsigned long tempo_stereo = 0;
     unsigned long tempoCorrente_stereo;
     unsigned long tempo_ir_stereo;

     int stato_giradischi = 1;
     int lettura_pulsante_giradischi;
     int valore_precedente_pulsante_giradischi = LOW;
     unsigned long tempo_giradischi = 0;
     unsigned long tempoCorrente_giradischi;


     int stato_riavvio_router_voip = 1;
     int lettura_pulsante_riavvio_router_voip;
     int lettura_pulsante_conferma_azione;
     int valore_precedente_pulsante_conferma_azione = LOW;
     unsigned long tempo_riavvio_router_voip = 0;
     unsigned long tempoCorrente_riavvio_router_voip;

     int stato_router = 0;
     int stato_pulsante_modem = 1;
     int lettura_pulsante_modem;
     unsigned long tempo_riavvio_modem = 0;
     unsigned long tempoCorrente_riavvio_modem;

     int stato_voip = 0;
     int stato_pulsante_voip = 1;
     int lettura_pulsante_voip;
     unsigned long tempo_riavvio_voip = 0;
     unsigned long tempoCorrente_riavvio_voip;

     int stato_riavvio = 1;
     int lettura_pulsante_riavvio;
     unsigned long tempo_riavvio= 0;
     unsigned long tempoCorrente_riavvio;

          int stato_led_sopra = 0;
     int lettura_pulsante_led_sopra;
     int valore_precedente_pulsante_led_sopra=LOW;
     unsigned long tempo_led_sopra = 0;
     unsigned long tempoCorrente_led_sopra;
     int luminosita=0;

     
//FUNZIONE PER RIAVVIARE ARDUINO
     void(* Riavvia)(void) = 0;


//--------------------------------------------------------------------------------------------------SETUP-------------------------------------------------------------------------------------------


void setup(){

TCCR1B = (TCCR1B & 0b11111000) | 0X01;

//AVVIO IR
     irrecv.enableIRIn();


//IMPOSTAZIONE LE VARIABILI TEMPO 
     rtc.begin();
     tempoCorrente_Router_Voip=millis();
     tempoCorrente_wii=millis();
     tempoCorrente_pc=millis();
     tempoCorrente_stereo=millis();
     tempoCorrente_giradischi=millis();

 
//IMPOSTAZIONE INGRESSI E USCITE 
      pinMode(router, OUTPUT);
      pinMode(voip, OUTPUT);
      pinMode(wii, OUTPUT);
      pinMode(PC, OUTPUT);
      pinMode(led_sopra, OUTPUT);
      pinMode(led_tv, OUTPUT);
      pinMode(stereo, OUTPUT);
      pinMode(giradischi, OUTPUT);
      pinMode(ventola_alimentatore, OUTPUT);
      //pinMode(led_stato, OUTPUT);
      pinMode(lampada, OUTPUT);
      pinMode(ventola_generale, OUTPUT);
      pinMode(amp_giradischi, OUTPUT);

      pinMode(pulsante, INPUT);
      pinMode(interr_3luci, INPUT);
   


//IMPOSTAZIONE DEI PIN ALL'AVVIO     
      digitalWrite(router, LOW );                                                   //RELE' 1 -------- LOW
      digitalWrite(voip, LOW );                                                     //RELE' 2 -------- LOW               
      digitalWrite(wii, LOW );                                                      //RELE' 3 -------- LOW
      digitalWrite(PC, LOW );                                                       //RELE' 4 -------- LOW
      analogWrite(led_sopra, 0 );
      analogWrite(led_tv, 0 );
      digitalWrite(stereo, LOW );                                                   //RELE' 5 -------- LOW
      digitalWrite(giradischi, HIGH );                                              //RELE' 6 -------- HIGH
      //analogWrite(led_stato, LOW );
      analogWrite(ventola_alimentatore, LOW );
      digitalWrite(lampada, HIGH );                                                 //RELE' 7 -------- HIGH
      analogWrite(ventola_generale, LOW );
      //digitalWrite(SVILUPPI FUTURI, HIGH );                                       //RELE' 8 -------- HIGH
      digitalWrite(amp_giradischi, LOW );
      digitalWrite(2, INPUT_PULLUP);
      digitalWrite(A5, INPUT_PULLUP);
     
}



void loop() {

//AVVIO RECEZIONE CODICI IR
     {if (irrecv.decode(&results)) {Serial.println(results.value, HEX); irrecv.resume();}}

     
//AVVIO DEI PROGRAMMI
     Router_Voip();
    Fade_led();
     Blink_led();
     Wii();
     Giradischi();
     PC();
     Stereo();
     Pulsante_riavvio_router_voip();
     Pulsante_modem();
     Pulsante_voip();
 
     Pulsante_riavvio();
//  Led_sopra();
     

 
//PROGRAMMA RIAVVIO E SPEGNIMENTO DISPOSITIVI
     t = rtc.getTime();
     if (t.date == 1 && t.hour == 05 && t.min == 00 && t.sec == 00) {Riavvia();}                                                                                               //Riavvia arduino il 1 alle 05:00:00
     if (t.date == 06 && t.hour == 13 && t.min == 33 && t.sec == 00) {Riavvio_Router_Voip = 1;}                                                                                //Riavvia router e voip il 15 alle 05:00:00
     if (t.date == 06 && t.hour == 13 && t.min == 32 && t.sec == 00) {stato_led_blink=1;numero_blink=1000;}                                                                                                 
     if (t.hour == 05 && t.min == 30 && t.sec == 00) {digitalWrite(PC, LOW ); digitalWrite(stereo, LOW ); digitalWrite(wii, LOW ); digitalWrite(giradischi, LOW );}            //Spegne alle 05:30:00

                                         
//VENTOLA GENERALE
     if (rtc.getTemp()<30)   {analogWrite(ventola_generale, 0);}
     if (rtc.getTemp()>30)   {analogWrite(ventola_generale, 250);}


//VENTOLA ALIMENTATORE
   if (stato_wii==0 & stato_giradischi==1){analogWrite(ventola_alimentatore, 0);}
     if (stato_wii==1 & stato_giradischi==1){analogWrite(ventola_alimentatore, 200);}
     if (stato_wii==0 & stato_giradischi==0){analogWrite(ventola_alimentatore, 150);}
     if (stato_wii==1 & stato_giradischi==0){analogWrite(ventola_alimentatore, 250);}
     

     
//PULSANTI
     lettura_interruttore_3luci = analogRead (interr_3luci);
     lettura_pulsante_giradischi = results.value == 0xFF22DD;
     lettura_pulsante_wii = results.value == 0xFFE21D;
     lettura_pulsante_pc = results.value == 0xFF629D;
     lettura_pulsante_stereo = results.value == 0xFFA25D;
     lettura_pulsante_conferma_azione = results.value == 0xFF38C7;
     lettura_pulsante_riavvio_router_voip = results.value == 0xFF906F;
     lettura_pulsante_led_sopra = results.value == 0xFF4AB5;
//     lettura_pulsante_DIMINUISCE_led_sopra = results.value == 0xFF4AB5;FF6897
     lettura_pulsante_modem = results.value == 0xFFE01F;
     lettura_pulsante_voip = results.value == 0xFFA857;
     lettura_pulsante_riavvio = results.value == 0xFFC23D;



}




//---------------------------------------------------------------------------------------------------ALTRI PROGRAMMI---------------------------------------------------------------------------------------------

//PROGRAMMA AVVIO ROUTER E VOIP
  void Router_Voip()
     {if((Avvio_Router_Voip==1)||(Riavvio_Router_Voip==1)) {stato_Router_Voip=1; Avvio_Router_Voip=0; Riavvio_Router_Voip = 0; digitalWrite(router,LOW); digitalWrite(voip,LOW); stato_router = 0; stato_voip = 0; stato_led_fade=1;numero_fade=5;}
     tempoCorrente_Router_Voip=millis();
     if((tempoCorrente_Router_Voip-tempo_Router_Voip>=5000)&&stato_Router_Voip==1) {digitalWrite(router,HIGH); stato_router = 1; stato_Router_Voip=2; tempo_Router_Voip=millis();}
     else if (stato_Router_Voip==2) {if(tempoCorrente_Router_Voip-tempo_Router_Voip>=2000) {digitalWrite(voip,HIGH); stato_voip = 1; stato_Router_Voip=0;}}}


//PROGRAMMA FADE LED DI STATO
  void Fade_led()
     {led_stato.update();
     if ((led_stato.is_fading() == false)&&(stato_led_fade == 1))
     {if (led_stato.get_value() == 255) {led_stato.fade(0, 1000);contatore_led_fade++;}
     else {led_stato.fade(255, 1000);}}
     if (contatore_led_fade == numero_fade){stato_led_fade = 0; contatore_led_fade = 0;}}

  void Blink_led()
     {led_stato.update();
     if ((led_stato.is_fading() == false)&&(stato_led_blink == 1))
     {if (led_stato.get_value() == 255) {led_stato.fade(0, 100);contatore_led_blink++;}
     else {led_stato.fade(255, 100);}}
     if (contatore_led_blink == numero_blink){stato_led_blink = 0; contatore_led_blink = 0;}}





void Wii()
     {tempoCorrente_wii=millis();
     if (lettura_pulsante_wii == HIGH && valore_precedente_pulsante_wii == LOW && tempoCorrente_wii - tempo_wii > ritardo_pulsante)
     {if (stato_wii == 1) stato_wii = 0; else stato_wii = 1; tempo_wii = millis(); }
     digitalWrite(wii, stato_wii);
     valore_precedente_pulsante_wii = lettura_pulsante_wii;}
     
void PC()
     {tempoCorrente_pc=millis();
     if (lettura_pulsante_pc == HIGH && valore_precedente_pulsante_pc == LOW && tempoCorrente_pc - tempo_pc > ritardo_pulsante)
     {if (stato_pc == 1) stato_pc = 0; else stato_pc = 1; tempo_pc = millis(); }
     digitalWrite(PC, stato_pc);
     valore_precedente_pulsante_pc = lettura_pulsante_pc;}
     
void Stereo()
     {tempoCorrente_stereo=millis();
     if (lettura_pulsante_stereo == HIGH && valore_precedente_pulsante_stereo == LOW && tempoCorrente_stereo - tempo_stereo > ritardo_pulsante)
     {if (stato_stereo == HIGH) stato_stereo = LOW; else stato_stereo = HIGH; tempo_stereo = millis(); }
     digitalWrite(stereo, stato_stereo);
     valore_precedente_pulsante_stereo = lettura_pulsante_stereo;}
     
void Giradischi()
     {tempoCorrente_giradischi=millis();
     if (lettura_pulsante_giradischi == HIGH && valore_precedente_pulsante_giradischi == LOW && tempoCorrente_giradischi - tempo_giradischi > ritardo_pulsante)
     {if (stato_giradischi == 1) stato_giradischi = 0; else stato_giradischi = 1; tempo_giradischi = millis(); }
     digitalWrite(giradischi, stato_giradischi);
     digitalWrite(amp_giradischi, !stato_giradischi);
     valore_precedente_pulsante_giradischi = lettura_pulsante_giradischi;}

void Pulsante_riavvio_router_voip()
     {if (stato_riavvio_router_voip == 1 && lettura_pulsante_riavvio_router_voip == HIGH){ tempo_riavvio_router_voip = millis() + 2000; stato_riavvio_router_voip = 2; led_stato.fade(255, 500);}
     if (stato_riavvio_router_voip == 2 && lettura_pulsante_conferma_azione == HIGH && millis() < tempo_riavvio_router_voip) {stato_riavvio_router_voip = 3;}
     if (stato_riavvio_router_voip == 2 &&  millis() > tempo_riavvio_router_voip) {stato_riavvio_router_voip = 4;}
     if (stato_riavvio_router_voip == 3) {Riavvio_Router_Voip=1; stato_riavvio_router_voip = 1;}
     if (stato_riavvio_router_voip == 4) {stato_riavvio_router_voip = 1; led_stato.fade(0, 500);}}

void Pulsante_modem()
     {if (stato_pulsante_modem == 1 && lettura_pulsante_modem == HIGH){ tempo_riavvio_modem = millis() + 2000; stato_pulsante_modem = 2; led_stato.fade(255, 500);}
     if (stato_pulsante_modem == 2 && lettura_pulsante_conferma_azione == HIGH && millis() < tempo_riavvio_modem) {stato_pulsante_modem = 3;}
     if (stato_pulsante_modem == 2 &&  millis() > tempo_riavvio_modem) {stato_pulsante_modem = 4;}
     if (stato_pulsante_modem == 3) {stato_pulsante_modem = 1;     
     {if (lettura_pulsante_conferma_azione == HIGH) {if (stato_router == 1) {digitalWrite(router, LOW); stato_router = 0;} else {digitalWrite(router, HIGH); stato_router = 1;}}}}
     if (stato_pulsante_modem == 4) {stato_pulsante_modem = 1; led_stato.fade(0, 500);}}

void Pulsante_voip()
     {if (stato_pulsante_voip == 1 && lettura_pulsante_voip == HIGH){ tempo_riavvio_voip = millis() + 2000; stato_pulsante_voip = 2; led_stato.fade(255, 500);}
     if (stato_pulsante_voip == 2 && lettura_pulsante_conferma_azione == HIGH && millis() < tempo_riavvio_voip) {stato_pulsante_voip = 3;}
     if (stato_pulsante_voip == 2 &&  millis() > tempo_riavvio_voip) {stato_pulsante_voip = 4;}
     if (stato_pulsante_voip == 3) {stato_pulsante_voip = 1;     
     {if (lettura_pulsante_conferma_azione == HIGH) {if (stato_voip == 1) {digitalWrite(voip, LOW); stato_voip = 0;} else {digitalWrite(voip, HIGH); stato_voip = 1;}}}}
     if (stato_pulsante_voip == 4) {stato_pulsante_voip = 1; led_stato.fade(0, 500);}}

void Pulsante_riavvio()
     {if (stato_riavvio == 1 && lettura_pulsante_riavvio == HIGH){ tempo_riavvio = millis() + 2000; stato_riavvio = 2;led_stato.fade(255, 500);}
     if (stato_riavvio == 2 && lettura_pulsante_conferma_azione == HIGH && millis() < tempo_riavvio) {stato_riavvio = 3;}
     if (stato_riavvio == 2 &&  millis() > tempo_riavvio) {stato_riavvio = 4;}
     if (stato_riavvio == 3) {Riavvia(); stato_riavvio = 1; led_stato.fade(0, 500);}
     if (stato_riavvio == 4) {stato_riavvio = 1; led_stato.fade(0, 500);}}


Re: Cambio frequenza PWM blocca il programma

MessaggioInviato: 25 giu 2017, 14:59
da Pixy

Re: Cambio frequenza PWM blocca il programma

MessaggioInviato: 29 giu 2017, 16:10
da dadothebest
Grazie dell'aiuto ma ho risolto semplicemente salvando in un nuovo file lo sketch... Com'è possibile che si bloccava il programma finché non ho salvato il programma in un altro file? #-o