Ders 7: PWM ile Servo Motor Sürme

 

Servo motorlarda,PWM adı verilen Darbe Genişlik Modülasyonu tekniği sayesinde noktadan noktaya konum-hız-ivme kontrolü yapılabilmektedir.

Uygulamada kullanacağımız servo motor piyasada rahatlıkla bulunabilen ve oldukça ucuz olan HD -1800A adlı servo motordur.

Servo motorun datasheetini incelediğimizde servo motoru sürmek için gerekli olan durty cycle sürelerini ve pwm frekans bilgilerini elde ediyoruz.

1

pwm

Bu bilgilere göre kağıt üzerinde 1-2 hesaplama yapacak olursak;

IMAG0033

[* TIM3 ün bağlı oldugu BUS hattı çalışma frekansı (bu konu hakkında bilgi almak için önceki derslere bakabilirsiniz) 84 MHz ]

Bu bilgilere göre Servo_Motor adında proje oluşturacak olursak (Bu konu hakkında önceki derslere bakabilirsiniz) artık kodlarımızı yazmaya hazır hale gelmiş olacağız.

Ek olarak geçişlerin gözlemlenebilmesi için “Systik Handler” ile bekleme fonksiyonu oluşturuldu oluşturuldu.

#include "stm32f4xx.h"                  // Device header
 
 
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
 
/* Systick Handler ile bekleme olusturma */  
volatile uint32_t Delay_ms;    
void SysTick_Handler(void) 
	{
	Delay_ms++;
	}
 
static void Delay(__IO uint32_t bekle)
	{                                              
  uint32_t t= Delay_ms;
  while ((Delay_ms - t) < bekle);
  }
 
void Bekleme(void)
	{
 
	if (SysTick_Config(SystemCoreClock / 1000)) //1ms bekleme
		{
			while (1){};
	  }
  }
///////////////////////////////////////////
 
	void SERVO_PWM_Init(void)
	{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
 
	TIM_TimeBaseStructure.TIM_Period=19999; //arr degeri
	TIM_TimeBaseStructure.TIM_Prescaler=84;//PrescalerValue; 84
	TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
	TIM_TimeBaseStructure.TIM_ClockDivision=0;
 
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
 
	TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
	TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_Pulse=0;//CCR1_Val;
	TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
	// Kanal 1	
	TIM_OC1Init(TIM3,&TIM_OCInitStructure);
	TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);
 
 
	TIM_ARRPreloadConfig(TIM3,ENABLE);
	TIM_Cmd(TIM3,ENABLE);
	}
 
	void SERVO_GPIO_Init(void)
	{
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE);
 
	GPIO_InitStructure.GPIO_Pin= GPIO_Pin_6;
	GPIO_InitStructure.GPIO_Mode= GPIO_Mode_AF;
	GPIO_InitStructure.GPIO_OType= GPIO_OType_PP;
	GPIO_InitStructure.GPIO_Speed= GPIO_Speed_100MHz;
	GPIO_InitStructure.GPIO_PuPd= GPIO_PuPd_UP;
	GPIO_Init(GPIOC,&GPIO_InitStructure);
 
	GPIO_PinAFConfig(GPIOC,GPIO_PinSource6,GPIO_AF_TIM3);
 
	}
int Derece;
	int main()
	{
		Bekleme();
		SERVO_GPIO_Init();
		SERVO_PWM_Init();
 
	while(1)
	{
		TIM3->CCR1	= 600;
		Delay(700);
		TIM3->CCR1	= 1000;
		Delay(700);
		TIM3->CCR1	= 1500;
		Delay(700);	
		TIM3->CCR1	= 2000;
		Delay(700);	
		TIM3->CCR1	= 2200;
		Delay(700);	
	}		
 
}

 

 

DİPNOT:

system_stm32f4xx.c dosyasında ki PLL değerleri;

SystemCoreClock = 168000000;

PLL_M = 8

PLL_Q = 7

PLL_N = 336 olarak ayarlanmalı,neden diye soracak olursanız,

168.000.000= PLL_VCO / 2 işlemine göre PLL_VCO = 336.000.000 olur.

PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N , PLL_N default olarak seçilirse PLL_M 8 olur

(system_stm32f4xx.c dosyası  253.satırdan itibaren bakabilirsiniz)

 

► FPGA ile Servo motor kullanımı için : http://www.vhdl.club/2016/02/29/vhdl-ile-pwm-olusturup-servo-motor-surme/

 

UYARI : Datasheetleri incelemeyi unutmayalım…

Yorum

  1. By Mehmet Ali Küçük

    Cevapla

  2. By Mehmet

    Cevapla

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir