Pages: 1 ... 6 7 [8] 9   Go Down
Author Topic: Come far lavorare ATmega a 128KHz di clock  (Read 6279 times)
0 Members and 1 Guest are viewing this topic.
Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 415
Posts: 11994
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

mi pare d'aver capito che lo spegnimento delle periferiche "manuale" presuppone un'impostazione di sleep "inferiore" alla power_save che,

Col modo power_down vengono spente tutte le periferiche non in uso, vale per tutti gli ATmega che supportano tale modaliltà ATtiny inclusi.
Non c'è nessuna differenza tra modelli in case SDM e in case DIP per quanto riguarda le caratteristiche elettriche, in power down il consumo è circa 0.1 uA sempre e comunque.
Il valore di corrente che misuri durante lo sleep è altissimo, ti ripeto la mia domanda, la misura l'hai fatta direttamente sulla batteria oppure direttamente sul pin Vdd del micro ?
Io la prova l'ho fatto con un ATmega 328p, c'è la possibilità che la libreria non esegua tutte le necessarie operazioni per l'ATtiny, però la libreria non è limitata ad Arduino perché fa parte del compilatore AVRgcc, e qui il discorso si estende molto, quindi mi pare strano che non funzioni in modo corretto con i modelli di micro supportati, un bug simile è macroscopico e sarebbe stato corretto subito.
Oggi provo a dare una controllata a quello che fa0,5mA esattamente la libreria con gli ATtiny e verifico se setta opportunamente tutti i vari registri per lo sleep, ma non credo che il problema sia questo.
Hai ragione scusa, davo per scontato... Io ho misurato sulla batteria, ma sulla bread c'è il solo ATmega328, infatti la misura resta tale anche eliminando il circuito sul pin di uscita; non mi sono disperato a togliere il sensore perché mi dava il  change e mi risvegliava il micro, ma è uno switc NC collegato tra il pin 4 del micro e la massa; a meno che i consumi non siano dovuti ai 7-8 jumper che mi portano l'alimentazione al micro; altra cosa: io come detto ho impostato via fuses (per non usare quarzo, ecc) il micro a 1MHz e lo alimento a 3,6V; a 16MHz il consumo sale a 570µA. Per ora mi interessa risolvere con AT328, anche perché dovrei realizzare un'altra applicazione in cui il tiny sarebbe inadeguato. Ti chiedo una grande cortesia: puoi descrivermi come hai montato il chip e misurato il consumo? Io nei primi test ho copia/incollato il tuo code per lo sleep e mi dava 96µA, ecco perché vorrei capire cosa hai fatto.

EDIT: aggiungo che questo consumo di 96µA, in alcune combinazioni di funzionamento, andando in sleep me lo dà ancora, ma la maggior parte delle volte e 200µA.
« Last Edit: May 14, 2011, 12:23:00 am by menniti » Logged

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

Palermo
Offline Offline
God Member
*****
Karma: 2
Posts: 745
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Piccolo chiarimento: dovendo considerare il consumo reale totale al fine di stimare la durata della batteria, perchè è errato misurare la tensione ai capi di essa??

Altra cosa, perchè non sottoporre il cavo di l'alimentazione delle periferiche esterne all'azione di un transistor che può quindi accenderle e spegnerle in prossimità dello sleep mode?
Logged

Gianfranco

Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 415
Posts: 11994
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Piccolo chiarimento: dovendo considerare il consumo reale totale al fine di stimare la durata della batteria, perchè è errato misurare la tensione ai capi di essa??
E' il chiarimento che ho chiesto, non ho capito infatti se astrobeed pensava che ci fossero consumi dovuti a componenti esterni al micro, o se sta pensando a possibili dispersioni dovute alla bread e jumpers vari.

