İçindekiler:
2025 Yazar: John Day | [email protected]. Son düzenleme: 2025-01-23 15:13
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
- Dahili Saati Seçin Bu adım
- PWM Nesil CH1 Bu adım
-
Ardından, Yapılandırma bölümünden
- Ön Ölçekleyiciyi 160'a Ayarlayın Bu adım
- Sayaç Dönemini 2000'e Ayarlayın Bu adım
- 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:
Butonlar, Raspberry Pi ve Scratch ile Parlaklık Kontrolü PWM Tabanlı LED Kontrolü: 8 Adım (Resimlerle)
Basmalı Düğmeler, Raspberry Pi ve Scratch Kullanarak Parlaklık Kontrolü PWM Tabanlı LED Kontrolü: Öğrencilerime PWM'nin nasıl çalıştığını açıklamanın bir yolunu bulmaya çalışıyordum, bu yüzden kendime 2 basmalı düğme kullanarak bir LED'in parlaklığını kontrol etmeye çalışma görevi verdim - bir düğme bir LED'in parlaklığını arttırır ve diğeri onu karartır. Programlamak için
3 Potansiyometre ve Arduino İle 3 Servo Motor Kontrolü: 11 Adım (Resimli)
3 Potansiyometre ve Arduino ile 3 Servo Motoru Kontrol Etmek: Merhaba. Bu benim ilk dersim, bu yüzden kurarken herhangi bir hata yaparsam bana karşı sabırlı olacağınızı umuyorum. Yeni başlayanlar için yazılmıştır, bu yüzden aranızda daha ileri olanlar bunun çoğunu atlayabilir ve sadece kablolamaya geçebilir. Kendime koyduğum hedef
Arduino Eğitimi - Joystick ile Servo Motor Kontrolü: 4 Adım
Arduino Eğitimi - Joystick ile Servo Motor Kontrolü: Bu dersimizde Joystick ile servo kullanmayı öğreneceğiz. 1 adet servo motoru 1 adet Joystick ile kontrol edeceğiz. Robotik kol projelerinizi bu dersten hareketle uygulayabilirsiniz. Tabi bunu yaparken harici pil/güç kullanacağız
Arduino Eğitimi - Arduino ile Servo Motor Kontrolü: 5 Adım
Arduino Eğitimi - Arduino ile Servo Motor Kontrolü: Bu talimat, "Arduino: Servo Motoru Arduino ile Nasıl Kontrol Edilir" kitabımın yazılı versiyonudur. Geçenlerde yüklediğim YouTube videosu. İncelemenizi şiddetle tavsiye ederim.YouTube Kanalını Ziyaret Edin
DC Motorun PID Algoritması ile Hız Kontrolü (STM32F4): 8 Adım (Resimli)
DC Motorun PID Algoritması (STM32F4) ile Hız Kontrolü: Herkese merhaba, Bu başka bir proje ile tahir ul hak. Bu sefer MC olarak STM32F407. Bu bir yarıyıl sonu projesidir. Umarım beğenirsiniz.Çok fazla kavram ve teori gerektirir, bu yüzden önce ona girelim.Bilgisayarların ortaya çıkışı ve