#include "servo.h" #include "Delay.h" void Servo_Init(void) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能TIM2时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIOA时钟 GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Pin =GPIO_Pin_4; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); //配置PA1,PA2为复用输出模式,输出速度为50MHZ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); //开启TIM2内部时钟 TIM_InternalClockConfig(TIM2); //配置TIM2 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; //时钟分频 TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //计数方式向上计数 TIM_TimeBaseInitStructure.TIM_Period = 100 - 1; //ARR 自动重装载值 TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1; //PSC 预分频器 TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0; // TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure); //输出通道配置 TIM_OCInitTypeDef TIM_OCInitStructure; TIM_OCStructInit(&TIM_OCInitStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//配置PWM模式1 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//有效极性为高电平 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 0; //CCR TIM_OC1Init(TIM2, &TIM_OCInitStructure); //初始化通道1 PA0 TIM_OC2Init(TIM2, &TIM_OCInitStructure); //初始化通道2 PA1 TIM_OC3Init(TIM2, &TIM_OCInitStructure); //初始化通道3 PA2 TIM_Cmd(TIM2, ENABLE); //使能定时器2 } void Rotate(u8 a,u8 b,u8 c) { TIM_SetCompare1(TIM2,a); TIM_SetCompare2(TIM2,b); TIM_SetCompare3(TIM2,c); } //修改通道2比较值 // TIM_SetCompare2(TIM2, Compare); //正转 void Rotate_clockwise(void) { Rotate(10,0,0); delay_ms(10); Rotate(10,10,0); delay_ms(10); Rotate(0,10,0); delay_ms(10); Rotate(0,10,10); delay_ms(10); Rotate(0,0,10); delay_ms(10); Rotate(10,0,10); } //反转 void Rotate_counterclockwise(void) { Rotate(0,10,0); delay_ms(10); Rotate(10,10,0); delay_ms(10); Rotate(10,0,0); delay_ms(10); Rotate(10,0,10); delay_ms(10); Rotate(0,0,10); delay_ms(10); Rotate(0,10,10); } //停止 void Rotate_stop(void) { Rotate(0,0,0); } //刹车 void Rotate_shache(void) { Rotate(3,0,0); }