Quote
Altra cosa, perchè non sottoporre il cavo di l'alimentazione delle periferiche esterne all'azione di un transistor che può quindi accenderle e spegnerle in prossimità dello sleep mode?
Semplicemente perché non ce ne sono, oltre al sensore (meccanico) c'è un tx autoalimentato a 12V; l'SCR usato per attivare il tx è pilotata dal pin OUT del chip mediante una r da 10K e, in modalità sleep, non viene alimentato.
Logged

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

Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 415
Posts: 11994
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Questo link, che mi aveva indicato Marco Benini, http://www.rocketscream.com/blog/2011/04/26/mini-ultra-8-mhz-current-consumption-part-2/#more-349 mi pare possa essere una buona prova, essendo (a occhio smiley-eek) un'implementazione del code che mi ha dato astrobeed; salvo altre info è la prova che vorrei fare appena possibile.
Logged

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

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9185
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Per ora mi interessa risolvere con AT328, anche perché dovrei realizzare un'altra applicazione in cui il tiny sarebbe inadeguato. Ti chiedo una grande cortesia: puoi descrivermi come hai montato il chip e misurato il consumo? Io nei primi test ho copia/incollato il tuo code per lo sleep e mi dava 96µA, ecco perché vorrei capire cosa hai fatto.

La corrente io l'ho misurata sul pin Vcc e Avcc (7 e 20), messi in parallelo, del micro, mi permetto di insistere su questo punto perché è il solo modo per valutare l'esatta corrente richiesta dal micro, se misuri dalla batteria hai solo l'immagine complessiva del tutto, ma non delle singole parti.
Per dipanare la matassa è indispensabile accertare che il consumo sia effettivamente del micro e non di qualcosa che sta attorno.
Tenuto conto che la prova la stai facendo con un ATmega 328 è inutile che mi metto a controllare la libreria visto che le condizioni sono le stesse, io ho per il test ho usato un Arduino, ho piegato leggermente i pin 7 e 20 in modo da lasciarli estratti dallo zoccolo e ho portato il +5V tramite il multimetro.
Le mie condizioni di test sono ancora più gravose delle tue visto che utilizzo l'alimentazione a 5V e il clock a 16MHz ed ottengo senza problemi il consumo minimo previsto in sleep.
Logged

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9185
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Forse ho capito perché hai tutta quella corrente, nel mio test il pin di ingresso è tenuto alto dalla pull up interna e si aspetta una chiusura verso GND per il risveglio.
Nella tua condizione operativa è l'opposto, il pin normalmente si trova a 0, contatto chiuso, per poi andare a 1 per il risveglio.
Le pull up interne dell'ATmega hanno un valore tipico di circa 20k, se il pin è chiuso verso GND con 3.3V scorrono circa 165 uA attraverso la pull up, e questo succede indipendentemente dalla condizione di sleep o funzionamento normale.
Rifai la misura senza il sensore, cioè pin libero, e dovresti trovare un assorbimento compreso tra 100 e 200 nA per il solo micro.
Logged

Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 415
Posts: 11994
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ho fatto queste prove:
1 - Ho inviato ad Arduino lo sketch sleep da solo
Ho tolto il chip e l'ho messo sulla breadboard, ma senza quarzo e C, alimentato a 3,6v.
Naturalmente c'ha messo un bel po' a fare i lampeggi (li ho ridotti a 4)
Risultato: 112,7µA

