Keil ile Arm Programlama
Timer Modülü ile Pwm Sinyali
Elde Etme
Merhaba. Arm programlama yazılarımıza kaldığımız yerden devam ediyoruz. Bugün yine önemli bir konuyu öğrenmeye çalışacağız. Konumuz pwm sinyaller yani türkçe karşılığı ile " Darbe Genişlik Modülasyonu " .
Peki nedir Pwm ? Pwm, iki durumlu dijital sinyalleri kullanarak analog bir değer oluşturmaya yarayan tekniktir. Pwm tekniği ile üretilen bir kare dalgada ON - OFF süreleri ayarlanarak sisteme verilen güç ayarlanır. Pwm sinyalleri anahtarlama ile elde edilir ve iki ana kavramı duty cycle ( doluluk / boşluk ) ve frekans'dır.
Bu tanımlama cümleleri fazla açıklayıcı olmamış olabilir, bende ilk defa okuyor olsam anlamazdım.. Alttaki grafiği inceleyelim öncelikle.
Peki nedir Pwm ? Pwm, iki durumlu dijital sinyalleri kullanarak analog bir değer oluşturmaya yarayan tekniktir. Pwm tekniği ile üretilen bir kare dalgada ON - OFF süreleri ayarlanarak sisteme verilen güç ayarlanır. Pwm sinyalleri anahtarlama ile elde edilir ve iki ana kavramı duty cycle ( doluluk / boşluk ) ve frekans'dır.
Bu tanımlama cümleleri fazla açıklayıcı olmamış olabilir, bende ilk defa okuyor olsam anlamazdım.. Alttaki grafiği inceleyelim öncelikle.
Yukarıda sırasıyla %50, %75, %25 duty cycle oranına sahip sinyaller gösterilmiştir. Burada asıl amaç kısaca analog bir çıkış elde etmektir diyebiliriz. Daha önce ADC ( analog digital converter ) yazısında analog değerleri nasıl dijital sinyallere dönüştürdüğümüzü göstermiştik. Şimdi ise pwm sinyalleri ile dijital çıkışların on/off sürelerini ayarlayarak sanki bir analog çıkış elde ediyor gibi yapıyoruz. :) Bu periyotların zaman aralıkları o kadar kısadır ki esasen bir 5V bir 0V çıkış veriyor olsak bile insan duyuları bunu algılayamaz.
Stm32f4'de bazı timerlar APB1, bazı timerlar ise APB2 clock bus hattına bağlıdır. Bizim kullanacağımız TIM3 modülü APB1 clock bus hattına bağlıdır ve bu bus hattının timer frekansı 42 Mhz'dir. Aşağıdaki diyagramda bu clock bus'lar ve frekansları gösterilmiştir.
Stm32f4'de bütün timerlar 16 bit prescaler değerine sahiptir.
Prescaler : Mikroişlemcilerde counter clock frekansını ölçekleme olayına verilen isim.
Hatırlayın timer interrupt yazısında hangi zaman aralıklarında interrupt oluşmasını istiyorsak bu zaman aralığını şu formüle göre belirliyorduk ;
Timer Frekansı = Timer Clock Time / (Prescaler -1).(Period)
Timer konfigürasyonlarımızı yaparken bu prescaler ve period değerlerini kullanıcı olarak bizler girdiğimiz için interrupt zamanlamalarını ayarlayabiliyorduk.
Pwm sinyalleri üretirken de sinyalimizin kaç hz frekansa sahip olmasını istiyorsak buna benzer bir formül kullanıyoruz.
Pwm Frekansı = Timer Frekansı / ( Period + 1 )
Bu formülü bir örnekle açıklamak gerekirse ; ne demiştik, bizim kullanacağımız TIM3 modülü APB1 clock bus hattına bağlıdır ve bu hattın frekansı 42 MHz'dir. Eğer 10 kHz'lik bir pwm sinyali istersek ;
10. (10^3 ) = 42.(10^6) / ( Period + 1 )
Formülüne göre period değerimiz 4199 çıkar.
Pwm frekansını bildiğimize göre T = 1 / f formülünden pwm sinyalinin periyodunu da bilebiliriz.
Yukarıda ne demiştik. Pwm sinyallerinin 2 önemli kavramı vardı biri frekans diğeri ise doluluk/boşluk oranı. Pwm frekansımızı ayarladığımıza göre sırada doluluk/boşluk ( duty/cycle ) oranını ayarlamak var. Onun da formülü şu şekildedir ;
Pulse Length = [ (Period+1).(Duty Cycle)] / (100 - 1)
Bu formülü de bir örnekle açıklayalım. Diyelim ki biz pwm sinyalimizin %25 doluluk oranına sahip olmasını istiyoruz. O halde pulse length değerimiz yani tükçe karşılığı " darbe uzunluğumuz " şu formülle bulunur ;
Pulse Length = [ ( 4199+1).( 25 ) ] / 99 = 1060
Şimdi kodlarımıza geçmeden önce ise timer modüllerinin özelliklerine kısaca değinmek istiyorum.
- Timer6 ve Timer7 basit timer'lardır. Pwm sinyalleri üretemezler.
- Timer2 ve Timer5 32 bitlik timer'lardır.
- Timer9 ve Timer12 iki kanal pwm üretebilirler.
- Timer10, Timer11, Timer13 ve Timer14 tek kanal pwm sinyalleri üretebilirler.
Tabloda görüldüğü gibi bizim kullanacağımız TIM3 modülü 1. kanalda sinyal üretmek için A6, B4 yada C6 pinlerini kullanabilir. Buraya kadar herşey tamamsa artık kodlarımıza geçebiliriz.
Açıklayıcı olması için her kod satırının yanına o kodun ne işe yaradığını yazmaya çalıştım. Umarım faydalı olmuştur.
Yorumlar
Yorum Gönder