为什么我的舵机控制程序keil仿真波形没问题...下到板子上舵机就是不动

2019-07-20 22:00发布

#include "Servo_Config.h" 


static void GPIO_Config(void) 
{
  GPIO_InitTypeDef GPIO_InitStructure;

  
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC, ENABLE); 

  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(GPIOB, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;
GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 | GPIO_Pin_7;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}


static void NVIC_Config_PWM(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
  

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  
  NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

NVIC_InitStructure.NVIC_IRQChannel = TIM8_UP_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 4;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

}


static void TIM_Mode_Config(void)
{
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
TIM_OCInitTypeDef  TIM_OCInitStructure;


  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3 | RCC_APB1Periph_TIM2 | RCC_APB1Periph_TIM4, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 | RCC_APB2Periph_TIM8, ENABLE);

   
  TIM_TimeBaseStructure.TIM_Period = 299;        
  TIM_TimeBaseStructure.TIM_Prescaler = 7199;    
  TIM_TimeBaseStructure.TIM_ClockDivision = 0 ;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);

  
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;    
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = 0;  
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;    

  TIM_OC1Init(TIM2, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Disable);

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OC2Init(TIM2, &TIM_OCInitStructure);
  TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Disable);

  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = 0;
  TIM_OC3Init(TIM2, &TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Disable);

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OC4Init(TIM2, &TIM_OCInitStructure);
TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Disable);


TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;    
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = 0;  
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;    

  TIM_OC1Init(TIM3, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Disable);

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OC2Init(TIM3, &TIM_OCInitStructure);
  TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Disable);

  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = 0;
  TIM_OC3Init(TIM3, &TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Disable);

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OC4Init(TIM3, &TIM_OCInitStructure);
TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Disable);


TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;    
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = 0;  
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;    

  TIM_OC1Init(TIM4, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Disable);

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OC2Init(TIM4, &TIM_OCInitStructure);
  TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Disable);

  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = 0;
  TIM_OC3Init(TIM4, &TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Disable);

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OC4Init(TIM4, &TIM_OCInitStructure);
TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Disable);



TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
  TIM_OCInitStructure.TIM_Pulse = 2000;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;
  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
  TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;

TIM_OC1Init(TIM1, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Disable);

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OC2Init(TIM1, &TIM_OCInitStructure);
  TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Disable);

  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = 0;
  TIM_OC3Init(TIM1, &TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Disable);

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OC4Init(TIM1, &TIM_OCInitStructure);
TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Disable);



TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
  TIM_OCInitStructure.TIM_Pulse = 0;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;
  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
  TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;

TIM_OC1Init(TIM8, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM8, TIM_OCPreload_Disable);

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OC2Init(TIM8, &TIM_OCInitStructure);
  TIM_OC2PreloadConfig(TIM8, TIM_OCPreload_Disable);
 






  /* TIM3 enable counter */
  TIM_Cmd(TIM2, ENABLE);                  
TIM_Cmd(TIM3, ENABLE); 
TIM_Cmd(TIM4, ENABLE); 
TIM_Cmd(TIM1, ENABLE); 
TIM_Cmd(TIM8, ENABLE); 
  TIM_CtrlPWMOutputs(TIM1,ENABLE);
TIM_CtrlPWMOutputs(TIM8,ENABLE);

TIM_ITConfig(TIM2,TIM_IT_CC1 | TIM_IT_CC2 | TIM_IT_CC3 | TIM_IT_CC4, ENABLE);
TIM_ITConfig(TIM3,TIM_IT_CC1 | TIM_IT_CC2 | TIM_IT_CC3 | TIM_IT_CC4, ENABLE);
  TIM_ITConfig(TIM4,TIM_IT_CC1 | TIM_IT_CC2 | TIM_IT_CC3 | TIM_IT_CC4, ENABLE);
  TIM_ITConfig(TIM1,TIM_IT_CC1 | TIM_IT_CC2 | TIM_IT_CC3 | TIM_IT_CC4, ENABLE);
  TIM_ITConfig(TIM8,TIM_IT_CC1 | TIM_IT_CC2, ENABLE);


NVIC_Config_PWM();

}



void Servo_Init(void)
{
GPIO_Config();
TIM_Mode_Config();
}
中断处理函数:(其中一个)
void TIM2_IRQHandler(void)
{


if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)
  {

TIM2->CCR1 = Servo_Pwm_Duty[0];
TIM_ClearITPendingBit (TIM2, TIM_IT_CC1);
}

if (TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET)
  {

TIM2->CCR2 = Servo_Pwm_Duty[1];
TIM_ClearITPendingBit (TIM2, TIM_IT_CC2);
}

if (TIM_GetITStatus(TIM2, TIM_IT_CC3) != RESET)
  {

TIM2->CCR3 = Servo_Pwm_Duty[2];
TIM_ClearITPendingBit (TIM2, TIM_IT_CC3);
}

if (TIM_GetITStatus(TIM2, TIM_IT_CC4) != RESET)
  {

TIM2->CCR4 = Servo_Pwm_Duty[3];
TIM_ClearITPendingBit (TIM2, TIM_IT_CC4);
  }
}
主函数:
#include "stm32f10x.h"
#include "Servo_Config.h"

extern void Servo_Init(void);
extern void Delay_10us(__IO u32 nTime);

int x,y,z;
u16 Servo_Pwm_Duty[] = {13,20,15,13,20,15,13,20,15,13,20,15,13,20,15,13,20,15};

int main(void)
{

Servo_Init();
  
while(1)  
{
    
for(y=0;y<=1;y=y+0.05)
{

Servo_Pwm_Duty[0]=13;
Servo_Pwm_Duty[1]=20;
   Servo_Pwm_Duty[2]=19;
Servo_Pwm_Duty[3]=13;
Servo_Pwm_Duty[4]=19+y;
   Servo_Pwm_Duty[5]=15;
Servo_Pwm_Duty[6]=13;
Servo_Pwm_Duty[7]=19+y;
   Servo_Pwm_Duty[8]=14;
Servo_Pwm_Duty[9]=13;
Servo_Pwm_Duty[10]=20;
   Servo_Pwm_Duty[11]=14;
Servo_Pwm_Duty[12]=13;
Servo_Pwm_Duty[13]=20;
   Servo_Pwm_Duty[14]=15;
Servo_Pwm_Duty[15]=13;
Servo_Pwm_Duty[16]=19+y;
   Servo_Pwm_Duty[17]=19;
Delay_10us(1);
}
for(x=0,y=0,z=0;x<=2&&y<=1&&z<=4;x=x+0.02,y=y+0.01,z=z+0.04)
{

Servo_Pwm_Duty[0]=13;
Servo_Pwm_Duty[1]=20-y;
   Servo_Pwm_Duty[2]=19-z;
Servo_Pwm_Duty[3]=13;
Servo_Pwm_Duty[4]=20;
   Servo_Pwm_Duty[5]=15-z;
Servo_Pwm_Duty[6]=13;
Servo_Pwm_Duty[7]=20;
   Servo_Pwm_Duty[8]=14+x;
Servo_Pwm_Duty[9]=13;
Servo_Pwm_Duty[10]=20-y;
   Servo_Pwm_Duty[11]=14+x;
Servo_Pwm_Duty[12]=13;
Servo_Pwm_Duty[13]=20-y;
   Servo_Pwm_Duty[14]=15-z;
Servo_Pwm_Duty[15]=13;
Servo_Pwm_Duty[16]=20;
   Servo_Pwm_Duty[17]=19-z;
Delay_10us(1);
}

 for(y=0;y<=1;y=y+0.05)
{

Servo_Pwm_Duty[0]=13;
Servo_Pwm_Duty[1]=19+y;
   Servo_Pwm_Duty[2]=15;
Servo_Pwm_Duty[3]=13;
Servo_Pwm_Duty[4]=20;
   Servo_Pwm_Duty[5]=11;
Servo_Pwm_Duty[6]=13;
Servo_Pwm_Duty[7]=20;
   Servo_Pwm_Duty[8]=16;
Servo_Pwm_Duty[9]=13;
Servo_Pwm_Duty[10]=19+y;
   Servo_Pwm_Duty[11]=16;
Servo_Pwm_Duty[12]=13;
Servo_Pwm_Duty[13]=19+y;
   Servo_Pwm_Duty[14]=11;
Servo_Pwm_Duty[15]=13;
Servo_Pwm_Duty[16]=20;
   Servo_Pwm_Duty[17]=15;
Delay_10us(1);
}

for(x=0,y=0,z=0;x<=2&&y<=1&&z<=4;x=x+0.02,y=y+0.01,z=z+0.04)
{

Servo_Pwm_Duty[0]=13;
Servo_Pwm_Duty[1]=20;
   Servo_Pwm_Duty[2]=15+z;
Servo_Pwm_Duty[3]=13;
Servo_Pwm_Duty[4]=20-y;
   Servo_Pwm_Duty[5]=11+z;
Servo_Pwm_Duty[6]=13;
Servo_Pwm_Duty[7]=20-y;
   Servo_Pwm_Duty[8]=16-x;
Servo_Pwm_Duty[9]=13;
Servo_Pwm_Duty[10]=20;
   Servo_Pwm_Duty[11]=16-x;
Servo_Pwm_Duty[12]=13;
Servo_Pwm_Duty[13]=20;
   Servo_Pwm_Duty[14]=11+z;
Servo_Pwm_Duty[15]=13;
Servo_Pwm_Duty[16]=20-y;
   Servo_Pwm_Duty[17]=15+z;
Delay_10us(1);
}
}

}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。