Go Down

Topic: alimentare atmega standalode con batteria da 6v (Read 4946 times) previous topic - next topic

pndtkd

Dato che il pololu ha un efficienza del 90 e più % anche mettendo una batt a 6v con credo consumi tanto in step down (il prob è con l'up)....quindi penso sia sufficiente scendere a 3,3v per il circuito potendo lasciare la batt a 6v.

Michele Menniti

un consumo c'è sempre, altrimenti l'efficienza sarebbe del 100%, mi sembra strano che siano 30mA, puoi anche usare lui per ridurre tutto a 3,3V ma non è affatto la stessa cosa che usare direttamente una batteria con la tensione esatta; resta il fatto che allo stato attuale micro e/o xbee stanno consumando troppa corrente; vediamo prima chi è dei due e poi perché.
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

pndtkd

sisi sono d'accordo circa il fatto di utilizzare una tensione esatta ma ciò che dicevo è che avendo un alta efficienza probabilmente ha un consumo non molto alto...ciò che penso è che bisogna trovare il "grosso" del consumo...come torno a casa provo e posto.

pndtkd

#33
Jul 03, 2013, 10:55 pm Last Edit: Jul 03, 2013, 11:00 pm by pndtkd Reason: 1
Dunque ho fatto un po di prove ed i dati sono riferiti con oscillatore da 16Mhz:

1)SOLO MICRO INSLEEP---------> 82ma

2)SOLO MICRO ATTIVO--------- > 105 ma

a questo punto attacco il modulo xbee anch'esso con modalità sleep(quella che a me serve ovvero un protocollo LPL)

3)MICRO + XBEE sleep -------> 143 ma

4)MICRO + XBEE quando arriva il dato sul seriale che poi deve essere passato al condizionatore------> 160ma
[tale modalità dura 10 sec poi torna tutto a nanna e quindi con consumo stabile a 143ma]

facendo due banali conti tornano le 8 ore dato che per la maggior parte del tempo sto in configurazione 3 tranne quando decido di inviare l'impulso di accendere...quindi mediamente 150----> 1200/150=8....ovvero le ore che mi dura la batteria che ho a disposizione.

yoshi93

Quando dici SOLO MICRO IN SLEEP intedi dire che hai misurato solo l'atmega da solo senza niente oppure c'è il regolatore o altre cose?

pndtkd

micro + regolatore piu' ciò che serve per far funzionare il micro(condensatori)

pndtkd

Ho provato a modificare mettendo il quarzo da 8mhz esterno modificando il file boards.txt aggiungendo:
Code: [Select]

atmega8pnd.name=Arduino UnoPnd
atmega8pnd.upload.protocol=arduino
atmega8pnd.upload.maximum_size=32256
atmega8pnd.upload.speed=115200
atmega8pnd.bootloader.low_fuses=0xff
atmega8pnd.bootloader.high_fuses=0xde
atmega8pnd.bootloader.extended_fuses=0x05
atmega8pnd.bootloader.path=optiboot
atmega8pnd.bootloader.file=optiboot_atmega328.hex
atmega8pnd.bootloader.unlock_bits=0x3F
atmega8pnd.bootloader.lock_bits=0x0F
atmega8pnd.build.mcu=atmega328p
atmega8pnd.build.f_cpu=8000000L
atmega8pnd.build.core=arduino
atmega8pnd.build.variant=standard


In tal modo quando vado a caricare il firmware mi dà: avrdude: stk500_getsync(): not in sync: resp=0x06

ed anche rimettendo come board Arduino UNO mi dà cmq un problema di sync

Michele Menniti

Ma tu stai usando il bootloader o carichi direttamente via ISP il firmware?
I valori che hai rilevato sono altissimi, troppo lontani dalle condizioni di sleep.
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

pndtkd

bootloader...

posto anche lo sketch:
Code: [Select]

#include <IRremote.h>//Libreria modificata per la gestione dei segnali IR

#include <avr/power.h>
#include <avr/sleep.h>

/*Librerie per lo sleep mode---->
tipi di sleep:
In the avr/sleep.h file, the call names of these sleep modus are to be found:
     *
     * The 5 different modes are:
     *     SLEEP_MODE_IDLE         -the least power savings
     *     SLEEP_MODE_ADC
     *     SLEEP_MODE_PWR_SAVE
     *     SLEEP_MODE_STANDBY
     *     SLEEP_MODE_PWR_DOWN     -the most power savings

Inizialmente ho provato ad usare SLEEP_MODE_PWR_SAVE ma in questo modo viene disabilitata
anche L'USART(periferica predisposta per la comunicazione seriale) quindi utilizzo SLEEP_MODE_IDLE
che mi lascia la USART attiva e per avere comunque i vantaggi dello SLEEP_MODE_PWR_DOWN
utilizzo le funzioni definite in power.h per disabilitare gli altri moduli che non mi servono.
Quindi quando verranno ricevuti dati sull'USART l'ATMEGA 328p verrà svegliato (dato che la USART genera un interrupt e,
ogni interrupt, fà risvegliare il microcontroller).
*/

IRsend irsend;//creo un'istanza irsend


int sleepStatus = 0;             // variable to store a request for sleep
int count = 0;                   // counter


/*vettore dei codici raw per lo spegnimento*/
unsigned int arrayON[]={3450, 1650, 500, 1200, 500, 1200, 500, 400, 450, 400, 500, 350, 450, 1250, 500, 350, 500, 350, 500, 1250, 450, 1250, 500, 350, 450, 1250, 500, 350, 500, 400, 450, 1250, 500, 1200, 500, 350, 500, 1250, 450, 1250, 450, 400, 500, 350, 500, 1200, 500, 350, 500, 400, 450, 1250, 500, 350, 500, 350, 500, 350, 500, 400, 450, 400, 500, 350, 500, 350, 500, 350, 500, 350, 500, 350, 500, 400, 450, 400, 500, 350, 500, 350, 500, 350, 550, 300, 550, 350, 500, 350, 500, 350, 500, 350, 500, 350, 500, 400, 500, 350, 500, 350, 500, 350, 500, 350, 550, 1200, 500, 1200, 450, 400, 500, 1200, 500, 350, 500, 400, 450, 400, 500, 350, 500, 1200, 500, 350, 550, 350, 500, 350, 500, 350, 500, 350, 500, 1200, 550, 1200, 500, 350, 500, 1200, 500, 350, 500, 350, 500, 400, 500, 350, 500, 350, 500, 1200, 500, 1200, 500, 350, 500, 1250, 500, 1200, 500, 350, 500, 350, 500, 350, 500, 350, 500, 400, 500, 350, 500, 350, 500, 350, 500, 400, 450, 400, 500, 350, 500, 350, 500, 350, 550, 350, 450, 400, 500, 350, 550, 300, 500, 350, 500, 400, 500, 350, 450, 400, 500, 350, 500, 400, 500, 350, 450, 400, 450, 400, 500, 350, 500, 400, 450, 400, 450, 400, 450, 400, 500, 350, 500, 350, 500, 350, 500, 400, 500, 350, 500, 350, 500, 1200, 500, 350, 500, 400, 450, 400, 500, 350, 500, 400, 500, 350, 500, 350, 500, 350, 500, 350, 500, 350, 550, 350, 500, 350, 450, 400, 500, 350, 500, 350, 550, 350, 450, 400, 500, 350, 550, 300, 500, 1200, 500, 1250, 500, 1200, 450, 400, 500, 350, 500, 350, 500, 400, 500, 350, 500};
int scelta = 0 ;

