STM32F4 ile Frekans ve Görev Süresi Ölçme

Peak2Peak

Aktif Üye
Katılım
27 Haziran 2020
Mesajlar
289
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();
}
 
65 kHz lik bir kare dalganın BÜTÜN yükselen ve düşen kenarlarını bir program ile takip etmek çok zor birşey. Program döngüsünün 7.5 µs yi aşmaması lazım. Assembly ile yazsan dahi olabilecek bütün taklaları atman lazım. Bu verimli bir metot değil.

Onun yerine hardware timer'lar kullan. Timer'in birisi saniyede bir iş yapsın, diğer timer ise frekansı ölçülecek sinyal tarafından saydırılsı, yani hardware counter olsun. Her saniye sonunda hardware counter'i okuyup resetliyorsun, okunan değer de sana frekansı veriyor. Bu şekilde 16 bit counter ile 65 kHz'i çok rahat bir şekilde ölçersin. Hatta 32 bit counter varsa çok daha yüksek frekansları da rahat ölçersin.
 
Aşağıdaki devrenin sayıcı bölümü işini görmez mi? Devreyi tamamlamadım ama ATmega328 ile 300 kHz'e kadar okuyabilimesi lazım.

.png


 
65 kHz lik bir kare dalganın BÜTÜN yükselen ve düşen kenarlarını bir program ile takip etmek çok zor birşey. Program döngüsünün 7.5 µs yi aşmaması lazım. Assembly ile yazsan dahi olabilecek bütün taklaları atman lazım. Bu verimli bir metot değil.

Onun yerine hardware timer'lar kullan. Timer'in birisi saniyede bir iş yapsın, diğer timer ise frekansı ölçülecek sinyal tarafından saydırılsı, yani hardware counter olsun. Her saniye sonunda hardware counter'i okuyup resetliyorsun, okunan değer de sana frekansı veriyor. Bu şekilde 16 bit counter ile 65 kHz'i çok rahat bir şekilde ölçersin. Hatta 32 bit counter varsa çok daha yüksek frekansları da rahat ölçersin.
controller tech kanalında böle video var galiba.Ama ben çalıştırmadım.2 timer birbirine bağımlı şekilde çalışıyor ama şu slave mode trigger source felan anlayamadım stm32 dökümanlarında kayboldum.Zaten bu kodda controller tech kanalından alında orada frekans için yapılmıştı duty eklemek istedim.Potu çevirdiğimide duty anlıyor ama frekansı düşürmesi çok saçma.Tam anlayamadım donanımla nasıl yapacağım.
 
Son düzenleme:
Aşağıdaki devrenin sayıcı bölümü işini görmez mi? Devreyi tamamlamadım ama ATmega328 ile 300 kHz'e kadar okuyabilimesi lazım.

9932 eklentisine bak

teşekkürler bakacağım.
 

Çevrimiçi personel

Forum istatistikleri

Konular
5,989
Mesajlar
102,212
Üyeler
2,518
Son üye
ceyhun

Son kaynaklar

Son profil mesajları

deneyci wrote on hakan8470's profile.
Sibonge uNkulunkulu ngokuhlukahluka asinike kona.

Bu hangi dil? :)
Lyewor_ wrote on taydin's profile.
Merhabalar. Elektrik laboratuvarınız varsa bunun hakkında bir konunuz var mı acaba? Sizin laboratuvarınızı merak ettim de :)
Lyewor_ wrote on taydin's profile.
Merhabalar forumda yeniyim! Bir sorum olacaktı lcr meterler hakkında. Hem bobini ölçen hemde bobin direnci ölçen bir lcr meter var mı acaba?
gruptaki arkadaşlara selamlar. sıteyi bu gün fark ettim. Asansör için 2x7 segment LCD gösterge üretmek istiyorum. acaba bu sayfadaki arkadaşlardan destek alabilirmiyim. LCD nin mantık açılımı ektedir.
deneyci wrote on TA3UIS's profile.
Selam.
Amatör telsiz lisansı nasıl alınıyor?
Lisansı olmayanı forumlarına almıyorlar. :)
Bilgi alamıyoruz.
Back
Top