Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur le langage C !

Modérateur : Jérémy

Problème Servo moteur
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2586
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#11 Message par paulfjujo » lun. 2 juil. 2018 16:50 lien vers la Data-Sheet : Cliquez ici

bonjour,


Peut être parceque je ne renseigne plus le TMR0H = 200 ;)


en fait il faut mettre le complement et non la valeur desiree ... 56 pour avoir 200 counts !
TMR0H=56; overflow 200 coups apres
avec B=20 => 2mS
et maxi
if (Counter>99) => 200uS*100=20mS

en ne gerant plus l'init de TMR0H, tu gere sur un rollover de 256 µS

une resolution de 1µS / 20 000 .. c'est peut_etre un peu trop much..
tout depend de ce qui reste à faire comme job .

l'interrupt ne doit prendre que quelques µS toute les 200µS ..mais surement pas 70% !
tu peut eventuellement ralentir le rytme d'interrup en prenant un prediviseur Timer0 par 8
resolution 8/20000
Aide toi, le ciel ou FantasPic t'aidera

Problème Servo moteur
hoffmann
Membre
Membre
Messages : 11
Enregistré en : mai 2018

#12 Message par hoffmann » lun. 2 juil. 2018 18:41 lien vers la Data-Sheet : Cliquez ici

Alors je suivais bien jusque la, mais ensuite je suis un peu largué...

paulfjujo a écrit :Source du message errupt ne doit prendre que quelques µS toute les 200µS ..mais surement pas 70% !
tu peut eventuellement ralentir le rytme d'interrup en prenant un prediviseur

paulfjujo a écrit :Source du message une resolution de 1µS / 20 000 .. c'est peut_etre un peu trop much..
tout depend de ce qui reste à faire comme job .

l'interrupt ne doit prendre que quelques µS toute les 200µS ..mais surement pas 70% !
tu peut eventuellement ralentir le rytme d'interrup en prenant un prediviseur Timer0 par 8
resolution 8/20000



J'ai divisé par deux avec le préscaler.
=> Résultat sur 10 secondes, je passe à 13 ce qui est plus correct...
Mais ma valeur CounterB est moins précise :
counterB = 2 ==> 1ms
counterB = 3 ==> 1,5ms

C'est pas top je trouve...

L'interruption est au mini je pense :

Code : Tout sélectionner

 if(PIR0bits.TMR0IF == 1)                // Timer 0
    
{
        
counter counter 1;
        
        if (
counter >= counterB)
        {
            
TEST 0;               // Sortie PWM
        
}
        
        if (
counter == 39)
        {
            
counter 0;
            
TEST 1;                 // Sortie PWM
        
}
        
PIR0bits.TMR0IF 0;
    } 

Problème Servo moteur
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2586
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#13 Message par paulfjujo » mar. 3 juil. 2018 09:16 lien vers la Data-Sheet : Cliquez ici

Ralentir le rytme d'interruption, mais aussi augmenter FOSC pour ne pas trop perdre en resolution..


Et pourquoi n'utilises tu pas un timerx en mode 16 bits.
init à 65536-20000=45536 => interrupt à 20 000µS => 20mS tres peu d'impact sur le temps mobilisé par le CPU
et un autre timer pour definir la largeur d'impulsion de 1 à 2mS
prediviseur par 8
=> 125 pour 1mS
=> 250 pour 2mS
resolution +-8µS

test avec un 16F1847 et 2 timer, reglage pulse par potar


il y a d'autre solution avec le mode Capture et compare ..
Aide toi, le ciel ou FantasPic t'aidera


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 9 invités