// vu16 -> unsigned 16 bits integer vu16 PWM_Init_Servo(TIM_TypeDef *Timer, char Voie, float Frequence_PWM_Khz) { Timer_1234_Init(Timer, 1000/(Frequence_PWM_Khz) ); //on ne travaille que sur TIM1 if (Timer == TIM1) Timer->BDTR = TIM_BDTR_MOE; /// MOE -> Main output enable | Output Enable if (Voie == 1) { Timer->CCMR1 = (Timer->CCMR1 & ~(0b1111111)) | (0b1101000); // (0x007F)) | (0x0068) //OC1M: Output compare 1 mode = 110 -> 110: PWM mode 1 - In upcounting // OC1FE = 0 -> CC1 behaves normally depending on counter and CCR1 values even when the trigger is ON. //OC1PE: Output compare 1 preload enable = 1 -> Preload register on TIMx_CCR1 enabled. Read/Write operations access the preload register. TIMx_CCR1 preload value is loaded in the active register at each update event. // CC1S = 0 -> CC1 channel is configured as output. Timer->CCER = (Timer->CCER & ~(0b11)) | (0b1); //(0x0003)) | (0x0001) //CC1E = 1 -> output enable // CC1P = 0 -> without polarity Timer->CCR1 = 0x0000; //CCR1 is the value to be loaded in the actual capture/compare 1 register (preload value) } // de même mais avec 8 bits de décalage else if (Voie == 2) { Timer->CCMR1 = (Timer->CCMR1 & ~(0b111111100000000)) | (0b110100000000000); Timer->CCER = (Timer->CCER & ~(0b110000)) | (0b10000); Timer->CCR2 = 0x0000; } // même valeur que précédent mais en hexa et sur CCMR2 else if (Voie == 3) { Timer->CCMR2 = (Timer->CCMR2 & ~(0x007F)) | (0x0068); Timer->CCER = (Timer->CCER & ~(0x0300)) | (0x0100); Timer->CCR3 = 0x0000; } else if (Voie == 4) { Timer->CCMR2 = (Timer->CCMR2 & ~(0x7F00)) | (0x6800); Timer->CCER = (Timer->CCER & ~(0x3000)) | (0x1000); Timer->CCR4 = 0x0000; } Timer->CR1 = ((Timer->CR1 & (~0x1)) | 0x1); return 1000/(Frequence_PWM_Khz * 256); }
vu16 PWM_Init(TIM_TypeDef *Timer, char Voie, float Frequence_PWM_Khz) { Timer_1234_Init(Timer,1000.0/Frequence_PWM_Khz); *(&Timer->CCR1 + 2*(Voie-1)) = Timer->ARR/2; // <=> Timer->ARR / 2; if (Voie <= 2) Timer->CCMR1 = (0b110)<<(4+8*(Voie-1)); //OC1M : PWM mode 1 else Timer->CCMR2 = (0b110)<<(4+8*(Voie-3)); //OC1M : PWM mode 1 Timer->CCER = 1<<(4*(Voie-1)); Timer_1234_Active(Timer); return Timer->CCR1; }
void RF_Init(){ // Timer pour compter TIM_RF_CNT=TIM1; first=1; correction=1500; commande_max=1; //Configure le pin du RF en entrée Timer_1234_Init(TIM_RF_CNT, TIM_RF_US); autoreload = TIM_RF_CNT->ARR; Port_IO_Init_InputPull(GPIOB, PIN_RF); //Configuration moteur Port_IO_Init_Alt_Output(GPIOA, 1); Port_IO_Init_Output(GPIOA, 2); Port_IO_Set(GPIOA, 2); //Timer pour commander le moteur en PWM Timer_1234_PWM_Init(TIM2, tempsPWM, 0.0f, 1, 2); Timer_Run(TIM2); }
int main() { // Configuration du clock (passage de 8MHz à 72MHz) CLOCK_Configure(); //test servo output Timer_1234_Init(TIM2, 3000000.0 ); Timer_Active_IT( TIM2, 10, Test_Angle ); Init_Servo(); Angle=0; Augmente=1; Set_Angle_Servo(Angle); Init_Girouette(); while(1) { // //Set_Angle_Servo(Get_Angle_); } return 0; }
int main (void) { alerte_roulis=0; alerte_batterie=0; CLOCK_Configure(); /*###################################################### CONFIGURATION DES ENTREES/SORTIES ########################################################*/ //configuration GPIOA floating input port 5, 6 et 7 //(voie I & A & B) pour la girouette Port_IO_Init_Input(GPIOA, 5); Port_IO_Init_Input(GPIOA, 6); Port_IO_Init_Input(GPIOA, 7); //Config Servo-moteur Port_IO_Init_AF_Output ( GPIOA, 8); //Config Moteur-CC Port_IO_Init_AF_Output( GPIOA, 1); //PWM moteur cc Port_IO_Init_Output( GPIOA, 2); //sens du moteur cc //Config Récepteur RF Port_IO_Init_Input( GPIOB, 6); //Récepteur RF CH1 //Config liaison HF Port_IO_Init_AF_Output (GPIOA, 9); //USART : liaison HF Port_IO_Init_Output(GPIOA, 11); //TX_ENABLE //Config ADC Port_IO_Init_Analog_Input(GPIOC, Y_AXIS_CHANNEL); Port_IO_Init_Analog_Input(GPIOC, BATTERY_CHANNEL); /*###################################################### CONFIGURATION DES TIMERS ########################################################*/ //Enable clock Timer 3 Enable_CLK_Timer1234(TIM3); //init du codeur incrémental Init_Codeur(TIM3, 5); //configuration pour lire les impulsions du récepteur RF Timer_Init_PWM_Input(TIM4, 1, 20000); //Servo Moteur Timer_1234_Init(TIM1,20000); config_pwm (TIM1, 1, 5); // config TIM1 CH1 //Moteur CC (PWM) Timer_1234_Init(TIM2, 52); config_pwm(TIM2, 2,0); /*###################################################### CONFIGURATION DE L'USART ########################################################*/ //Config UART Config_UART_Projet_Bateau(USART1); Port_IO_Set( GPIOA, 11); /*###################################################### CONFIGURATION DES ADCs ########################################################*/ //Config Accéléromètre et niveau batterie power_ADC(ADC1); power_ADC(ADC2); config_adc_single_channel(ADC1, Y_AXIS_CHANNEL); config_adc_single_channel(ADC2, BATTERY_CHANNEL); /*###################################################### ACTIVATION DES INTERRUPTIONS ########################################################*/ //Recepteur RF & Moteur_CC Timer_Active_IT(TIM4,5, 2,notreTIM4_IRQHandler); //Accelerometre & Batterie Active_IT_ADC(ADC1, 1, &ADC_IT);//Accelerometre Active_IT_ADC(ADC2, 1, &ADC_IT);//Batterie Timer_Active_IT(TIM1, 99, 0, &Timer_IT);//f_s ADCs while(1) { alpha = lire_alpha(); //angle de la girouette Convert_alpha_DC(alpha,alerte_roulis); // le bras varie entre 0 et 90 deg // valeur correspondant a un bras a 0 deg (5%) // valeur correspondant a un bras a 90 deg (10%) // quand le bras est a 90 deg les voiles sont a 0 deg // quand le bras est a 0 deg les voiles sont a 90 deg d'amplitude // et le vent decide du signe de l'angle de la voile }; }