Bonsoir à tous!
Tout d'abord félicitations pour ce forum et merci à ceux qui partagent leurs connaissances!
J'ai aujourd'hui un projet à réaliser à l'aide d'un PIC16F876 et avec le compilateur CCS. Le projet que je dois faire parait assez simple à 1ère vue mais je rencontre des difficultés.
Le but de celui-ci est d'envoyer deux signaux de commandes sur deux bobines d'un moteur : Bobine 1 composée de B1+ et B1-, bobine 2 composée de B2+ et B2-. B1+ est déphasée de 180° par rapport à B1- (B2+ idem avec B2-) et B1+ déphasée de 90° par rapport à B2+. Bref, ce sont donc mes quatre sorties.
Les deux entrées de mon système sont les signaux issus de deux sondes (Sonde 1 pour bobine 1, sonde 2 pour bobine 2) donnant la fréquence à laquelle tourne le moteur. Je dois donc faire un asservissement. C'est à dire ouvrir plus ou moins mes commandes afin d'avoir la même fréquence que mes sondes.
J'utilise donc un PIC16F876 cadencé à 20MHz. Je sais récupérer les fréquences de mes 2 sondes. Une est sur l'entrée CCP1, l'autre sur l'interruption externe et je récupère les temps nécessaires sur le timer 0. Le diviseur du timer 1 est de 8. Un incrément fait donc 1.6µs. Je sais gérer le dépassement des timers, les récupérations des fréquences d'entrées fonctionnent bien.
Mon problème est le suivant : comment générer 4 signaux de sorties (je sais en gérer un en fonction de la fréquence d'entrée) et surtout comment les déphaser ?!? A savoir que j'ai décidé de les générer à partir du timer 1 et pour le moment sans tenir compte de la fréquence de mes entrées?
Ma 1ère idée est de passer par des "switch case" comme ceci permettant ainsi de déphaser les signaux grâce "aux coups d'horloge" :
Ici j'essaye juste de déphaser B1+ et B1- de 180° mais j'avoue que je suis un peu perdu juste pour faire ceci ... Si quelqu'un avait une idée simple ou même savoir de combien faut-il décaler de fronts d'horloge?!Code:#INT_TIMER1 void IT_Timer1() { i8VarIncT1++; // Incrémentation variable T1 switch (i8Cas) { Case 0 : output_low(SORTIE_B1_MOINS); output_high(SORTIE_B1_PLUS); //i16Dephasage = 0 ; Case 1 : output_low(SORTIE_B1_PLUS); output_high(SORTIE_B1_MOINS); //i16Dephasage = -3125; default : i8Cas = 0; } set_timer1 (i16ValTimer - i16Dephasage); }
D'avance, merci.
-----