RISOLTO(il mio arduino è buggato. test "capacimetro" e "blink" sfalsati)

salve a tutti sarò io che sbaglio come sempre ma siamo già alla seconda prova che arduino mi da risultati strani in sostanza credo che l'unità di misura del tempo non sia delle migliori..
prima prova:
ho preso arduino e volevo fare suonare una cicaletta (non saprei come chiamarla una mini "cassa") a 4KHz io da bravo calcolatore :slight_smile: mi sono trovato che dovevo far spegnere e accendere la porta 0.25 ms (T/F => 1/4k) e così ho fatto tutto contento accendo è il rumore non era dei migliori, ho constatato in un oscilloscopio che la F non era 4K ma era ben si 40Khz
sono sicuro al 100% di aver scritto 0.25 come tempo e sono sicuro di quello che ho letto sullo oscilloscoppio.
seconda prova:
come alcuni di voi ricordano un po di tempo fa ho provato a fare un capacimetro ho atteso fino ora di riparlarne proprio per risolvere questo problema. lo schema elettrico è come riportato sul sito stesse resistenze che spiegano sul sito condensatore da 90uF. sempre da bravo calcolatore :slight_smile: (scherzo) ho trovato che il T(tempo di carica al 63%) dovrebbe essere 0.9s (T=RC => 10k0.000'09F = 0.9s)

questi sono i dati ripostati:

94 mS    9 microFarads
94 mS    9 microFarads
94 mS    9 microFarads
94 mS    9 microFarads
95 mS    9 microFarads
94 mS    9 microFarads
94 mS    9 microFarads
94 mS    9 microFarads
94 mS    9 microFarads
94 mS    9 microFarads
95 mS    9 microFarads
95 mS    9 microFarads
94 mS    9 microFarads
94 mS    9 microFarads
95 mS    9 microFarads
94 mS    9 microFarads
94 mS    9 microFarads

app
apparte la capacità che li per farla quadrare basterebbe metterci un *10 :slight_smile: ma sono i 94ms che mi preoccupano voi che dite?
dove sbaglio non capisco :frowning:

sito da qui ho tratto il sorgente http://arduino.cc/it/Tutorial/CapacitanceMeter

Ma non è che la tua R è una 100K? l'hai misurata? In questi casi bisognerebbe ricorrere alle resistenze a strato metallico precisione minima 1%, meglio 0,5%.
Comunque sia hai mai manipolato il bootloader del 328P del tuo Arduino?
L'unico componente esterno incriminabile sarebbe l'oscillatore che è collegato tra i pin 9 e 10 del 328P

la resistenza comunque non centra la sua tolernza non mi farebbe fare errori così elevati ma comunque o boh si è assestato da solo riprovando il capacimetro, misteri della vita non è andato per 1 set e solo ora va.
il problema è sempre la cicaletta resta sempre ai 40Khz invece che 4K. riesci a spiegarmi come mai?

ilmandorlone:
la resistenza comunque non centra la sua tolernza non mi farebbe fare errori così elevati ma comunque o boh si è assestato da solo riprovando il capacimetro, misteri della vita non è andato per 1 set e solo ora va.
il problema è sempre la cicaletta resta sempre ai 40Khz invece che 4K. riesci a spiegarmi come mai?

La sua tolleranza no, ma se hai usato una 100k invece di una 10k i conti tornerebbero alla perfezione, rifai i conti, da bravo calcolatore :grin:
invece non so dirti sulla storia dei 40Khz, con quali comandi li generi? è possibile vedere la sezione di sketch che usi? così dai un'info utile a chi si intende di programmazione, io non molto purtroppo...

EDIT: vedo solo ora che hai risolto; riprova domattina a freddo dopo diverse ore che Arduino è spento e vedi se risuccede

ok il codice per fa suonare a "4Khz" è questo

  void setup() {                
    pinMode(13, OUTPUT);     
  }

  void loop() {
    digitalWrite(13, HIGH); 
    delay(0.25);              
    digitalWrite(13, LOW);    
    delay(0.25);              
    
  }

per quanto riguarda la resistenza è (marrone, nero, arancione) ma comunque ora ci mette più tempo ho riuplodato il sorgente non so cosa era sbagliato ma ora va

OK, la R è esatta, se tutto funziona ovvio che il tuo Arduino non ha alcun problema.
Riguardo lo sketch ho un solo dubbio: ma la frequenza non si misura sull'intero ciclo, cioè con la somma del periodo HIGH e del periodo LOW? in questo caso il tempo in realtà sarebbe di 0,5sec.
Altra cosa: hai provato a cambiare pin? sul tredici c'è quella fastidiosa R del led, non so se possa causare problemi.

Ciao ilmandorlone
Mi spieghi come mettere in una variabile di tipo unsigned long un valore con decimali?

Il delay() é definito per tempi da 1 millisecondo in su.

Usa al posto di delay() delayMicroseconds(125) NON delayMicroseconds(250)

Ciao Uwe

uwefed:
Ciao ilmandorlone
Mi spieghi come mettere in una variabile di tipo unsigned long un valore con decimali?

Il delay() é definito per tempi da 1 millisecondo in su.

Ciao Uwe, mi era venuto il "sospetto" ma non me la ricordavo questa cosa, ecco perché gli ho chiesto di pubblicare lo sketch :slight_smile:

Usa al posto di delay() delayMicroseconds(125) NON delayMicroseconds(250)

quindi è come dico io? la frequenza si misura sul perido intero dell'onda?

quindi è come dico io? la frequenza si misura sul perido intero dell'onda?

f = 1/T

quindi periodo e frequenza dicono la stessa cosa, non è che la frequenza del sengale è la metà del periodo. In questo caso il segnale è un'onda quadra quindi sta al 50% alto e al 50% basso. Pensa ad una sinusoide....

delay accetta numeri di tipo unsigned long quindi niente decimali.
Per periodi inferiori usa come ti ha detto Uwe il delayMicroseconds.

sì, la frequenza va calcolata tenendo conto che va generata un'onda quadra con duty cicle del 50% per cui per metà del periodo calcolato il segnale deve stare HIGH e per l'altra metà LOW. In questo modo il periodo fra 2 creste alte diviene del tempo necessario.

ma è quello che sto dicendo, probabilmente esprimendomi male, infatti un po' di post fa gli facevo osservare che usando due pause da 0,25ms per l'1 e per lo 0, in realtà costruiva un periodo di 0,5msec, dimezzando la frequenza. sbaglio? No, vedo che Leo mi conferma ciò che dico.

il mio era un commento alla frase che ho quotato, comunque dicevi giusto.

In questo modo il periodo fra 2 creste alte diviene del tempo necessario

visto che il segnale è ad onda quadra e non ha una cresta, possiamo usare i fronti di salita. Tra 2 fronti hai il periodo.
E siamo tutti d'accordo :smiley:

Pax vobiscum :stuck_out_tongue_closed_eyes:

leo72:

[quote author=Federico Vanzati link=topic=99278.msg744559#msg744559 date=1333218797]
E siamo tutti d'accordo :smiley:

Pax vobiscum :stuck_out_tongue_closed_eyes:
[/quote]
Ite, missa est.

No, "et cum spirito tuo" :stuck_out_tongue:

Lo so, però replicando tutto si entra nel sacro e ho preferito sorvolare, andando direttamente all'ultimo passaggio :wink:

Scusate la risposta in ritardo;
Sí Michele confermo:

quindi è come dico io? la frequenza si misura sul perido intero dell'onda?

Ciao a tutti.

uwefed:
Scusate la risposta in ritardo;
Sí Michele confermo:

quindi è come dico io? la frequenza si misura sul perido intero dell'onda?

Ciao a tutti.

Grazie Uwe, nessun problema, ognuno scrive quando può :slight_smile: e col tuo intervento direi che la questione è definitivamente chiusa. Ora aspettiamo solo che il nostro amico ci confermi di aver fatto la prova che gli hai suggerito e che tutto funziona alla perfezione.
Ciao

quindi tagliando la testa al toro in sostanza il tempo deve essere 0.25/2 cioè 0.125 ? così la somma e 0,25 ms?

ilmandorlone:
quindi tagliando la testa al toro in sostanza il tempo deve essere 0.25/2 cioè 0.125 ? così la somma e 0,25 ms?

sì, perché devi misurare l'intero periodo che comprende la fase HIGH e la fase LOW, cioè un'onda quadra intera; usa il comando che ti ha consigliato Uwe e vedrai che risolvi tutto ed il tuo Arduino rientra nei ranghi di quelli funzionanti :wink: