STM LIB PWM Output + Pulse-Period ölçüm

Başlatan Klein, 06 Ekim 2013, 16:14:15

Klein

Olur. gerilim bölücü de yapabilirsin.

muhittin_kaplan

Bu işe önem vermem gerek, şu araç hızı tespiti için kullanacağım.

Klein

#17
Gerilim bölücü önemsiz bir devre değil ki! Hatta bu güne kadar tanıdığım en önemli devre. :)

Opampların geri beslemesi bir gerilim bölücü. Regülatörlerin geri beslemesi gerilim bölücü. belki daha sayamadığım bir sürü önemli devre gerilim bölücü ile yapılıyor.
Yeterki hat empedansına, giriş akımına vs..  uygun değerler seç.

muhittin_kaplan

:), yok hocam gerilim bölcüden bahsetmiyorum. bunu PWM ınputu kullanarak HC-SR4 ulrasounic sensörü kullanacağım. ve Arac Hız tespitinde yararlanacağım.

SpeedyX

PWM ürettiği pin her konum değiştirdiğinde kesmeye girebiliyor mu?

Klein

Kesme seçenekleri içerisinde gördüğümü hatırlıyorum. Detaylara bakmadım.

SpeedyX

Custom PWM:

PWM1DutyCycleTime değerini 0 - Period aralığında değiştirerek duty ile oynanabiliyor.

uint16_t PWM1DutyCycleTime;

void PWMOutSetup(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  TIM_OCInitTypeDef TIM_OCInitStructure;
  
  /* Time base configuration */
  /*
  Period calculation:
  72MHz / 72 = 1MHz or 1µs period unit.
  1µs + 9999 x (1µs) = 10ms
  */
  TIM_TimeBaseStructure.TIM_Period = 9999;
  TIM_TimeBaseStructure.TIM_Prescaler = 72;
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
  
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Inactive; // output lines are disabled
  
  /* Output Compare Active Mode configuration: Channel1 */  
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = PWM1DutyCycleTime;
  //TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  TIM_OC1Init(TIM2, &TIM_OCInitStructure);
  TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Disable); // The preload must be disabled to able to change the compare value at run time
  
  /* Enable the TIM2 Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
  NVIC_Init(&NVIC_InitStructure);

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
  
  /* TIM IT enable */
  TIM_ITConfig(TIM2, TIM_IT_CC1 | TIM_IT_Update, ENABLE);
  
  /* TIM2 enable counter */
  TIM_Cmd(TIM2, ENABLE);
}

void TIM2_IRQHandler(void)
{
	if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)
	{
		TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);
		// PWM pin = 0
	}
	else if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
	{
		TIM_ClearITPendingBit(TIM1, TIM_IT_Update);
		// PWM pin = 1
	}
	TIM_SetCompare1(TIM2, PWM1DutyCycleTime);
}