Étape 12 : Arduino démo : PWM entrée
Aussi, j’ai joint une capture d’écran d’analyseur logique pour vous montrer à quoi ressemblent les signaux de mes récepteurs radio RC. Chacun de ces impulsions ont une largeur d’impulsion entre 1000 et 2000 microsecondes, la période est d’environ 20 millisecondes.
Pour plus d’informations, recherche :
- PWM
- Signaux de servo
- Rapports de recherche internationale en AVR (Interrupt Service Routine)
- P.C.int, changement de NIP interrompre
- minuteries de 16 bits en AVR
Voici le code :
void setup(){
DDRC = 0 ; broches en entrée
activez P.C.int 18 à 23
PCICR | = (1 << PCIE2) ;
PCMSK2 = 0XFC ;
Serial.Begin(115200) ;
}
typedef struct {}
bord de l’octet ;
unsigned long riseTime ;
unsigned long fallTime ;
unsigned int lastGoodWidth ;
} tPinTimingData ;
tPinTimingData public static volatile pinData [6 + 1] ;
static volatile uint8_t PCintLast ;
ISR(PCINT2_vect)
{
uint8_t bit ;
uint8_t curr ;
masque d’uint8_t ;
uint32_t currentTime ;
temps d’uint32_t ;
obtenir les États de broche pour le port indiqué.
Curr = PINC & 0xFC ;
masque = curr ^ PCintLast ;
PCintLast = curr ;
currentTime = micros() ;
le masque est p.c.int broches qui ont été modifiés.
pour (uint8_t i = 0; i < 6; i ++) {}
bit = 0 x 04 << i ;
Si {(bit & masque)
pour chaque broche a changé, un temps record des changements
Si (bit & PCintLast) {}
temps = currentTime - pinData [i] .fallTime ;
pinData [i] .riseTime = currentTime ;
Si ((temps > = 10000) & & (temps < = 26000))
.edge pinData [i] = 1 ;
d’autre
.edge pinData [i] = 0 ; front montant non valide détecté
}
else {}
temps = currentTime - pinData [i] .riseTime ;
pinData [i] .fallTime = currentTime ;
Si ((temps > = 800) & & (temps < = 2200) & & (.edge pinData [i] == 1)) {}
pinData [i] .lastGoodWidth = temps ;
.edge pinData [i] = 0 ;
}
}
}
}
}
void loop()
{
Serial.println() ;
pour (octet j’ai = 0; i < 6; i ++) {}
Serial.Print("C") ;
Serial.Print ((int) i + 1) ;
Serial.Print(":") ;
Serial.Print(pinData[i].lastGoodWidth) ;
Serial.Print (",") ;
}
Delay(500) ;
}