示例#1
0
/*
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;
}
示例#2
0
//=======================================================================================
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);
			}
	}
	
}
示例#3
0
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);
}
示例#4
0
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);	
	}	
}
示例#5
0
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);
    }
}
示例#6
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
	};
}