// 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;
}
示例#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
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;
}
示例#5
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
	};
}