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.

var quads_screen_width = document.body.clientWidth;
if ( quads_screen_width >= 1140 ) {
/* desktop monitors */
document.write('');
(adsbygoogle = window.adsbygoogle || []).push({});
}if ( quads_screen_width >= 1024  && quads_screen_width < 1140 ) {
/* tablet landscape */
document.write('');
(adsbygoogle = window.adsbygoogle || []).push({});
}if ( quads_screen_width >= 768  && quads_screen_width < 1024 ) {
/* tablet portrait */
document.write('');
(adsbygoogle = window.adsbygoogle || []).push({});
}if ( quads_screen_width < 768 ) {
/* phone */
document.write('');
(adsbygoogle = window.adsbygoogle || []).push({});
}
 
 
 
 
 
 
#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

    • By Oğuzhan Gültekin

      Cevapla

  2. By Mehmet

    Cevapla

  3. By jack94

    Cevapla

    • By Oğuzhan Gültekin

      Cevapla

Bir Cevap Yazın

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