Ciao a tutti, volevo chiedervi se è possibile portare la tensione IN/OUT dei pin dell'arduino uno a 3.3V, rendendola compatibile con la DUE.
Ho sentito parlare del pin AREF, ma non ho capito bene a cosa serve
E poi, a cosa serrve il pin IOREF?
Esistono degli integrati che fanno da adattatori di livelli logici; la modifica sull'Arduino la vedo un poco complicata, oltretutto a 3,3V Arduino non potrebbe lavorare a 16MHz; invece non ci sarebbe alcun problema a creare un circuito stand-alone, con la componentistica che serve, alimentato a 3,3V, in quel caso non avresti problemi, ma sempre operando ad un clock inferiore (tipicamente 8MHz).
ARef è il pin di riferimento per l'ADC del microcontrollore; in pratica normalmente la tensione di riferimento è di 5V, puoi diminuirla, se necessario, applicando il valore che ti serve al pin ARef; tale diminuzione è possibile anche via sw impostando il reference internal, che collega al pin ARef una tensione stabile di 1,1V.
IORef non lo trovo sullo schema della UNO, mi pare dovesse essere rpesente sulla REV.3, lo vedo invece sulla Leonardo, collegato direttamente a +5V, ho idea che sia un pin di "compatibilità", non so dirti altro.
Programmato in che modo?
Io ho provato programmando via TX-RX e ho ottenuto dei risultati simili
a Arduino alimentato a 5V.
La mia realizzazione:
ATmega328P-PU a 16Mhz su BreadBoard.
Alimentazione esterna 3V3 100mA
Convertitore USB-USART CP2102, non alimentazione solo programmazione.
Quarzo; 16Mhz con relativi condensatori da 22pF.
Board; Arduino Uno
Con queste istruzioni:
void setup(){
DDRB=1; //Bit 0 della PORTB come OUTPUT.
PORTB=0;
}
void loop(){
while(1){
PORTB=1;
PORTB=0;
}
}
Sul pin digitale 8 ottengo una frequenza di 4,5 Mhz circa.
Vedi forma d'onda in allegato
edit by mod: per favore includi il codice usando gli appositi tag
Ci sono alcuni modelli di Arduino che funzionano a 3,3V ( Arduino mini PRO versione 3,3V, Arduino PRO 3,3V, Lilipad)
Il pin IOREF serve per alimentare dei shield che soportano tale funzione di essere aliemntati a 5 o 3,3V e percui danno tale tensione sui pin. Questo fa possibile costruire shields per un Arduino UNO per 5V e per un Arduino DUE per 3,3V.
[quote author=Michele Menniti link=topic=172775.msg1283224#msg1283224 date=1371577098]
invece non ci sarebbe alcun problema a creare un circuito stand-alone, con la componentistica che serve, alimentato a 3,3V, in quel caso non avresti problemi, ma sempre operando ad un clock inferiore (tipicamente 8MHz).
Programmato in che modo?
Io ho provato programmando via TX-RX e ho ottenuto dei risultati simili
a Arduino alimentato a 5V.
La mia realizzazione:
ATmega328P-PU a 16Mhz su BreadBoard.
Alimentazione esterna 3V3 100mA
Convertitore USB-USART CP2102, non alimentazione solo programmazione.
Quarzo; 16Mhz con relativi condensatori da 22pF.
Board; Arduino Uno
.....................
Sul pin digitale 8 ottengo una frequenza di 4,5 Mhz circa.
Vedi forma d'onda in allegato
[/quote]
Scusa ma non capisco la domanda.
Il data-sheet di ATMEL riguardo l'ATmega328P parla chiaro
quindi a 3,3V il micro non può operare con un clock di 16MHz.
il pin digitale 8 è attivabile tramite fuse (Clockout) e su di esso è possibile rilevare il clock di sistema; onestamente non so se con quel codice hai hattivato il fuse via software, ma su quel pin dovresti trovarti una frequenza di 16MHz, se trovi 4,5MHz o non è corretto il comando (ma non so dirti nulla di più) oppure, come detto, il micro non riesce ad operare a 16MHz.
Il pin IOREF serve per dare allo shield il riferimento della tensione di funzionamento a cui lavora la scheda sottostante, non serve per fornire l'alimentazione allo shield.
Quoto dalla descrizione della UNO R3:
IOREF. This pin on the Arduino board provides the voltage reference with which the microcontroller operates. A properly configured shield can read the IOREF pin voltage and select the appropriate power source or enable voltage translators on the outputs for working with the 5V or 3.3V.
Leo, puó essere la spiegazone ufficiale.
Ma di fatto sul Arduino UNO IOREF é collegato direttamente a 5V in paralello al pin 5V e sul Arduino DUE é collegato direttamente in paralello al pin 3,3V. Praticamente puoi alimentare la shield direttamente tramite IOREF e avere sulle uscite la tensione giusta per l' Arduino sottostante.
Uwe, prendi lo schema del Wifishield, è in layout R3:
Se noti, il pin IOREF entra in un traslatore di livello (TXB0108) che, se non ho capito male, serve solo per attivare i livelli a 3V3. Ma la tensione a 3V3 è fornita da uno step-down (LM2736) che riduce i 5V provenienti dalla scheda sottostante, non è presa dal pin IOREF. I 5V sono sempre presenti sulle schede Arduino, anche quelle che operano a 3V3 come la DUE.
Quelli del team di Arduino hanno fatto un bel lavoro, pensando appunto a fornire sempre i 5V che poi riducono a 3V3 quando serve, in questo modo garantiscono la compatibilità con i prodotti più vecchi.
Il codice che ho utilizzato è quello che ho postato senza nessun'altra modifica.
Ho provato anche un altro pin il 3 e il risultato è sempre lo stesso ottengo sempre quella frequenza.
Ho letto il datasheet dove hai indicato.
Quale può essere la spiegazione?
Ho eseguito questa prova perchè ho bisogno della maggior velocità disponibile, naturalmente
il codice che utilizzerò sarà ben diverso, ma volevo vedere dove esistono dei rallentamenti.
E il loop() di rallentamenti ne provoca, con il while(1) va molto meglio.
In alcuni compilatori C è possibile utilizzare anche l'assembler esempio MPLAB della
Microchip.
Sarà possibile anche con questo compilatore?
Ora che guardo meglio il tuo codice non fa altro che generare un'onda quadra alla massima frequenza possibile con un duty cycle del 50%. Ogni istruzione software richiede un proprio tempo ed uno o più cicli di clock, ovviamente in queste condizioni non potrai mai raggiungere la velocità del clock. A questo punto potrebbe anche essere che il tuo micro stia lavorando a 16MHz, ma saresti comunque fuori specifiche ed in una condizione non affidabile.
Intanto puoi fare una prova banale: lascia tutto com'è e alimenta il micro a 5V e vedi se succede qualcosa.
Per quanto riguarda gli altri tuoi dubbi passo la palla agli esperti software, io non lo sono....
busco:
E il loop() di rallentamenti ne provoca, con il while(1) va molto meglio.
Per capire il motivo di ciò devi sapere com'è strutturato uno sketch di Arduino.
In realtà setup() e loop() sono 2 routine inserite all'interno di un programma in C++ più grande chiamato main.cpp (lo trovi in /hardware/arduino/cores/arduino):
#include <Arduino.h>
int main(void)
{
init();
#if defined(USBCON)
USBDevice.attach();
#endif
setup();
for (;;) {
loop();
if (serialEventRun) serialEventRun();
}
return 0;
}
Come vedi, terminato il loop, il codice passa a gestire gli eventi della seriale, poi torna nel loop.
Imbrigliando il flusso del codice dentro al while(1), tu eviti che venga chiamata la funzione serialEventRun. Ecco perché va più veloce.
In alcuni compilatori C è possibile utilizzare anche l'assembler esempio MPLAB della
Microchip.
Sarà possibile anche con questo compilatore?
Certo che sì. Basta includerlo con la funzione asm().
Quindi anche a 3,3V riesce a lavorare a 16MHz ma, ripeto, in base alle specifiche ATMEL, sei fuori range, sarebbe più corretto scendere a 8MHz ed a quel punto potresti anche rinunciare al quarzo esterno. Per ottenere migliori prestazioni potresti invece usare un quarzo da 20MHz, ma poi avresti problemi di tempistiche col core.