Bonjour,
Dans le cadre d'un projet, je dois faire tourner un moteur pas à pas, que j'ai programmé comme ci-dessous. Le moteur doit effectuer 4 positions pour faire un tour complet (que je répète à l'infini). Entre chaque position, j'ai mis un délais, mais ce n'est pas une très bonne solution. A la place, je souhaiterai mettre en place un timer, pour qu'après chaque coup d'horloge, la position suivante se déclenche.
Le problème, c'est que j'ai eu qu'un document pour m'expliquer les timers, mais je ne comprends pas. Dans ce doc, j'ai un exemple se rapprochant de mes exigences, mais je ne le comprends pas certaines parties : comment je peux dire à mon programme, d'effectuer la position suivante après qu'il ai vu un coup d'horloge ?
Ce que je voudrais c'est :
1. Régler les conditions de mon timer
2. Faire tourner mon moteur à la position 1
3. Appeler mon timer
4. Faire tourner mon moteur à la position 2
5. Appeler mon timer
...
J'espère avoir été assez claire.
Amicalement,
Exemple : allume la LED rouge si la durée entre 2Code:void Moteur_PAP_Unipolaire_Sequenceur(void) { while(1) { // Position 1 P2OUT |= 0x1B; P2OUT &= 0x1B; _delay_cycles(10000); // Position 2 P2OUT |= 0x1E; P2OUT &= 0x1E; _delay_cycles(10000); // Position 3 P2OUT |= 0x36; P2OUT &= 0x36; _delay_cycles(10000); // Position 4 P2OUT |= 0x33; P2OUT &= 0x33; _delay_cycles(10000); } }
fronts montants (=période) sur P1.1 est
supérieure à 40 ms (sinon l’éteint)
Code:#include <msp430.h> unsigned int memo_capt=0; unsigned int capt; unsigned int diff_capt; void main(void) { WDTCTL = WDTPW + WDTHOLD; BCSCTL1 = CALBC1_1MHZ; DCOCTL = CALDCO_1MHZ; TA0CTL |= TASSEL_2 + MC_2; // source horloge SMCLK + mode continu TA0CCTL0 |= CM_1 + CCIS_0; // front montant + CCI0A TA0CCTL0 |= CAP + CCIE; // mode capture + autorisation interruption P1DIR |= BIT0; // P1.0 (LED rouge) en sortie P1DIR &= ~BIT1; // P1.1 en entree P1SEL |= BIT1; // fonction entree capture sur P1.1 (TA0.CCI0A) P1SEL2 &= ~BIT1; // fonction entree capture sur P1.1 (TA0.CCI0A) __enable_interrupt(); while(1); } #pragma vector=TIMER0_A0_VECTOR __interrupt void ma_capture(void) { capt = TA0CCR0; diff_capt = capt - memo_capt; memo_capt = capt; if(diff_capt>40000) P1OUT |= BIT0; else P1OUT &= ~BIT0; }
-----