借用江协科技ppt学习一下
输出比较可以通过比较CNT与CCR寄存器值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波形。PWM波常常用来控制舵机和电机。
占空比变化步距:前一个占空比与当前占空比。
配置输出比较(PWM波):1、打开定时器和所用定时器通道OCx(x=1,2,3,4)所在的GPIO的时钟。 2、通道OCx所在的引脚GPIO配置 3、时基单元配置 4、输出比较单元配置TIM_OC2Init(TIM2, &TIM_OCInitStructure); 5、开启TIM定时器时钟
圈起来的对应功能是在输出停止时,强制置0/1》
配置TIMx_CHx_所在引脚的GPIO模式为复用开漏输出 ->定时器控制引脚输出PWM波
void PWM_Init(void)
{
/*开启时钟*/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //开启TIM2的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟
/*GPIO初始化*/
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure); //将PA1引脚初始化为复用推挽输出
//受外设控制的引脚,均需要配置为复用模式
/*配置时钟源*/
TIM_InternalClockConfig(TIM2); //TIM2为内部时钟
/*时基单元初始化*/
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; //时钟分频1
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
TIM_TimeBaseInitStructure.TIM_Period = 20000 - 1; //ARR
TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1; //PSC
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0; //重复计数器,高级定时器才用到
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure); //将结构体变量交给TIM_TimeBaseInit,配置TIM2的时基单元
/*输出比较初始化*/
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_OC2Init(TIM2, &TIM_OCInitStructure); //将结构体变量交给TIM_OC2Init,配置TIM2的输出比较通道2
TIM_Cmd(TIM2, ENABLE); //开启时钟
}
void PWM_SetCompare2(uint16_t Compare)
{
TIM_SetCompare2(TIM2, Compare); //设置CCR2的值
}
舵机要求PWM周期为20ms对应频率为50HZ,高电平宽度对应的是配置CCR控制占空比
根据公式选择填写PSC , ARR 数值 其中一个选择(PSC= 72 -1 , ARR=20000 -1)
CCR可以通过 TIM_SetCompare2(TIM2, Compare);修改占空比->修改舵机的角度
红线接5V,棕色接地,黄色接输出。
void PWM_SetCompare2(uint16_t Compare)
{
TIM_SetCompare2(TIM2, Compare); //设置CCR2的值
}
void Servo_SetAngle(float Angle)
{
PWM_SetCompare2(Angle / 180 * 2000 + 500); //设置占空比
//将角度线性变换,对应到舵机要求的占空比范围上
}
//然后可以直接通过调用Servo_SetAngle(角度数值)修改舵机角度
注意事项:TIM_OC2Init(TIM2, &TIM_OCInitStructure);—>TIM_SetCompare2(TIM2, Compare);
通道OC1、2、3、4分别各自对应SetCompare1、2、3、4
在stm32f103C8T6中PA0对应TIM2_CH1,CH1对应OC1 PA1对应TIM2_CH2,CH1对应OC2 PA2对应TIM2_CH3,CH1对应OC3 PA3对应TIM2_CH4,CH1对应OC4