Benvenuto in Moddingstudio.com.

  1. #1
    Alarikka è offline
    • Registrato da Feb 2015
    • Messaggi: 7
    • Ha ringraziato: 0
      Grazie ricevuti: 0

    Exclamation Progetto arduino modifica frequenza con interrupt

    Sto lavorando ad un progetto su Arduino Uno, lo scopo è di comandare i pin digitali contemporaneamente in diverse modalità: semplice on-off, pwm, e onda quadra con la frequenza desiderata.
    Ho dei problemi con la realizzazione dell'ultimo punto. Ho guardato un po su internet e il metodo consigliato è quello di manipolare gli interrupt per ottenere la frequenza voluta, il problema è che da quello che leggo questo cambiamento deve essere fatto nel setup, mentre io dovrei inserirlo nel loop dato che la frequenza è a scelta dell'utente. Qualcuno ha qualche consiglio? Non sono espertissima di Arduino e di programmazione in generale e sto diventando pazza

  2. # ADS
    Circuit advertisement


     

  3. #2
    RyujiAndy è offline
    • Registrato da Jul 2009
    • Messaggi: 668
    • Ha ringraziato: 1
      Grazie ricevuti: 11

      Visita il profilo Google+ di RyujiAndy
    Il [Solo gli utenti registrati e attivati possono vedere i link ] è un'onda quadra
    Comunque se fornisci sketch e schema elettrico si può vedere nel dettaglio cosa intendi fare.
    SM-G901F using ModdingStudio mobile app
    Stesso pianeta Tutto un altro Mondo
    Gleiche Planet ganz andere Welt.

  4. #3
    Alarikka è offline
    • Registrato da Feb 2015
    • Messaggi: 7
    • Ha ringraziato: 0
      Grazie ricevuti: 0

    si ma con la pwm non si può modificare la frequenza ma solo il duty cycle, mi sono spiegata male forse. Nell ultima modalità voglio una pwm di cui posso impostare io la frequenza a piacimento, mentre nella seconda modalità una semplice pwm con duty cycle voluto( e uso una semplice Analogwrite(---).

    Lo sketch di questaparte non ce l'ho, perche come ho detto non so bene come farlo, devo metterlo nel loop perche la frequenza deve essere scelta dall utente, non posso preimpostarla io, ma mi sembra che bisogna settarlo per forza nel setup, quindi mi chiedevo se qualcuno ha qualche idea
    Ultima modifica di Alarikka; 22-02-2015 alle 22:04

  5. #4
    RyujiAndy è offline
    • Registrato da Jul 2009
    • Messaggi: 668
    • Ha ringraziato: 1
      Grazie ricevuti: 11

      Visita il profilo Google+ di RyujiAndy
    Senza creare una funzione si può usare il comando tone, che di norma si usa per creare un suono, e non é altro che un'onda quadra, ma la frequenza minima è di 31Hz e interferisce sulla funzione pwm del pin 3 e 11

    SM-G901F using ModdingStudio mobile app
    Ultima modifica di RyujiAndy; 23-02-2015 alle 06:40
    Stesso pianeta Tutto un altro Mondo
    Gleiche Planet ganz andere Welt.

  6. #5
    Alarikka è offline
    • Registrato da Feb 2015
    • Messaggi: 7
    • Ha ringraziato: 0
      Grazie ricevuti: 0

    Grazie mille ma credo di aver risolto :
    ho impostato i timer nel setup al valore di frequenza maggiore possibile, e poi ho implementato un contatore software per diminuire la frequenza!

  7. #6
    RyujiAndy è offline
    • Registrato da Jul 2009
    • Messaggi: 668
    • Ha ringraziato: 1
      Grazie ricevuti: 11

      Visita il profilo Google+ di RyujiAndy
    Potresti postare il codice, per pura curiosità

    SM-G901F using ModdingStudio mobile app
    Stesso pianeta Tutto un altro Mondo
    Gleiche Planet ganz andere Welt.

  8. #7
    Alarikka è offline
    • Registrato da Feb 2015
    • Messaggi: 7
    • Ha ringraziato: 0
      Grazie ricevuti: 0

    Allora in realtà ho parlato troppo presto, nel senso che è solo un idea, non ho ancora scritto il codice. Per adesso ho modificato le frequenze dei timer0 timer1 e timer2 in modo da farli lavorare alla stessa frequenza ( impostandola a 31250 per tutti e tre).
    Mi manca adesso il contatore software che realizzerò ( almeno ci provo , appena ho fatto te lo posto se vuoi) : praticamente in base alla frequenza inserita dall'utente e alla frequenza a cui va il timer ( che quindi sarà 31250Hz) vorrei riuscire ad avere l'onda quadra della frequenza che voglio.

    Questo è il setup del timer0 ( per gli altri due è molto simile)

    //set timer0 interrupt a 31250Hz
    TCCR0A = 0; // imposto il registro TCCR0A a 0
    TCCR0B = 0; // uguale per il registro TCCR0B
    TCNT0 = 0; // inizializzo il contatore a 0
    OCR0A = 8; // (16*10^6) / (31250*64) -1
    TCCR0A |= (1 << WGM01); //enable modalità CTC
    TCCR0B |= (1 << CS01) | (1 << CS00); // Set CS01 e CS00 bits per il prescaler a 64
    TIMSK0 |= (1 << OCIE0A); //enable timer compare interrupt

    ho preso spunto da questo sito : [Solo gli utenti registrati e attivati possono vedere i link ]

    Ma ci ho capito qualcosa solo guardando il datasheet dell' ATMega , se ti interessa guarda dalla pagina 104 in giù più o meno

    In questo modo ho modificato i timer nel setup ( cosa che invece volevo fare nel loop senza incasinarmi cosi) e poi modifico la frequenza nel loop con un timer software ( se riesco haha)

  9. #8
    RyujiAndy è offline
    • Registrato da Jul 2009
    • Messaggi: 668
    • Ha ringraziato: 1
      Grazie ricevuti: 11

      Visita il profilo Google+ di RyujiAndy
    Come settare le frequenze dei time mi era già chiara la mia curiosità sta nei contatori per il settaggio dei segnali, così agendo forse era più semplice crearsi un controllo su di una variabile settata sulla funzione micros () e poi puoi mandare il pin desiderato in HIGH o LOW, in questo modo non sei soggetto ai pin pwn.




    SM-G901F using ModdingStudio mobile app
    Stesso pianeta Tutto un altro Mondo
    Gleiche Planet ganz andere Welt.

  10. #9
    Alarikka è offline
    • Registrato da Feb 2015
    • Messaggi: 7
    • Ha ringraziato: 0
      Grazie ricevuti: 0

    secondo te posso usare l'interrupt del timer0 per mettere nella routine di interrupt il contatore per il segnale? una roba del genere :

    da quello che ho capito dal sito questa dovrebbe essere la routine dell'interrupt per il timer0:

    ISR(Timer0_COMPA_vect){

    for (i=0,i<13,i++){
    pinArray[i]->runmode3();

    }


    void Pin :: runmode3(){
    if(Mode ==3){

    if(Counter == 2*FreqCounterValue){
    Counter = 0;
    }

    if(Counter < FreqCounterValue)
    {
    digitalWrite(PinNumber, HIGH);
    Counter++;
    }

    if(Counter < 2* FreqCounterValue & Counter > FreqCounterValue)
    {
    digitalWrite(PinNumber, HIGH);
    Counter++;
    }

    }
    }

    l' " if(mode == 3) mi serve solo perche i pin possono lavorare in 3 modalità nel mio programma e la modalità 3 è appunto quella in cui comando la frequenza.
    In freqcounter value ho salvato il numero a cui deve arrivare il contatore per avere la frequenza desiderata (l'ho poi diviso per 2 per avere il tempo di HiGH o di LOW) --> FreqCounterValue = 31250 / 2 * Frequency; dove Frequency è la frequenza in ingresso dall utente e 31250 è apunto la frequenza del timer0
    Cosa ne pensi, potrebbe funzionare?
    Ultima modifica di Alarikka; 25-02-2015 alle 08:42

Tag per Questa Discussione

Permessi di Scrittura

  • Tu non puoi inviare nuove discussioni
  • Tu non puoi inviare risposte
  • Tu non puoi inviare allegati
  • Tu non puoi modificare i tuoi messaggi
  •  
Torna a inizio pagina
Moddingstudio.com - Powered by vBulletin
Copyright (c) 2011 vBulletin Solutions, Inc. All rights reserved.
Brown Editore S.r.l. - Capitale Sociale 1.087.500€ I.V. - P.Iva: 12899320159 - Viale Sarca, 336 Edificio 16 - 20126 Milano
Tutti gli orari sono GMT +1. Adesso sono le 13:38.