2 - Per scrupolo ho poi montato quarzo e C
Risultati:
alim. 5v: 142µA
alim. 3,6v: 115µA (l'ho ridotta direttamente mentre era in sleep)

3 - Dopo ho provato il tester:
3,6V applicati direttamente ad una R di 330K mi pare debbano dare 10,9µA circa
Risultato: 10,2µA
Non so più dove sbattere la testa smiley-eek-blue
Ti prego di credermi, se vuoi ti posto la foto con la misurazione del multimetro: sulla breadboard c'è il deserto, solo il chip e i ponticelli per collegare l'alimentazione.
Non è che avevi usato altri elementi di risparmio?
Grazie.
Logged

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

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9185
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Non è che avevi usato altri elementi di risparmio?

No, lo sketch che ho utilizzato per la prova è quello che ho postato.
Logged

Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 415
Posts: 11994
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Proverò con lo spegnimento delle periferiche, con l'altra libreria, è davvero un mistero.
Grazie comunque per tutta la pazienza che hai avuto, in ogni caso meglio 200µA che 3mA smiley
Un'ultima cosa, visto che 100µA se li mangia la pull-up con lo switch a massa stavo pensando di risparmiare almeno questi usando meglio il sensore: è un NC ma il problema è che, essendo rotante, a volte resta proprio sulla posizione aperta, quindi può capitare l'una o l'altra situazione; la pull-up l'ho dovuta mettere (prima era esterna) perché altrimenti il circuito a volte andava in loop, a causa dei troppi disturbi della meccanica. Hai un'idea su come poter gestire meglio questa cosa?
Tieni presente che il programmino che ho scritto ormai prevede ogni situazione, quindi comunque mi va in sleep, solo che se ci va col sensore in NC consuma 200µA, altrimenti ne consuma "solo" 100µA, e non posso eliminare la pull-up; forse potrei esternamente portarla ad un valore più elevato, tipo 47K o maggiore, oppure hai un'idea su come gestire la logica, magari collegandolo a 5V?
« Last Edit: May 25, 2011, 03:51:21 pm by menniti » Logged

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

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9185
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Stamattina ho fatto altri test.
Hardware utilizzato:

2 Luigino 328
1 Luigino 1000pads (stand alone)

Su tutte e tre le schede, quindi tre ATmega 328p diversi, il micro l'ho inserito con i pin 7 e 20 sollevati. L'alimentazione arriva da USB per le due 328 e da alimentatore esterno per la 1000pads, i pin 7 e 20 degli ATmega sono collegati in parallelo e alimentati dalla presa 5V sul connettore delle schede attraverso il multimetro, con questa configurazione escludo qualunque corrente estranea al micro.
Lo sketch utilizzato è lo stesso che ho già postato con la variante del CHANGE per l'interrupt, se tengo il pin 2 collegato a GND, quindi passa corrente attraveso la pull interna misuro queste correnti in stato di sleep:

L328 A        189 uA
L328 B        169 uA
1000pads    201 uA

Valori in linea con quanto atteso tenendo conto che il valore della pull up interna può essere compreso tra 20 e 50 kohm, 5V/20k = 250 uA, e le tolleranze sono alte in questo caso.

Staccando il GND dal pin 2 ottengo queste correnti:

L328 A        135 nA
L328 B        157 nA
1000pads    123 nA




Logged

Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 415
Posts: 11994
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie astrobeed, temo di non meritare tutta questa pazienza smiley-red smiley-red
Praticamente i valori riscontrati col pin 2 (che poi sarebbe il 4 del chip?) a massa sono quelli che ho io col sensore in NC, solo che io alimento a 3,6V e lavoro a frequenza inferiore.
Ora, mentre tu levando il collegamento a GND hai una calo di consumo di circa 1000 volte (da 160µA medi a 160nA medi), il mio semplicemente dimezza (da 200µA a 100µA), è come se il pin 4 fosse ancora collegato a massa ma con resistenza raddoppiata.
Allora l'unica possibilità è una dispersione sulla breadboard o qualcosa di interno al chip, ma di chip ne ho provati 4.
Farò queste prove:
1 - Dal tuo sketch con "change" disattivo la pull-up
2 - Cambio posizione del chip sulla breadboard
3 - Faccio la tua stessa prova: chip su Arduino con pin 7 e 20 alzati, collegati in parallelo tra loro e tramite multimetro alla presa 5V
L'altra cosa che mi fa pensare è che le Luigino (ho una 328 prototype anch'io) lavorano col bootloader della 2009, quindi provo anche in tal senso.
Ti faccio sapere più tardi.
Grazie ancora.
Logged

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

Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 415
Posts: 11994
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Allora ho fatto tutt'e tre le prove ma il risultato no cambia smiley-fat
Qui www.michelemenniti.it/VHD/Elettronica/Sleep1.jpg la foto della prova SU Arduino 2009, con il tuo code, ho provato anche a disattivare la pull-up e, ovviamente, la riattivazione, in modo da mandarlo a dormire per sempre, ma non cambia nulla.
Invece ho fatto la prova che ti dicevo (disabilitare le periferiche oltre allo sleep). Questo il code:
Code:
// **** INCLUDES *****
#include <avr/sleep.h>
#include <avr/power.h>
// ***** CONSTANT *****
#define MAX_PIN_COUNT 22    // Digital IO 0-13, Analog A0-A7

void setup()
{
    uint8_t pin;
   
    // Put all pins into output mode and low state
    for (pin = 0; pin < MAX_PIN_COUNT; pin++)
    {
        pinMode(pin,OUTPUT);
        digitalWrite(pin,LOW);
    }
   
    // Set sleep mode
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);
    // Enable sleep mode
    sleep_enable();
    // Disable ADC, must be done before calling
    // power_all_disable() as to disable ADC,
    // clock is required
    // Refer to datasheet page 45
    ADCSRA &= ~(1 << ADEN);
    // Disable all peripheral power
    power_all_disable();
    // Enter sleep mode
    sleep_mode();
}