/*Funzione per lo sleep mode*/
void sleepNow(){
  digitalWrite(13,LOW);
 
   set_sleep_mode(SLEEP_MODE_IDLE);   // sleep mode is set here
   
/* enables the sleep bit in the mcucr register
   so sleep is possible. just a safety pin
*/
   sleep_enable();         
   power_adc_disable();
   power_spi_disable();
   power_timer0_disable();
   power_timer1_disable();
   power_timer2_disable();
   power_twi_disable();
 
 
  sleep_mode();            // here the device is actually put to sleep!!

                             // THE PROGRAM CONTINUES FROM HERE AFTER WAKING UP
  sleep_disable();         // first thing after waking from sleep:
                            // disable sleep...

  power_all_enable();
 
   
 
   
}//fine funzione SLEEP

 
void setup()
{
  Serial.begin(9600);
  Serial.flush();
  pinMode(13,OUTPUT);
  sleepNow();// se lo metto parte in sleep
}

void loop() {
  Serial.print(count);
  count++;
  delay(1000);
 
 
   
   //sleepNow();
   //delay(100); 
 
   
 
         
/*Verifico se ci sono dati in arrivo sulla seriale[usato per comunicazione Zigbee] */
if(Serial.available()){
   
  digitalWrite(13,HIGH);

  scelta=Serial.read();//metto in scelta ciò che leggo
  Serial.flush();
 
  /*ON T:22 FAN:max LATO:sx ALETTE:basse */
   if (scelta == '1') {
     for(int i=0;i<2;i++){
        irsend.sendMitsubishi(0xC4D36480,0x00041A60,0x68360000,0x00000800,0x00A40000);
      //aggiunti all'ultima "porzione" di codice (0x00380000) quattro zeri per essere della forma 0x80000000(vd IRremote.cpp)
     }
     delay(2000);
   }//chiudo if
 
  /*ON T:24 FAN:max LATO:sx ALETTE:basse */
   if (scelta == '2') {
     for(int i=0;i<2;i++){
        irsend.sendMitsubishi(0xC4D36480,0x00041A10,0x68360000,0x00000800,0x00E40000);
     }
     delay(2000);
   }//chiudo if

   /*ON T:25 FAN:max LATO:sx ALETTE:basse */ 
   if (scelta == '3') {
     for(int i=0;i<2;i++){
        irsend.sendMitsubishi(0xC4D36480,0x00041A90,0x68360000,0x00000800,0x00140000);
     }
     delay(2000);
   }//chiudo if
   
   /*OFF con codici raw[universale]*/
   if (scelta == '0') {
      for(int i=0;i<2;i++){
   
     irsend.sendRaw(arrayON,292,38);}
     Serial.print("Sto inviando il comando di OFF");
     delay(2000);
   }//chiudo if
     

  }//chiusura Serial.available()
 
   // check if it should go asleep because of time
  if (count >= 10) {
      Serial.println("Timer scaduto: Sleep mode enabled");
      delay(100);     // this delay is needed, the sleep
                      //function will provoke a Serial error otherwise!!
      count = 0;
      sleepNow();     // sleep function called here
  }

   

}//chiusura loop

yoshi93

Ma tu usi Serial.flush() per rimuovere i dati nel buffer di ingresso nella seriale? Se sì che versione dell'IDE usi?

pndtkd

Già so cosa vuoi dirmi...il serialflush non è piu '"definito" dalla 1 in poi...è un codice che era scritto per una versione precedente...cmq non è questo il punto =)

yoshi93

flush esiste ancora solo che serve per svuotare il buffer di uscita(aspetta finchè tutti i dati sono stati inviati). Probabilmente non è questo il punto però tanto vale aggiustare un po' il codice così dopo si vedono meglio altre cose  :).

Michele Menniti

la modalità idle purtroppo è ridicola in termini di risparmio ma ho la sensazione che il loop lo tenga comunque sveglio il micro. Potresti provare a commentare l'intero loop e misurare nuovamente il consumo del micro?
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

pndtkd

nono lo sleep funziona ....se tolgo il loop va in sleep poichè richiamo la funzione nel setup...se poi, sempre con il loop tolto, commento la funzione sleep nel setup, mi consuma di piu'(quanto detto nel post di prima).
La idle mi lascia la usart attiva...cmq ancora non riesco a farlo funzionare ad 8 con quarzo esterno

pndtkd

questo è lo schema che ho utilizzato(qui non c'è la connessione con il modulo xbee)

Go Up