#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);
}
}
}
一周热门 更多>