Bonjour,
Afin de faire tourner une turbine avec variateur (brushless), je dois simuler une PWM de plus ou moins 1ms avec une précision d'au moins 50-100µs. (la fonction de PWM du PIC étant déja utilisé pour une autre fonction).
J'ai essayé d'utiliser le Timer0 pour cela, et voila ce que j'obtiens.
La fréquence étant beaucoup trop rapide pour ce que je souhaite obtenir,(le PIC n'a pas non plus le temps de rentrer dans le while, donc la modification de l'interruption avec les boutons devient impossible), j'ai donc essayé d'activer le prescaler (bits OPTION_REG.PSX) mais ils semble n'avoir aucun effet.Code:unsigned long valchgt = 1000, cnt = 0; void interrupt() { INTCON.T0IE = 1; if(cnt == valchgt || cnt == 0) { PORTB.F7 = ~PORTB.F7; // Toggle PORTD } cnt++; if(cnt == 100000) cnt = 0; } void main() { TRISA = 0; PORTA = 0; PORTB = 0; TRISB = 0b00000011; OPTION_REG = 0x80; TMR0 = 0; INTCON = 0; INTCON.GIE = 1; INTCON.T0IE = 1; INTCON.T0IF = 1; while(1) { if(PORTB.F0 == 1) valchgt+=20; if(PORTB.F1 == 1) valchgt-=20; PORTA = valchgt; } }
P.S : avec le code tel quel j'ai une période d'environ 3s pour observer les changements à l'oeil nu
J'ai essayé d'utiliser le Timer1 mais là j'ai une période bien trop longue (d'environ 33ms), avec ce code :
P.S 2 : Veuillez m'excuser pour le manque de propreté du code mais je ne suis qu'un élève de Terminale SCode:unsigned long valchgt = 1, cnt = 0; void interrupt() { if(PIR1.TMR1IF == 1) { if(cnt == valchgt || cnt == 0) PORTB = ~PORTB; // Toggle PORTD cnt++; if(cnt == 100) cnt = 0; PIR1.TMR1IF = 0; } } void main() { TRISA = 0xFF; PORTA = 0; PORTB = 0; TRISB = 0; INTCON = 0; PIE1 = 0; PIR1 = 0; T1CON = 0; INTCON.GIE=1; INTCON.PEIE = 1; PIE1.TMR1IE = 1; //activer le timer1 T1CON.TMR1CS = 0; //horloge interne Fosc/4 T1CON.T1OSCEN = 0; T1CON.TMR1ON = 1; //démarrer le timer1 //prescaler T1CON.T1CKPS1 = 0; T1CON.T1CKPS0 = 0; while(1) { } }
-----