ELEKTRONİK DEVRE ELEMANLARI

STM32F4 Servo Motor Kontrolü

Bu projede STM32F4 discovery geliştirme kartında PWM yöntemi kullanılarak servo motor 0-180 derece arasında sürekli dönmesi sağlanmıştır.

****************************************************************************

#include “stm32f4xx.h” // Device header
void Delay(uint32_t Time)
{
while(Time–);

}

******************************************************************************

Yukarıda ilk olarak #include “stm32f4xx.h” komutuyla kullandığım mikro denetleyiciye ait kütüphane eklenmiştir. Ardından PWM için kullanacağımız bekleme fonksiyonunu tanımladım. Fonksiyon sadece bekleme sağlayacağı ve geriye değer döndüremeyeceği için “void” veri tipinde tanımladım. Delay fonksiyonunun bekleme için kullanacağı Time değeri 5 ve 6 basamaklı olduğu için uint32_t (unsigned int 32) veri tipinde tanımladım. Fonksiyon bekleme sağlaması için while döngüsü Time değeri sıfırdan büyük olduğu sürece çalışacaktır. while döngüsü bu haliyle her döngüde 4 cycle sürede tamamlanacaktır. Toplamda Time*4 cycle sürede bitecektir. İşlemcinin clock hızı 168Mhz olduğuna göre bir cycle yaklaşık 6 nano saniyedir.

**********************************************************************************

int main()
{
uint32_t i=0;
uint32_t birms=41666;
uint32_t ondokuzms=791667;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13;
GPIO_Init(GPIOD,&GPIO_InitStructure);

*************************************************************************************

Yukarıdaki kısımda ,döngüde ve Timer değişkenlerine değer ekleme ve çıkarmada kullanacağım  i değişkenini uint32_t veri tipinde tanımladım. Sonrasında gelen değişkenlerin tanımlanmasında servo motorların çalışma prensibi kullanılmıştır. Servo motorlar 20mslik bir periyotta 1ms(%5) duty cyle değerinde 0 derece konumunda olurlar. Bu durumda delay fonksiyonunun içine 1ms bekleme elde etmek için yazılacak uint32_t birms şöyle hesaplanır; (1*10^-3)/(4*cyclesüresi(6*10^-9))~=41666 olur. Servo motor yaklaşık 2.5 ms de 180 dereceye ulaşır. Servo motor periyodu 20ms olduğu ve 1mslik duty cycle olduğu  için uint32_t ondokuzms adlı değişkenler ile geri kalan 19 ms için ((19*10^-3)/(4*cyclesüresi(6*10^-9)) ~791667 olarak atanmıştır. Ardından GPIO_InitStructure structure olarak tanımlanmıştır. Bundan sonra RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE); komutuyla GPIOD’ye giden clock hattı aktif edilmiştir. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT; komutyla GPIO çıkış olarak atanmıştır.  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;Komutuyla GPIO hızı 100MHz olarak tanımlanmıştır. GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;  komutuyla pin yapısı Push-Pull yapısında tanımlanmıştır. Burada dışarıya sinyal verileceği için pull-down/up ayarı yapılmasına gerek görmedim. Burada Open Drain kullanmamamın  nedeni Open Drain yapısında çıkış voltajının servo motor için düşük olmasıdır. GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13; komutuyla GPIO_InitStructure nesnesine ait pini 13. pin olarak atanmıştır. GPIO_Init(GPIOD,&GPIO_InitStructure); komutuyla GPIO_InitStructure nesnesinin içindekiler GPIOD(D portu)’ye atanır.

*************************************************************************************

while(1){
for(i=0;i<625;i++){
GPIO_SetBits(GPIOD,GPIO_Pin_13);
Delay(birms+100*i);
GPIO_ResetBits(GPIOD,GPIO_Pin_13);
Delay(ondokuzms-100*i);
}
for(i=0;i<625;i++){
GPIO_SetBits(GPIOD,GPIO_Pin_13);
Delay(2.5*birms-100*i);
GPIO_ResetBits(GPIOD,GPIO_Pin_13);
Delay((ondokuzms-62500)+100*i);
}

Yukarıda görülen kısımda ise while(1) ile sürekli çalışacak program alanı oluşturulmuştur. İlk for döngüsünde i değişkeni 0 arasında değer alır ve her seferde önce 13. pin HIGH yapılır ardından bir milisaniye artı 100*i süre beklenip 13. pin LOW seviyesine getirilir ve ondokuz mili saniye eksi 100*i süre beklenir. Bu döngü sonunda 2.5 mili saniye HIGH,17.5 mili saniye low konumunda olup Servo motor 0 dereceden 180 dereceye gelir. İkinci for döngüsünde bu işlemlerin tersi yapılarak 180’den 0’ye kadar gelir.

12/07/2018 ENEZ/EDİRNE

STM32F4 Servo Motor Kontrolü&rdquo için 1 yorum

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Google fotoğrafı

Google hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Connecting to %s

%d blogcu bunu beğendi: