Bonjour à tous,
En faisant quelques recherche sur internet, je me suis lancé sur un petit projet utilisant un microcontrolleur PIC, mon choix se pose sur 16F88, au niveau électronique, ça ne me pose pas de souci particulier mais c'est plutôt le coté logiciel que j'aurai besoin de votre aide.
Mon projet c'est de commander un système avec un signal PWM à rapport cyclique variable. La fréquence du signal pwm est fixée à 50khz, et la fréquence du quartz de mon micro est de 20mhz.
Alors dans le vif du sujet, à l'entrée sur le port RA1 j'ai un signal variable analogique qui varie de 0 à 5V, suivant cette variation de tension, j'aurai en sortie sur le port RB3 un signal pwm de rapport cyclique conséquente, qui suit la formule suivante:
ce qui me donne une relation entre Vin et rapport_cyclique en %, c'est à dire à 5V -> Rpp_cycl = 0% et à 0V->Rpp_cyl = 100%.Code:Rapp_cyclique = -0,2*Vin + 1
Je programme en C avec mikroC, en simulant mon prog, je n'ai rien en sortie, je vous mets en bas ce code pour que vous puissiez regarder ce qui ne vas pas ou c'est ce que j'ai oublié:
Je remercie d'avance ceux qui pourront m'aider à avancer dans ma réalisation.Code:void main() { unsigned int Result_ADC = 0, CCPR1L_CCP1CON_5_4; unsigned float Vin_ANALOG, Vref = 5.0; float alpha; unsigned short Channel = 1; //Configure RB3 to output PORTB = 0; TRISB = 0xF7; //TMR2 prescaler and postscaler TOUTPS3_bit = 0; TOUTPS2_bit = 0; TOUTPS1_bit = 0; TOUTPS0_bit = 0; T2CKPS1_bit = 0; T2CKPS0_bit = 1; //prescaler 1:4 //Set PWM period PR2 = 0x18; ANSEL = 0x02; //RA1 configured in analog input TRISA = 0x02; ADCON1 &= 0xC0; ADCON1 |= 0x80; //ADFM = 1; Resultat: right justified ADCON1 &= 0xB0; //ADCS2 = 0; A/D clock divide by 2 disabled //choice channel 1 ADCON0 =(ADCON0 & 0xC7) | (Channel << 3); //choice conversion frequency Fosc/8 ADCON0 = (ADCON0 & 0x7F) | 0x40; //Turn ON A/D module ADCON0 |= (1<<ADON); while(1) //infinite loop for acquisition { Delay_us(20); //acquisition time ~19,6µs //Starts conversion ADCON0 |= (1<<GO_DONE); while(GO_DONE); //wait until GO_DONE passes to 0 Result_ADC = (ADRESH << 8); Result_ADC += ADRESL; Vin_ANALOG = ((float)Result_ADC * Vref)/1024; alpha = - 0.2 * Vin_ANALOG + 1; //operation of the duty cycle of pwm signal CCPR1L_CCP1CON_5_4 = 4 * alpha * (PR2 + 1); //Store CCPR1L:CCP1CON<5:4> results CCPR1L = CCPR1L_CCP1CON_5_4 >> 2; //store CCPR1L CCP1CON &= 0xCF; CCP1CON |= ((CCPR1L_CCP1CON_5_4 & 0x03)<<4); //store CCP1CON<5:4> T2CON |= 0x04; // set timer2 ON //configure PWM module CCP1CON |= 0x0C; //CCP1M3 = 1; CCP1M2 = 1; } }
Cordialement
-----