/* Valeur mini ? 1ms Valeur neutre ? 1,50 ms Valeur maxi ? 2,0ms */ void EXTI9_5_RFHandler(){ if(Port_IO_Read(GPIOB, PIN_RF)){ Timer_Run(TIM_RF_CNT); } else { timcnt = TIM_RF_CNT->CNT; Timer_Stop(TIM_RF_CNT); TIM_RF_CNT->CNT = 0; timcnt = (timcnt*TIM_RF_US)/autoreload; if (first>10){ correction = timcnt; first=0; } else if (first!=0) { first+=1; } else { commande = timcnt - correction; if (commande > commande_max){ commande_max=commande; } else if ((-commande) > commande_max){ commande_max=(-commande); } if (commande > seuilCommande) { Port_IO_Set(GPIOA, 2); rapport = (float) commande/commande_max; } else if (commande < -seuilCommande) { Port_IO_Reset(GPIOA, 2); rapport = (float) (-commande)/commande_max; } else { rapport = 0; } update_PWM(TIM2, 1.0f-rapport, 2); } } EXTI->PR |= 0x1 << 6; }
//======================================================================================= int main(void) { char flipflop = 1; Port_IO_Init(GPIOB, 8, 'o', 0); while(1) { flipflop=!flipflop; if (flipflop) { Port_IO_Clr(GPIOB,Num_Broche); } else { Port_IO_Set(GPIOB,Num_Broche); } } }
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); }
void notreTIM4_IRQHandler(void){ float duty_cycle_moteur; float tmp_impulsion; //detecter CC2F comme IT if((TIM4_CC2_FLAG)!= 0) { /* Calcul de la duree de l'impulsion */ /* Une duree de 1.5ms correspond a une commande de 0% */ /* Une deviation maximum de 5ms autour de 1.5ms est permise */ /* 2ms => 100% sens '0' */ /* 1ms => 100% sens '1' */ tmp_impulsion = lire_duree_imp(TIM4); tmp_impulsion -= RF_MID; duty_cycle_moteur = tmp_impulsion * 100 / 0.0005; //implementation d'une zone morte de 10% autour de 1.5ms if(duty_cycle_moteur > DEAD_ZONE) /*sens '0'*/ { Port_IO_Reset(GPIOA, 2); } else if(duty_cycle_moteur < -DEAD_ZONE) { /*sens '1'*/ duty_cycle_moteur = -duty_cycle_moteur; Port_IO_Set(GPIOA, 2); } else { duty_cycle_moteur = 0; } if(duty_cycle_moteur>100) /*prise en compte d'une saturation*/ {duty_cycle_moteur = 100;} charger_DC_pwm(TIM2,2,duty_cycle_moteur); Timer_IT_CCx_OFF(TIM4,2); } }
void commandeMoteur(int sens) { int rapport; if (sens > 4) //On va a .... droite { rapport = (sens *100) /30 ; //Changer le rapport cyclique PWM_modif(TIM2,2,rapport); Port_IO_Set(GPIOA, 2); } else if (sens < -4) //On va a ... gauche { rapport = (-sens *100) /30 ; //changer le rapport cyclique (vitesse) PWM_modif(TIM2,2,rapport); Port_IO_Reset(GPIOA, 2); } else { //Mettre le rapport cyclique à 0 PWM_modif(TIM2,2,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 }; }