RC Servo.

RcServo
RcServo

RC Servo, malum olduğu üzere 20ms lik peryottan (50HZ)oluşan ve 1-2ms duty cycle ile dönüş açısını değiştire bildiğimiz bir çeşit mekanik eleman. Genelde RC yani Remote Control lü modellerde kullanıldığından bu ismi almıştır.
3 pini mevcuttur bunlar +5v, Gnd ve signal. Bu çalışmamızda stm32f4 discovery ve CoIDE kullanacağız. TIMER3 modülünü PWM üretecek şekilde uyarlayarak Servonun kontrolünü yapacağız.
Ben iki adet servoyu kontrol ederek elimde bulunan PAN-TILT mekanizmasını kullanacağım.  PAN-TILT mekanizmasını RC Uçak da kameranın yönünü değiştirmek için kullanmış ve hobbyking den almıştım. Yandaki şekilde bir RC servonun çalışması için gerekli olan sinyal görülmektedir. PWM in nasıl oluşturulduğuna Timer ın nasıl kurulduğuna değinmeyecek (önceki konularda oldukça bahsedildi.) Burada işini bilmeyen öğretmenler gibi oldum değil mi ? kodları vereceğim. Kodlar optimize değildir. hatalar olabilir ama fikir vermesi açısından yararlı olacağını düşünüyorum

 

	#include "stm32f4xx.h"
	#include "stm32f4xx_gpio.h"
	#include "stm32f4xx_rcc.h"
	#include "misc.h"
	#include "stm32f4xx_tim.h"
	#include "RC_Servo.h"
int Yatay;
int Dikey;
	int main()
	{
		SERVO_GPIO_Init();
		SERVO_PWM_Init();
	while(1)
	{
		for (Yatay = RC_MIN_VALUE; Yatay < RC_MAX_VALUE; ++Yatay) {
			for (Dikey =RC_MIN_VALUE; Dikey < RC_MAX_VALUE; Dikey=Dikey+5) {
				int a;
				for (a = 0; a < 0x000AFFFF; ++a) {
				}
				RC_SERVO1_VALUE = Dikey;
				RC_SERVO2_VALUE	= Yatay;
			}
		}
	}
	}

 

#include "RC_Servo.h"
	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
	TIM_OCInitTypeDef TIM_OCInitStructure;
	uint16_t CCR1_Val = 0;
	uint16_t CCR2_Val = 0;
	uint16_t CCR3_Val = 0;
	uint16_t CCR4_Val = 0;
	uint16_t PrescalerValue = 0;
	void SERVO_PWM_Init(void)
	{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
	PrescalerValue =(uint16_t) (SystemCoreClock  / 8000000)-1;//3
	TIM_TimeBaseStructure.TIM_Period=400;
	TIM_TimeBaseStructure.TIM_Prescaler=839;//PrescalerValue;
	TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
	TIM_TimeBaseStructure.TIM_ClockDivision=0;
	TIM_TimeBaseInit(RC_SERVO_PWM_TIMER,&TIM_TimeBaseStructure);
	TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
	TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_Pulse=CCR1_Val;//CCR1_Val;
	TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
	TIM_OC1Init(RC_SERVO_PWM_TIMER,&TIM_OCInitStructure);
	TIM_OC1PreloadConfig(RC_SERVO_PWM_TIMER,TIM_OCPreload_Enable);
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_Pulse = CCR2_Val;
	TIM_OC2Init(RC_SERVO_PWM_TIMER, &TIM_OCInitStructure);
	TIM_OC2PreloadConfig(RC_SERVO_PWM_TIMER, TIM_OCPreload_Enable);
	TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_Pulse=CCR3_Val;
	TIM_OC3Init(RC_SERVO_PWM_TIMER,&TIM_OCInitStructure);
	TIM_OC3PreloadConfig(RC_SERVO_PWM_TIMER,TIM_OCPreload_Enable);
	TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_Pulse=CCR4_Val;
	TIM_OC4Init(RC_SERVO_PWM_TIMER,&TIM_OCInitStructure);
	TIM_OC4PreloadConfig(RC_SERVO_PWM_TIMER,TIM_OCPreload_Enable);
	TIM_ARRPreloadConfig(RC_SERVO_PWM_TIMER,ENABLE);
	TIM_Cmd(RC_SERVO_PWM_TIMER,ENABLE);
	}
	void SERVO_GPIO_Init(void)
	{
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE);
	GPIO_InitStructure.GPIO_Pin=RC_SERVO_PIN1 | RC_SERVO_PIN2 | RC_SERVO_PIN3 | RC_SERVO_PIN4;
	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(RC_SERVO_GPIO,&GPIO_InitStructure);
	GPIO_PinAFConfig(RC_SERVO_GPIO,GPIO_PinSource6,GPIO_AF_TIM3);
	GPIO_PinAFConfig(RC_SERVO_GPIO,GPIO_PinSource7,GPIO_AF_TIM3);
	GPIO_PinAFConfig(RC_SERVO_GPIO,GPIO_PinSource8,GPIO_AF_TIM3);
	GPIO_PinAFConfig(RC_SERVO_GPIO,GPIO_PinSource9,GPIO_AF_TIM3);
	}

 

	#include "stm32f4xx.h"
	#include "stm32f4xx_gpio.h"
	#include "stm32f4xx_rcc.h"
	#include "misc.h"
	#include "stm32f4xx_tim.h"
	#define RC_MAX_VALUE 40
	#define RC_MIN_VALUE 20
	#define	RC_SERVO_PWM_TIMER	TIM3
	#define RC_SERVO1_VALUE		RC_SERVO_PWM_TIMER->CCR1
	#define RC_SERVO2_VALUE		RC_SERVO_PWM_TIMER->CCR2
	#define RC_SERVO3_VALUE		RC_SERVO_PWM_TIMER->CCR3
	#define RC_SERVO4_VALUE		RC_SERVO_PWM_TIMER->CCR4
	#define RC_SERVO_PIN1		GPIO_Pin_6
	#define RC_SERVO_PIN2		GPIO_Pin_7
	#define RC_SERVO_PIN3		GPIO_Pin_8
	#define RC_SERVO_PIN4		GPIO_Pin_9
	#define RC_SERVO_GPIO	GPIOC
	void SERVO_GPIO_Init(void);
	void SERVO_PWM_Init(void);

Saygıyla..
 
Unuttum videoda aşağıda..

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

This site uses Akismet to reduce spam. Learn how your comment data is processed.

%d blogcu bunu beğendi: