Étape 3: Mise en place de l’interruption du logiciel déclenchée version
Il y a eu plusieurs excellents instructables sur la création d’une capture rapide de données sur l’arduino.
J’ai développé ce qui suit d’une variété de sources.
J’utilise la variable prescalar pour contrôler la fréquence de l’interruption de l’échantillonnage.
Essentiellement, nous avons mis en place une interruption qui saisit des données automatiquement à une fréquence réglable.
Une fois l’interruption commence, données est capturé dans une routine d’interruption.
Si déclenchement est en marche, pas, les données sont transférées dans la mémoire tampon jusqu'à ce que la condition de déclenchement est remplie.
La voie analogique est spécifiée par la variable adport. (ADMUX | = adport)
La fréquence est définie à l’aide d’un prescalar. (Registre des ADCSRA : bits ADPS2, ADPS1 et ADPS0.)
Ces bits déterminent le facteur de division entre la fréquence d’horloge de système et l’horloge d’entrée de l’ADC.
.
Le 5V de l’Arduino est utilisé comme une référence de tension. (Le bit REFS0)
Notez que la tension indiquée sur mon port USB apparaît à conduire mon Arduino à 4.76V.
Si je me connecte un bloc d’alimentation à l’Arduino, la ligne « 5V » est à 5.06V
Si vous cherchez la précision, une alimentation externe!.
.
Définir le nombre de bits utilisés dans la prise de port analogique. Pour la vitesse 8 bits sont lus. Le bit ADLAR contrôle la présentation de la conversion ADC ajuster une écriture à ADLAR à gauche. Dans le cas contraire, la valeur est bien ajustée. Cela a un effet immédiat sur le registre de données ADC.
.
Définir les bits en ADCSRA pour le prescalar de fréquence. (ADPS0, ADPS1, ADPS2 bits)
.
Affectez l’interruption à plusieurs reprises Auto déclencheur lorsque la voie analogique est lue. (Le bit ADATE et Alicia)
Activez le service ADC. (Le ADEN bit)
Notez l’utilisation de la fonction de sbi. Ceci et la fonction de la cbi sont très utiles pour le réglage et Registre bits des données de la compensation.
Commencer l’interruption de l’ADC. L’ADSC (bit)
.
Configurer la lecture continue de l’adc port « adport » à l’aide d’une interruption
//
CLI() ; désactiver les interruptions afin que nous pouvons changer les registres sans être interrompu
effacer les registres ADCSRA et ADCSRB
ADCSRA = 0 ;
ADCSRB = 0 ;
ADMUX | = adport ; mettre en place un échantillonnage continu de broche analogique adport
ADMUX | = (1 << REFS0) ; tension de référence définie à l’AVCC
ADMUX | = (1 << ADLAR) ; Aligner à gauche la valeur ADC - donc nous pouvons lire plus haut 8 bits du Registre ADCH seulement
Définir la prescalar. 8 est la plus forte fréquence utilisable
8 prescalaire 143Khz (après réduction de vitesse d’interruption tolérable)
Si (prescalar == 8) ADCSRA | = (1 << ADPS1) | (1 << ADPS0) ;
prescalar 16 - échantillonnage 72 Khz
Si (prescalar == 16) ADCSRA | = (1 << ADPS2) ;
Prédiviseur 32-16mHz/32 = 500 kHz - produit d’échantillonnage 37 Khz
Si (prescalar == 32) ADCSRA | = (1 << ADPS2) | (1 << ADPS0) ;
64 prescalar produit d’échantillonnage 19,2 Khz
if(prescalar==64) ADCSRA | = (1 << ADPS2) | (1 << ADPS1) ;
prescalar 128 - 9,4 Khz échantillonnage si (prescalar == 128) ADCSRA | = (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0) ;
ADCSRA | = (1 << al) ; permettent à déclencheur automatique
ADCSRA | = (1 << ADIE) ; Activer l’interruption complète de Conversion ADC
SBI(ADCSRA,Aden) ; activez l’ADC
ADCSRA | = (1 << ADSC) ; commencer les mesures de l’ADC sur interrupt
StartTime=micros() ; un temps record, alors que nous pouvons calculer la période et la fréquence
activer les interruptions et nous voilà partis !
SEI() ;
.
Le code d’interruption
L’interruption de l’adc est desservie par la routine ISR(ADC_vect).
Bufcount variable est la position dans la mémoire tampon, dont la taille est BUF_SIZE (= 1000).
Indicateur déclenché est true lorsque les données peuvent être capturées.
Lorsque le tampon est plein drapeau writeit a la valeur true et l’adc est désactivé. (cbi(ADCSRA,ADEN);)
Pour déclencher l’interruption soit déclenchée est définie sur true dans la configuration et les mises en chantier de données recodage immédiatement.
Ou l’élément de données newval est comparée à la précédente oldval.
Si la différence est supérieure à la détente, déclenchée a la valeur true et que les données sont stockées dans la mémoire tampon.
La variable trigcount est utilisée pour compter le nombre de données éléments lus pendant le déclenchement.
Ce nombre est ajouté à la taille de la mémoire tampon lors du calcul de la fréquence pour assurer l’exactitude de la fréquence observée.
.
C’est la clé pour le programme!!
{ISR(ADC_vect)}
Si {(déclenchée)
Bufa [bufcount] = ADCH ;
bufcount ++ ; compteur d’incrémentation tampon
Si (bufcount == BUF_SIZE) {}
CBI(ADCSRA,Aden) ; désactiver l’ADC
EndTime=micros() ; endtime record pour le calcul de l’intervalle
writeit = true ; drapeau qu’une écriture est nécessaire
}
} else {}
Recherchez un déclencheur
newVal = ADCH ;
trigcount ++ ;
voyage = newval-oldval ;
if(!trigplus) voyage = - voyage ;
Si (voyage > déclencheur) déclenché = true ; d’autre oldval = newval ;
}
}