STM32 Cube IDE ile PWM Ayarlama ve Açısal Servo Motor Kontrolü


STM32 Üzerinde herkes gibi bende araştırarak kullanım aşamalarını öğreniyordum fakat öğrenirken kaynaklarda genelde "Prescaler" ve "Counter Period" değeri frekans bölümünün bölümü gibi değişik şekilde anlatılıyor. Bu yazımda olabildiğince sade şekilde pwm kullanımını anlatacağım.

Öncelikle aşşağıdaki görselde servo motorun "PWM" ile çalışma değerleri gösterilmiştir. Bu görseldekine benzer kullanacağınız cihazın PWM değerlerini bu şekilde hesaplayabilirsiniz. Bu yazımda duty olarak değer bahsetmeyeceğim burayı doluluk oranı diye bahsedeceğim çünkü STM32 Cube IDE üzerinde duty olarak değer geçmemekte.

Bu görselde PWM period dediğimiz 1 pwm sinyalinin toplam uzunluğu yani 20ms sürede veriliyor ve 50hz frekansında çalışıyor.

Takip edilmesi gereken işlemler:
1-) STM32 Üzerinde SYS ve RCC'yi seçiyoruz RCC'yi "High Speec Clock" kısmında Crystal/Ceramic Resonator'ü seçiyoruz.
2-) Clock Configuration sekmesinden HCLK kısmını 50 yapıyoruz. Burada cihaz üzerinde timer kısmını ve diğer bölümleri 50Mhz de çalıştırıyoruz.
3-) Tekrar Pinout / Configuration kısmına giriyoruz. Burada "Timers" kısmını genişletiyoruz. Burada "TIM1"i seçiyoruz. Bu bölümde Clock Source'yi -> Internal Clock olarak seçiyoruz. Burada pwm için zamanlayıcı kaynağını belirtmiş olduk. Daha sonra alt kısmında 4 veya 6 adet STM32 kartınıza göre değişiklik gösterebilir Channel1-2-3-4 kaç tane istiyorsak hepsinin yanındaki dropdown'a tıklayarak PWM Generation CH1-2-3-4 kaç adet istiyorsak o kanalık ch değerini seçerek kullanılacak kanal değerini belirtiyoruz. Üst kısımda yapıacak işlemler bitiyor daha sonrasında alt kısımdaki "Parameter Settings" kısmına geçiyoruz.
- Buradaki işlem sırası şu şekilde:

  1. Öncelikle Counter Period kısmını ayarlıyoruz. Bu "Kullanacağınız cihazın frekansı * period(ms)" olarak hesaplanıyor. Burada Period kısmımız yukarıdaki servo pwm tablosunda görüldiği gibi 20ms ve çalışılan frekans 50 hz. Bu da 20*50 = 1000. Burada STM32 kartı pinlerinde genelde +1 değeri alındığı için Counter Period kısmına "1000-1" yazıyoruz.
  2. Daha sonrasında Prescaler değerini hesaplamamıza geldi bu işlem de şöyle cihazımızda osilatör frekansınız 50Mhz olarak belirlemiştik. Bu değeri Counter Period değerine bölüyoruz ve çıkan değeri de çalışma frekansımıza bölüyoruz çıkan sonuç bizim Prescaler değerine denk geliyor. Burada osilatör frekansını Hz olarak yapmamız gerekmektedir. 50.000.000(Hz) / 1000 / 50(Hz) = 1000 değeri bizim Prescaler değeridir. Burada da değeri "1000-1" şeklinde yazmamız gerekmektedir.
Bu işlemler tamamladıktan sonra "Alt+K" tuş kombinasyonuna basarak kodumuzu dönüştürüyoruz. "main.c" dosyamız açıldıktan sonra "/* USER CODE BEGIN 2 */" yorum satırının altına "HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);" kodumuzu ekliyoruz. burada "&htim1" olarak belirttiğimiz değer "TIM1"i temsil etmektedir. "TIM_CHANNEL_1" ise kanal 1'in aktifleştirileceğidir. Eğer kanal 2-3-4 gibi diğer pinleri de aktifleştirecekseniz altına aynı kodu "HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2);" gibi ekleme yapıyoruz. PWM Sinyali göndereceğimizde de "htim1.Instance->CCR1 = 50;" şeklinde kodumuzu "/* USER CODE END WHILE */" kodunun üstüne ekliyoruz. (While içine denk gelecek) Bu kodda "htim1" bizim timer'imizi belirtiyor. "TIM1"i açtığımız için htim1" CCR1 olarak belirttiğimiz kanalımızı belirtiyor. Zamanlayıcı içerisinde "TIM_CHANNEL_1" olarak seçtiğimiz pin'e 50 değeri gönderecek. Burada 50 değerimiz bizim doluluk oranımızı belirtiyor. Sinyalimiz yukarıdaki görselden hatırlayacağınız gibi 20ms'lik bölümde 50hz frekansında çalışmaktadır. Counter Period'u frekans ve period üzerinden hesapladığımız gibi bunu da frekans değerinde hesaplıyoruz. 50 değeri verdiğimizde "CCR1 / Çalışma Frekansı" olarak hesaplanıyor. 50 / 50Hz ile 1ms dolulukta pwm göndermiş oluyoruz. CCR1->100 yaptığımızda da aynı şekilde 100/50Hz ile 2ms dolulukta pwm göndermiş oluyoruz. Servo motora da aynı şekilde 50 gönderdiğimizde 0 dereceye 100 gönderdiğimizde ise servo motorumuzun maksimum açısına gidecektir. Servo motorlar 45-90-180-360 derece gibi açılarda çalışmaktadır. Bu şekilde servo kontrolü yapılabilmektedir.


Ziyaretçi, yorum yapılsın mı?
İsim:*
E-Mail:


[not-allow-comm]
[/not-allow-comm]

Dikkat!

Aşağıdaki bağlantıdaki makaleye göz atın.

Site Kuralları ve Engellenme Sonrası
İstatistik
File engine/modules/zpstats.php not found.
Sıkça Sorulan Sorular
Video Trafiği
Etiketlere göre ara