Ciao,allego codice per un comportamento del pwm che non riesco a darmi una risposta.
Creo un Pwm variabile tramite due pulsanti ( up - down ) che mi fanno variare l'uscita del pin 3.
Quando vado a settare tramite i due pulsanti una combinazione ( ton=255 e toff=0) in uscita dal pin 3 non mi trovo 5vcc ,ma bensì 4,5vcc,la stessa cosa mi succede con ( ton=0 toff=255 ) nella maniera inversa non mi trovo 0vcc,ma sempre 0,7vcc,come mai??
Quando inserisco il monitor seriale nel codice ton e toff,variano correttamente da 0 a 255.
Dove sbaglio nel codice??
Grazie,Mauro.
// Settaggio delle Variabili
unsigned int input; // controllo input ton / toff
unsigned int counter; // contatore lettura stato pulsante
unsigned int ton; // stato semionda periodo HIGH
unsigned int toff; // stato semionda periodo LOW
byte pulsanti; // combinazione booleana degli input (puls_up || puls_down )
byte puls_up = 12; // pulsante ( ++ ) incrementa la luminosità
byte puls_down = 11; // pulsante ( -- ) decrementa la luminosità
byte stripled = 3; // pin dove viene collegato il mio load ( con oppurtuno driver mosfet )
#define valmax 255 // valore massimo
#define valmin 0 // valore minimo
#define valoremaxcounter 100 // letture da eseguire prima di cambiare il valore
// Settaggio solo alla 1^ accensione
void setup() {
pinMode(stripled, OUTPUT); // al pin 3 è collegato il mio load
pinMode(puls_up, INPUT_PULLUP); // al pin 12 è collegato il pulsante ++ luminosità
pinMode(puls_down, INPUT_PULLUP); // al pin 11 è collegato il pulsante -- luminosità
}
void controllapulsanti (void) {
pulsanti = digitalRead(puls_up) * 2 + digitalRead(puls_down) * 1;
// Verifico la combinazione booleana degli input se :
//
// byte pulsanti 00000000B combinazione non accettata !!
// byte pulsanti 00000001B combinazione puls_up premuto !!
// byte pulsanti 00000010B combinazione puls_down premuto !!
// byte pulsanti 00000011B combinazione non accettata !!
switch (pulsanti) {
case 0 :
// entrambi i pulsanti sono premuti !!
{
counter = 0;
break;
}
case 2 :
// solo il pulsante puls_down è premuto !!
{
counter++;
if (counter == valoremaxcounter)
{
if (toff != valmax) // se toff è diverso dal valore valmax !!
{
toff++; // incrementa tramite il puls_down il periodo LOW dell'onda quadra
ton--; // decrementa tramite il puls_down il periodo HIGH dell'onda quadra
counter = 0; // resetta counter letture !!
}
}
break;
}
case 1 :
// solo il pulsante puls_up è premuto !!
{
counter++;
if (counter == valoremaxcounter)
{
if (ton != valmax) // se ton è diverso dal valore valmax !!
{
ton++; // incrementa tramite il puls_up il periodo HIGH dell'onda quadra
toff--; // decrementa tramite il puls_up il periodo LOW dell'onda quadra
counter = 0; // resetta counter letture !!
}
}
break;
}
case 3 :
// entrambi i pulsanti non sono premuti !!
{
counter = 0;
break;
}
}
}
// Programma Principale
void loop() {
digitalWrite(stripled, LOW); // metti a LOW l'uscita inizialmente
counter = 0; // reset iniziale delle letture
ton = valmin; // valore iniziale ton
toff = valmax; // valore iniziale toff
while(1) {
digitalWrite(stripled, HIGH); // imposta il periodo HIGH l'uscita
for ( input = 0 ; input < ton ; input++ ); // aspetta un periodo prefissato da ton
controllapulsanti(); // controlla stato pulsanti
digitalWrite(stripled, LOW); // imposta il periodo LOW l'uscita
for ( input = 0 ; input < toff ; input++); // aspetta un periodo prefissato da toff
controllapulsanti(); // controlla stato pulsanti
}
}