Étape 1: Fond/Prototype
étant donné que les servos fonctionnent (typiquement) entre 1 ms et 2 ms, oui je comprends il y a des variations de la durée effective de chaque servo mais vous voyez l’idée. Il est mis en place tel que le compare 3 sortie n’est qu’à une broche spécifique pendant 2 ms avant d’être déplacés sur la broche de la prochaine. ce cycle se poursuit jusqu'à ce qu’il n’y a pas plus de broches servo gauche et ennemis à un État « factice » et puis après les 20ms écoulé le redémarrage du système de la servocommande. J’ai sous stand que je ne peux pas dire qu’assez droit mais ohwell, ill joindre un exemple de code qui montre que je veux dire.
J’ai 2 conceptions postées, 1 sur la maquette était la preuve de concept orriginal avant que j’ai conçu le Conseil
la conception finale réclame un régulateur 5v, les servos et un régulateur de 3v pour le pic24fj64gb004 et tout le reste
=======================================================================================
Code ci-dessous
=======================================================================================
void _T1Interrupt(void) __attribute__ ((interruption, no_auto_psv)) / / 20ms
{
activez les paramètres initiaux pour une interruption
clock2ms = 0 ;
minuterie d’initialisation/Reset le 2ms
Init2msTimer() ;
_T2IF = 1 ;
_T1IF = 0 ; Effacez l’indicateur d’interruption
}
void _T2Interrupt(void) __attribute__ ((interruption, no_auto_psv)) / / 2ms
{
0-5 représente les 6 servos par broches de sortie comparer
chaque cas déplace la sortie comparer aux broches respectives
permet à l’axe du servo
affecte la valeur de comparaison de sortie servo curpos
par défaut représente que tous les jeux de servo 6 ont été desservies et de désactiver la minuterie
/ * cas x:
permettre de comparer de sortie pour la broche respectif
* tourner sur la broche de servo
* définir la valeur de comparaison de sortie
désactiver les comparer de sortie sur la broche précédent
*
*/
Switch(clock2ms)
{
case 0 :
configurer la broche
déplacer l’OC à la servopp
S1G1PP = OC1_PPS ;
S2G1PP = OC2_PPS ;
S3G1PP = OC3_PPS ;
Configurer l’OC
OC1CON1 = 0 X 0002 ;
OC2CON1 = 0 X 0002 ;
OC3CON1 = 0 X 0002 ;
valeur de la charge dans l’OC
OC1R = OneMs ;
OC2R = OneMs + OneMs/2 ;
OC3R = 2 * OneMs ;
rupture ;
cas 1 :
S1G1PP = NO_OC ;
S2G1PP = NO_OC ;
S3G1PP = NO_OC ;
configurer la broche
déplacer l’OC à la servopp
S1G2PP = OC1_PPS ;
S2G2PP = OC2_PPS ;
S3G2PP = OC3_PPS ;
Configurer l’OC
OC1CON1 = 0 X 0002 ;
OC2CON1 = 0 X 0002 ;
OC3CON1 = 0 X 0002 ;
valeur de la charge dans l’OC
OC1R = OneMs ;
OC2R = OneMs + OneMs/2 ;
OC3R = 2 * OneMs ;
rupture ;
cas 2 :
S1G2PP = NO_OC ;
S2G2PP = NO_OC ;
S3G2PP = NO_OC ;
configurer la broche
déplacer l’OC à la servopp
S1G3PP = OC1_PPS ;
S2G3PP = OC2_PPS ;
S3G3PP = OC3_PPS ;
Configurer l’OC
OC1CON1 = 0 X 0002 ;
OC2CON1 = 0 X 0002 ;
OC3CON1 = 0 X 0002 ;
valeur de la charge dans l’OC
OC1R = OneMs ;
OC2R = OneMs + OneMs/2 ;
OC3R = 2 * OneMs ;
rupture ;
par défaut :
retirer l’OC du dernier groupe de servo pour l’utiliser.
S1G3PP = NO_OC ;
S2G3PP = NO_OC ;
S3G3PP = NO_OC ;
Disable2msTimer() ;
rupture ;
}
clock2ms ++ ;
_T2IF = 0 ; Effacez l’indicateur d’interruption
}