
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
#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; } } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
#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); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#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..
[youtube https://www.youtube.com/watch?v=hQeCqgOplf4&w=420&h=315]
Ziyaretci : 4394