STM32输出比较之PWM驱动舵机

目录

  • 前言
  • 一、输出比较功能
    • 1. 输出比较通道的结构
    • 2. PWM配置方法
    • 3. PWM参数计算
  • 二、PWM驱动舵机实例
    • 1. 初始化函数
    • 2. 设置角度函数
  • 三、捕获/比较通道引脚
  • 四、舵机控制方法
  • 五、引脚重映射
  • 结语


前言

STM32可以通过定时器的输出比较功能产生PWM波来驱动舵机。本文将介绍定时器输出比较功能以及相关寄存器的配置方法,并以通用定时器TIM2的通道1为例,编写用于驱动舵机的初始化函数。

一、输出比较功能

OC (Output Compare) 输出比较,通过比较CNT与CCR寄存器值的关系,来对输出电平进行置1、清0或翻转的操作,如输出一定频率和占空比的PWM波形。每个高级定时器和通用定时器都拥有4个输出比较通道。

1. 输出比较通道的结构

下图是通用定时器的输出比较功能1个通道的结构框图,从图中可以看出CNT和CCR进行比较,输出模式控制器接受到信号后改变OC1ref (reference) 的电平信号,如果给输出使能,则信号通过CC1P的极性选择后从OC1引脚输出。
图中输出模式控制器可以选择多种模式控制输出的形式,如冻结、强制电平信号,电平翻转等模式,本文只涉及PWM模式,并以PWM1模式的向上计数方式编写实例程序
STM32输出比较之PWM驱动舵机_第1张图片
以下是PWM模式的比较输出方式 (有效无效电平可以看作高低电平):

  • PWM模式1:
    向上计数:CNT 向下计数:CNT>CCR时,REF置无效电平,CNT≤CCR时,REF置有效电平
  • PWM模式2:
    向上计数:CNT 向下计数:CNT>CCR时,REF置有效电平,CNT≤CCR时,REF置无效电平

2. PWM配置方法

下图是B站江科大制作的PWM基本结构框图,可以更清晰的看出与PWM输出相关的寄存器和波形的配置方法。
由折线图可以看出ARR的值决定PWM的周期,CRR的值决定PWM占空比。如果使用同一个定时器的不同通道,则ARR和PSC是相同的 (周期相同),而各自通道可以设定不同CCR的值 (占空比不同) 。
配置输出比较单元包括给CCR赋值,选择输出比较模式,选择极性使能,以及配置GPIO输出。
STM32输出比较之PWM驱动舵机_第2张图片

3. PWM参数计算

  • PWM频率:Freq = CK_PSC / (PSC + 1) / (ARR + 1)
  • PWM占空比:Duty = CCR / (ARR + 1)
  • PWM分辨率:Reso = 1 / (ARR + 1)

例如:输出频率为1KHz、占空比为50%、分辨率为1%的PWM波形,则 ARR + 1 = 100、CCR = 50、PSC + 1 = 720。(STM32内部时钟默认为72MHz。)

二、PWM驱动舵机实例

1. 初始化函数

舵机需要用周期为20ms (频率50Hz) 的PWM波驱动,可设ARR = 2000 - 1、PSC = 720 - 1 。以定时器TIM2的通道1为例,初始化代码如下:

void PWM_Init(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);	//开启TIM2外设时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	//开启GPIO外设时钟
	
	//配置PA0引脚为复用推挽输出,用于输出PWM信号(CH1对应PA0)
	GPIO_InitTypeDef GPIO_InitStructure;
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 	GPIO_Init(GPIOA, &GPIO_InitStructure);
 	
	//定时器配置,详细配置介绍参考文章---STM32定时器 http://t.csdn.cn/Ks4IC
	TIM_InternalClockConfig(TIM3);
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInitStructure.TIM_Period = 2000 - 1;	//ARR
	TIM_TimeBaseInitStructure.TIM_Prescaler = 720 - 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;	//输出比较模式为PWM1模式
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;	//输出比较为高极性,REF信号直接输出/高电平有效
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;	//输出使能
	TIM_OCInitStructure.TIM_Pulse = 50;			//CCR的值(16位), 占空比 = CCR/(ARR+1)
	TIM_OC1Init(TIM2, &TIM_OCInitStructure);	//初始化通道1
	
	TIM_Cmd(TIM2, ENABLE); //启动定时器
}

2. 设置角度函数

以上面初始化函数中ARR和PSC的值为例,舵机角度值为 0 ~ 180,CCR对应的数值为 50 ~ 250,则计算公式为

CCR = 角度 / 180 * 200 + 50

用以下函数可以根据角度值控制舵机:

void Servo_SetAngle(float Angle)
{
	TIM_SetCompare1(TIM2, Angle/180*200+50);	//修改CCR中的值
}

三、捕获/比较通道引脚

以下是STM32F103C8T6通用定时器的输出比较通道与引脚的复用功能和重映射功能的对应关系。其中重映射功能需要通过配置AFIO寄存器进行配置引脚的重映射。

  1. 默认复用功能
    PA0-WKUP —— TIM2_CH1_ETR
    PA1 ~ PA3 —— TIM2_CH2 ~ TIM2_CH4
    PA6 ~ PA7 —— TIM3_CH1 ~ TIM3_CH2
    PB0 ~ PB1 —— TIM3_CH3 ~ TIM3_CH4
    PB6 ~ PB9 —— TIM4_CH1 ~ TIM4_CH4
  2. 重映射功能
    PB10 ~ PB11 —— TIM2_CH3 ~ TIM2_CH4
    PA15 —— TIM2_CH1
    PB3 —— TIM2_CH2
    PB4 ~ PB5 —— TIM3_CH1 ~ TIM3_CH2

四、舵机控制方法

舵机根据输入信号线的PWM信号占空比 (高电平时长占周期时长的比例) 来控制舵机的输出角度,输入PWM周期为20ms,高电平宽度为0.5ms~2.5ms,对应 -90° ~ 90° 或 0 ~ 180°,如下图所示。
STM32输出比较之PWM驱动舵机_第3张图片

五、引脚重映射

以下代码可以将TIM2_CH1和TIM2_CH2重映射到PA15和PB3:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //开启AFIO外设时钟
GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2, ENABLE); //TIM2部分引脚重映射
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); //解除JTAG调试功能

说明:

  1. 由于PA15、PB3、PB4引脚默认为JTAG调试端口,所以需要在TIM2通道引脚重映射之后解除默认功能。如果默认功能为I/O口,就不需要解除。
  2. 如果重映射后没有输出,可将参数 GPIO_PartialRemap1_TIM2 部分重映射改为 GPIO_FullRemap_TIM2 将TIM2通道全部重映射。关于重映射详细介绍可查看参考手册。

结语

本文主要以输出比较单元为重点介绍,关于时钟源和时基单元的介绍和配置方法,以及通用定时器的详细结构可以参考文章STM32定时器介绍。更详细的视频教程可以观看B站 江协科技 的STM32入门教程。

你可能感兴趣的:(嵌入式,stm32,单片机,嵌入式硬件)