İçindekiler:

STM32F4 ARM MCU ile Servo Motor Kontrolü: 4 Adım
STM32F4 ARM MCU ile Servo Motor Kontrolü: 4 Adım

Video: STM32F4 ARM MCU ile Servo Motor Kontrolü: 4 Adım

Video: STM32F4 ARM MCU ile Servo Motor Kontrolü: 4 Adım
Video: STM32F4-KEIL-ARM#3 Timer & PWM & Servo Motor Control 2024, Temmuz
Anonim
STM32F4 ARM MCU ile Servo Motor Kontrolü
STM32F4 ARM MCU ile Servo Motor Kontrolü
STM32F4 ARM MCU ile Servo Motor Kontrolü
STM32F4 ARM MCU ile Servo Motor Kontrolü

Tekrar merhaba arkadaşlar:) O yüzden bu projemizde STM32F4 ARM MCU ile bir servo motoru kontrol edeceğiz. Benim durumumda keşif kartı kullanacağım, ancak sorunun özünü kavrarsanız, her MCU için uygulayabilirsiniz. Yani. başlayalım:)

Adım 1: Donanım ve Yazılım Gereksinimleri

Donanım açısından ihtiyacımız olacak:

  • Benim durumumda olan bir MCU STM32f4 Discovery board
  • SG90 veya başka herhangi bir ortak servo motor

Yazılım açısından ihtiyacımız olacak:

  • STM32CubeMX
  • Keil uVision

Bunların hepsine sahipseniz, bir sonraki adıma geçin:)

Adım 2: STM32CubeMX Yapılandırması

Bildiğiniz gibi bir servo motoru kontrol etmek için PWM sinyaline ihtiyacımız var. PWM sinyali açısından gereksinimler şöyledir:

  • PWM periyodu 20 mS olmalıdır
  • Açık kalma süresi 0,5 mS ile 2,5 mS arasında olmalıdır. Zaman 0,5 mS olduğunda, servo 0 derece, 90 derece için 1,5 mS ve 180 derece için 2,5 mS dönecektir.

Bu yüzden PWM'yi yapılandırmamız gerekiyor ve bu amaçla Timer1'i kullanacağız.

  • İlk olarak, Zamanlayıcılar bölümünden TIM1'i seçin. Bu adım
  • Ardından, Mod bölümünden

    1. Dahili Saati Seçin Bu adım
    2. PWM Nesil CH1 Bu adım
  • Ardından, Yapılandırma bölümünden

    1. Ön Ölçekleyiciyi 160'a Ayarlayın Bu adım
    2. Sayaç Dönemini 2000'e Ayarlayın Bu adım
    3. Darbeyi 50'ye ayarlayın Bu adım
  • Ek olarak, Saat Yapılandırmasından APB1 Zamanlayıcı saatlerini 16MHz'e ayarlayın. Bu adım

Şimdi bu adımdan biraz bahsedelim:

APB1 Zamanlayıcı saatimizin frekansı 16MHz'dir. Yani 1 saniye almak için 16.000.000 tik gerekiyor demektir. Ancak ön ölçekleyicimizi 160'a ayarlıyoruz. Yani frekansımızı o sayıya bölüyoruz ve tik sayısını 100.000'e indiriyoruz. Yani 1 saniye için 100.000 tike ihtiyacımız var. Ancak daha önce de belirttiğimiz gibi 20mS PWM periyoduna ihtiyacımız var. Yani, basit matematiğe dayanarak, 20mS için 2000 tike ihtiyacımız var. Böylece Sayaç Periyodunu 2000 olarak ayarlayarak 20mS olan PWM sinyalinin periyodunu belirliyoruz. Şimdi 0,5mS'den 2,5mS'ye kadar On süreleri için onay sayısını belirlememiz gerekiyor. Bu denklemi basit matematikten alabiliriz ve şudur:

On_Time = (Tick_Number / 100). Bunun servo motorun açısını değiştiren on_time olduğunu unutmayın. Yani, resmin altında bu adımı özetliyorum. Herhangi bir sorunuz varsa yorumlara yazın, mümkün olduğunca çabuk cevaplayacağım.

Hesaplamaların resmi

Tüm bunları yaptıktan sonra kod oluşturun:)

Adım 3: Keil UVision Kodlaması

O halde önce ne yapmak istediğimizi belirleyelim? Dereceyi kabul eden bir fonksiyon yazıp servoya yazmak istiyoruz. Peki, bunu nasıl yapacağız? Daha önce de söylediğimiz gibi açıyı değiştirmek için zamanında değiştirmeliyiz. Açılarımız [0, 180] arasında değişir ve zamanı belirleyen tik sayımız [50, 250] arasında değişir. Bu nedenle, verilen açıyı kene sayısı aralığına eşleyen bir eşleme işlevine ihtiyacımız var. Örneğin 0 derece 50 tik için, 180 derece 250 tik için vb… O halde mapping fonksiyonumuzu yazalım:

int harita(int st1, int fn1, int st2, int fn2, int değer){ dönüş (1.0*(değer-st1))/((fn1-st1)*1.0) * (fn2-st2)+st2; }

Bu bizim haritalama fonksiyonumuz. Nasıl türetildiğiyle ilgileniyor musunuz? O zaman şunu oku. Böylece, aralıklarımızı ve haritalamak istediğimiz değeri alıyoruz.

Şimdi açıyı kabul eden ve kene aralığına eşleyen bir fonksiyon yazalım:

void servo_write(int angle){ htim1. Instance->CCR1 = map(0, 180, 50, 250, angle); }

Gördüğünüz gibi, bu kod açıyı kabul eder ve onu kene sayısı aralığına eşler. Ardından, on time ve dolayısıyla açıyı kontrol eden CCR1 kaydına tik sayısı verilir.

Ancak, tüm bunların çalışması için önce sadece bir satır kodla yapılabilecek pwm'yi başlatıyoruz:

HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);

Yani açıyı kabul eden ve servoya yazan bir fonksiyonumuz var. Test edelim ve çok kolay olan süpürme fonksiyonumuzu yazalım:

void servo_sweep(void){ for(int i = 0; i <= 180; i++) { servo_write(i); HAL_Gecikme(10); } for(int i = 180; i>= 0; i--) { servo_write(i); HAL_Gecikme(10); } }

Yani sadece 180'e kadar sayıyor ve sonra 0'a düşüyor ve bu değerleri servoya yazıyor:) O halde sonucu görelim!

4. Adım: Sonuç:)

Yani, bu son. Herhangi bir sorunuz varsa lütfen sorun. Onlara cevap vermekten mutlu olacağım. Okuduğunuz için çok teşekkür ederim ve bir sonraki projede görüşmek dileğiyle:)

Önerilen: