0.5ms---------0度
0.6ms---------9度
0.7ms---------18度
0.8ms---------27度
0.9ms---------36度
1.0ms---------45度
1.1ms---------54度
1.2ms---------63度
1.3ms---------72度
1.4ms---------81度
1.5ms---------90度
1.6ms---------99度
1.7ms---------108度
1.8ms---------117度
1.9ms---------126度
2.0ms---------135度
2.1ms---------144度
2.2ms---------153度
2.3ms---------162度
2.4ms---------171度
2.5ms---------180度
\ | /
\---|---/
\ | /
\ | /
\|/
--------------------------------------------------------------
20ms的时基脉冲,如果想让舵机转63度,就应该发生一个高电平为1.2ms,
周期为20ms的方波,duty=1.2/20=6% ,而定时器自动重装载寄存器arr的值
为 1000 ,所以令duty=60,时占空比才为60/1000=6%.
20ms的时基脉冲,如果想让舵机转90度,就应该发生一个高电平为1.5ms,
周期为20ms的方波,duty=1.5/20=7.5% ,而定时器自动重装载寄存器arr的值
为 1000 ,所以令duty=75,时占空比才为75/1000=7.5%.
20ms的时基脉冲,如果想让舵机转126度,就应该发生一个高电平为1.9ms,
周期为20ms的方波,duty=1.9/20=9.5% ,而定时器自动重装载寄存器arr的值
为 1000 ,所以令duty=95,时占空比才为95/1000=9.5%.
-----------------------------------------------------------------
void SERVO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
TIM_TimeBaseInitTypeDef TIM_TimeStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;//配置为复用推挽输出
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_7;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
TIM_TimeStructure.TIM_Period=1000;//1000 自动重装载寄存器的值,周期为50 000Hz/1000=50Hz,即输出PWM波形的频率为20ms。
TIM_TimeStructure.TIM_Prescaler=1440-1;;// 1400 时钟预分频系数为3600,72 000 000Hz/1400=50000Hz =50KHZ。
TIM_TimeStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeStructure.TIM_RepetitionCounter=0;
TIM_TimeBaseInit(TIM3,&TIM_TimeStructure);
TIM_ARRPreloadConfig(TIM3,ENABLE); //使能ARR预装载寄存器(影子寄存器)
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_OC2Init(TIM3,&TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);
TIM_Cmd(TIM3,ENABLE);
TIM_CtrlPWMOutputs(TIM3,ENABLE);
}
//舵机角度控制
void SERVO_Angle_Control(uint16_t Compare2)
{
TIM_SetCompare2(TIM3,Compare2);//设置通道2为可变的pwm
}
|