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

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();
}
 
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 [CHAR]micro[/CHAR]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 [CHAR]micro[/CHAR]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 üyeler

Çevrimiçi üye yok.

Forum istatistikleri

Konular
7,242
Mesajlar
122,551
Üyeler
2,925
Son üye
YusufAbali

Son kaynaklar

Son profil mesajları

Freemont2.0 herbokolog Freemont2.0 wrote on herbokolog's profile.
nick iniz yakıyor
:D
Freemont2.0 posta Freemont2.0 wrote on posta's profile.
Merhabalar :)
az bilgili çok meraklı
Prooffy semih_s Prooffy wrote on semih_s's profile.
Merhaba, sizden DSO2C10 hakkında bilgi rica ettim. Yanıtlarsanız sevinirim...
Unal taydin Unal wrote on taydin's profile.
Timur Bey, Arduino kontrollü bir akü şarj cihazı yapmaya çalışıyorum. Aklımdaki fikri basit bir çizim olarak konu açmıştım. Özellikle sizin fikirlerinizi çok önemsiyorum.
Back
Top