Picproje Elektronik Sitesi

PICPROJE PROGRAMLAMA DERSLERİ => STM32 Örnekleri => Konuyu başlatan: mstfylmz38 - 03 Nisan 2015, 14:01:37

Başlık: Servo motorun açısı 120 yi aşmıyor .
Gönderen: mstfylmz38 - 03 Nisan 2015, 14:01:37
Aşağıda kodları vereceğim , bu değerlerde servo motor sürmeye çalışıyorum Savöx SC-0352 ve ayrıca başka servoları da denedim aynı sorunla karşılaştım . Servonun açısı 180 e yaklaşmıyor maksimum 120 derecelerde kalıyor .STM32F429 ile sürmeyi denedim .

   

#ifndef TM_DEFINES_H
#define TM_DEFINES_H

#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);

#endif

#include "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;  //hesapta bulduğumuz ARR değeri ,Hassasiyetitesi :)
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"
#include "Servo.h"

int motor1;
int motor2;

void delay(){
int a;
for (a = 0; a < 0x000AFFFF; ++a) ;
}

int main()
{
SERVO_GPIO_Init();
SERVO_PWM_Init();

uint8_t motor1[2]={RC_MIN_VALUE,RC_MAX_VALUE};
//uint8_t motor2[7]={10,15,20,25,30,35,40};

while(1)
{
RC_SERVO1_VALUE=motor1[0];
delay();
RC_SERVO1_VALUE=motor1[1];
delay();

}
}




Başlık: Ynt: Servo motorun açısı 120 yi aşmıyor .
Gönderen: namso0632 - 08 Nisan 2015, 22:33:30
Delay süresi motorun dönmesine izin vermiyor olabilir. Aynı sorunla bende karşılaşmıştım süreyi bir artır istersen. Aynı zamanda debug yaparak da gözlemleyebilirsin motorun dönüş açısını.