void loop()
{   
    // Zzz...
}
e questo il risultato nelle stesse condizioni hardware:
www.michelemenniti.it/VHD/Elettronica/Sleep2.jpg cioè 18µA invece di 90-100µA; oltretutto questo link, da cui ho preso il code
http://www.rocketscream.com/blog/2011/04/26/mini-ultra-8-mhz-current-consumption-part-2/#more-349
dice chiaramente di aver ottenuto un consumo di 2,1-2,4µA con questa microboard stand alone a 8MHz, quindi forse la differenza ci sta con i miei 18µA (16 a 3,6V sempre a 16MHz).
A  questo punto temo davvero che tu sia riuscito in un'impresa unica, per cui ora sarebbe utile che qualcuno di buona volontà facesse la stessa prova per vedere i risultati.
Nel frattempo vorrei capire come dare a questo code la stessa organizzazione del tuo, visto che questo chiude tutto e se ne va a dormire; invece a me serve proprio di mandarlo a nanna richiamando una funzione quando dico io. Inoltre ho sempre il problema del contatto NC che comunque mi consumerebbe tanto, quindi dovrei impostare una logica diversa in considerazione del fatto che il sensore nella maggior parte dei casi è in posizione NC e ogni tanto capiterà in NA.
Risolti questi problemi col software io sarei a posto (al di là del dubbio che mi rode su questa cosa) in quanto una batteria di 1200mAh con un consumo che è quasi sempre di una paio di µA in teoria mi dura un tempo che va molto oltre la durata stessa della batteria, in termini di autoscarica, quindi lo scopo è raggiunto! smiley-grin

EDIT: aggiungo l'ulteriore prova, lo stesso sketch caricato su un chip impostato a 1MHz o 8MHz in stand alone ora misura 0,0-0,1µA oscillanti, è la risoluzione minima del mio multimetro, quindi penso proprio che finalmente siamo nel "campo" dei nanoA (mettendo un qualsiasi pin a 5V mediante una R il consumo sale subito, segno che è vivo...). Quindi l'unico dubbio che mi viene è: non è che la tua libreria sleep integra anche questi altri comandi, io uso quella originale fornita con la 0022.
Grazie ancora.

EDIT_2: dopo 1 miliardo di prove sono giunto alla conclusione che è sufficiente aggiungere al tuo code la SOLA riga:
ADCSRA &= ~(1 << ADEN);
per portare il consumo a "0" (per dire alcuni nA), quindi ora il mio circuito in sleep mode consuma "0" oppure 100µA in base alla posizione del sensore, ma mi sono reso conto che la durata di NC e NA nella rotazione si equivalgono quindi è inutile invertire la logica.
Allora il problema di questo topic è risolto, il chip ora a riposo consuma corrente nell'ordine dei nA. Ora ne apro un altro per risolvere il problema del sensore, topic al quale sei UFFICIALMENTE invitato!
Grazie astrobeed, alla fine ce l'abbiamo fatta, devo naturalmente ringraziare anche ypkdani, Marco Benini, Leo72 e tutti coloro che sono intervenuti fornendomi indicazioni per risolvere il problema!

EDIT_3: ho risolto mettendo una pull-up esterna da 180K, lo so che è eccessiva ma riesce comunque ad evitarmi il loop del sensore ed il consumo scende a soli 20µA, ho provato con 4 diversi chip e nessuno mi ha dato problemi.
« Last Edit: May 15, 2011, 11:18:10 am by menniti » Logged

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

0
Offline Offline
Sr. Member
****
Karma: 0
Posts: 453
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Tra poco mi sa che riuscirai addirittura a fargli produrre energia  smiley
Logged

Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 415
Posts: 11994
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Già fatto, ora devo capire come immagazzinarla per poi sfruttarla  smiley-mr-green
Grazie!
Logged

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

Palermo
Offline Offline
God Member
*****
Karma: 2
Posts: 745
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Se ti apri la finestra ti passo due fili smiley-grin
Logged

Gianfranco

Pages: 1 ... 6 7 [8] 9   Go Up
Jump to: