Peak2Peak
Aktif Üye
- Katılım
- 27 Haziran 2020
- Mesajlar
- 291
Merhaba 555 ile bir devre yaptım. Fan sürüyorum. Fanın frekanslar göre nasıl tepki vereceğini görmek için PWM frekansını ve Duty süresini ölçmek istedim. Görev süresi ve frekans için potum var.STM32F4 ile bunları yapmak için internette bir kod buldum onu kendime göre düzenledim.
STM32 input capture mode ilk rising yakalıyor.Sonra polariteyi değiştirip falling yakalıyorum. Son kez 2. rising yakalıp bunlar arasındaki farklı bulup frekans ve duty çeviriyorum.En düşük 1HZ en yüksek 65kHz ölçebilmek üzere değerleri ayarladım. Debug ettiğimde frekans 65kHz civarındaydı.Duty cyle potunu çevirdiğimde frekans düşmeye başladı.40 kHz kadar düştü. Galiba sorun yazılımda ama göremedim.Yardımcı olabilcek var mı ?
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_3)
{
if (Captured_State==0) //first rising
{
IC_Value1 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_3);
Captured_State =1;
__HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_3, TIM_INPUTCHANNELPOLARITY_FALLING);
}
else if (Captured_State==1) //first falling
{
IC_Value2 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_3);
Captured_State=2;
__HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_3, TIM_INPUTCHANNELPOLARITY_RISING);
}
else if (Captured_State==2) //second rising
{
IC_Value3 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_3);
if (IC_Value3 > IC_Value1) //// freq
{
Difference_F = IC_Value3-IC_Value1;
}
else if (IC_Value3 < IC_Value1)
{
Difference_F = ((0xffff-IC_Value1)+IC_Value3) +1;
}
if (IC_Value2 > IC_Value1) ////duty
{
Difference_D = IC_Value2-IC_Value1;
}
else if (IC_Value2 < IC_Value1)
{
Difference_D = ((0xffff-IC_Value1)+IC_Value2) +1;
}
Duty=Difference_D*100/Difference_F;
Frequency = 2*HAL_RCC_GetPCLK1Freq()/Difference_F;
Captured_State=0;
}
}
else
Error_Handler();
}
STM32 input capture mode ilk rising yakalıyor.Sonra polariteyi değiştirip falling yakalıyorum. Son kez 2. rising yakalıp bunlar arasındaki farklı bulup frekans ve duty çeviriyorum.En düşük 1HZ en yüksek 65kHz ölçebilmek üzere değerleri ayarladım. Debug ettiğimde frekans 65kHz civarındaydı.Duty cyle potunu çevirdiğimde frekans düşmeye başladı.40 kHz kadar düştü. Galiba sorun yazılımda ama göremedim.Yardımcı olabilcek var mı ?
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_3)
{
if (Captured_State==0) //first rising
{
IC_Value1 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_3);
Captured_State =1;
__HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_3, TIM_INPUTCHANNELPOLARITY_FALLING);
}
else if (Captured_State==1) //first falling
{
IC_Value2 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_3);
Captured_State=2;
__HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_3, TIM_INPUTCHANNELPOLARITY_RISING);
}
else if (Captured_State==2) //second rising
{
IC_Value3 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_3);
if (IC_Value3 > IC_Value1) //// freq
{
Difference_F = IC_Value3-IC_Value1;
}
else if (IC_Value3 < IC_Value1)
{
Difference_F = ((0xffff-IC_Value1)+IC_Value3) +1;
}
if (IC_Value2 > IC_Value1) ////duty
{
Difference_D = IC_Value2-IC_Value1;
}
else if (IC_Value2 < IC_Value1)
{
Difference_D = ((0xffff-IC_Value1)+IC_Value2) +1;
}
Duty=Difference_D*100/Difference_F;
Frequency = 2*HAL_RCC_GetPCLK1Freq()/Difference_F;
Captured_State=0;
}
}
else
Error_Handler();
}