STM32f4/29i servo problemi

Başlatan sfiber, 11 Haziran 2014, 11:37:16

sfiber

merhaba arkadaşlar hepinize,bir proje için 10 adet mg996r aldım ve şu anda da elimde sg 90 servo bulunuyor.yalnız benim servo sürme konusunda bazı problemlerim var.Önce f4 de 84 mhz e göre ayar yapıp şu kodu verdim ve sg90 tam 0 derece yapıyor ve başka tepki vermiyor.kodum şu şekildedir.
#include "stm32f4_discovery.h"

uint16_t PrescalerValue;

TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;

void TIM_Config(void)
	{
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
	
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE);
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;
	GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
	
	GPIO_Init(GPIOC,&GPIO_InitStructure);
	
	
			
	GPIO_PinAFConfig(GPIOC,GPIO_PinSource6,GPIO_AF_TIM3);
		
	}

void PWM_Config(void)	
	{
	PrescalerValue=27;
	
	TIM_TimeBaseInitStructure.TIM_Period=59999;
	TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
	TIM_TimeBaseInitStructure.TIM_ClockDivision=0;
	TIM_TimeBaseInitStructure.TIM_Prescaler=PrescalerValue;
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);
		
	TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
	TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
	//TIM_OCInitStructure.TIM_Pulse=4500;
	TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;

	TIM_OC1Init(TIM3,&TIM_OCInitStructure);
	TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);
	
	TIM_ARRPreloadConfig(TIM3,ENABLE);
	TIM_Cmd(TIM3,ENABLE);		
	}

void delay(void)
	{
	uint16_t delay_time;
	for(delay_time=0;delay_time<0xFF00;delay_time++);
	}
	
uint16_t pwm_value=3000;	
int main(void)	
	{
	SystemInit();
	SystemCoreClockUpdate();
		
	TIM_Config();
	PWM_Config();
	while(1)
		{
		TIM3->CCR1=pwm_value;
		pwm_value=pwm_value+1;
		delay();	
		if(pwm_value==6000)
			{
			while(pwm_value>=3000)
				{
				pwm_value=pwm_value-1;
				delay();
				}
			}
		}
	}


benzer bir kod yazıp 429i de denedim.ama gene istediğim sonucu alamadım.lojik analizörle baktığımda değerlerdeki değişme tam istediğim gibi gerçekleişiyor ama sg 90 tam sağ yaparken 996r hareket etmiyor.Şu an elimde osiloskop olmadığından sinyal şeklini gözlemleyemiyorum ama true rms bir multimetreyle ölçdüğümde peak max ı 3 v olarak okuyorum.Daha sonra bu 3v sorun teşkil edebileceğini düşündüğümden opamplı bir devre kurdum ve output sinyalini 5v a çıkartmak için uğraştım ama gene aynı şekilde davrandı servolar.

En son olarak da ccs c de yazdığım şu kodu picle denedim.
#include <16f887.h>
#fuses nowdt,nobrownout,nocpd,noprotect
#use delay(clock=1M)
#use fast_io(c)

int16 a;

void main()
   {
   set_tris_C(0x00);
   output_C(0x00);
   setup_ccp1(ccp_pwm);
   setup_timer_2(t2_div_by_16,255,16);
   while(True)
      {
      for(a=250;a<511;a++);
         {
         set_pwm1_duty(a);
         delay_ms(50);
         }
      for(a=511;a>250;a--)
         {
         set_pwm1_duty(a);
         delay_ms(50);
         }
      }
   delay_ms(2000);
   }


ve iki servodada istediğim hareketi elde ettim.sizce benim problemim nerde olabilir.