STM32 TIM

STM32标准库学习笔记-STM32 TIM

TIM简介

  • TIM(Timer)定时器
  • 定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断
  • 16位计数器、预分频器、自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时
  • 不仅具备基本的定时中断功能,而且还包含内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等多种功能
  • 根据复杂度和应用场景分为了高级定时器、通用定时器、基本定时器三种类型

实际外设: STM32F103C8T6定时器资源:TIM1、TIM2、TIM3、TIM4

类型 编号 总线 功能
高级定时器 TIM1、TIM8 APB2 拥有通用定时器全部功能,并额外具有重复计数器、死区生成、互补输出、刹车输入等功能
通用定时器 TIM2、TIM3、TIM4、TIM5 APB1 拥有基本定时器全部功能,并额外具有内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等功能
基本定时器 TIM6、TIM7 APB1 拥有定时中断、主模式触发DAC的功能

TIM结构

主要结构

  1. 预分频器 PSC
  2. 计数器 CNT
  3. 自动重装器 ARR
  4. 重复计数器 REP

高级定时器

通用定时器

基本定时器

定时器中断结构

定时器的触发模式

  1. 内部时钟触发:CK_INT
  2. 外部时钟触发(外部时钟模式2):ETR
  3. 从模式触发(外部时钟模式1):TRGI
  4. 编码器接口触发:TI1FP1&TI2FP2

时基单元

预分频器

计数器计数频率:

$$ CK_{CNT}=\frac{CK_{PSC}}{PSC+1} $$

计数器

计数器溢出频率:

$$ CK_{CNT_{OV}}=\frac{CK_{CNT}}{ARR+1} $$$$ CK_{CNT_{OV}}=\frac{CK_{PSC}}{(PSC+1)(ARR+1)} $$

ARPE=0时,TIMx_ARR无预装入。ARR值即刻生效(不建议) ARPE=1时,TIMx_ARR有预装入。ARR值在下次重装时生效

代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
//开启时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

//配置TIM2为内部时钟
TIM_InternalClockConfig(TIM2);

//时基单元初始化
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_Period = 10000 - 1;
TIM_TimeBaseInitStructure.TIM_Prescaler = 7200 - 1;
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);

//中断配置
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);

//NVIC配置
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_Init(&NVIC_InitStructure);

//使能定时器
TIM_Cmd(TIM2, ENABLE);

//中断函数
void TIM2_IRQHandler(void)
{
    if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
    {
      
        TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
    }
}

配置TIM时钟

  1. 选择内部时钟( INT ):void TIM_InternalClockConfig(TIM_TypeDef* TIMx);
  2. 选择其他定时器( ITRx ):void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);
  3. 选择外部引脚( TIx ):void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource, uint16_t TIM_ICPolarity, uint16_t ICFilter);
  4. 选择外部时钟( ETR )
    1. 模式1( TRGI ):void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);
    2. 模式2:void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);

主要参数:

  • TIMx为TIM编号
  • TIM_InputTriggerSource为输入定时器源
  • TIM_TIxExternalCLKSource为外部输入引脚
  • TIM_ICPolarity为外部引脚极性选择
  • ICFilter为外部引脚滤波器:0x0-0xF
  • TIM_ExtTRGPrescaler为外部时钟预分频器
  • TIM_ExtTRGPolarity为外部时钟极性
  • ExtTRGFilter为外部时钟滤波器:0x0-0xF
TIM_InputTriggerSource 描述
TIM_TS_ITR0 ((uint16_t)0x0000) TIM内部触发0
TIM_TS_ITR1 ((uint16_t)0x0010) TIM内部触发1
TIM_TS_ITR2 ((uint16_t)0x0020) TIM内部触发2
TIM_TS_ITR3 ((uint16_t)0x0030) TIM内部触发3
TIM_TIxExternalCLKSource 描述
TIM_TS_TI1FP1 ((uint16_t)0x0050) TIMIC1连接TI1(即使用TIMx_CH1)
TIM_TS_TI2FP2 ((uint16_t)0x0060) TIMIC2连接TI2(即使用TIMx_CH2)
TIM_TS_TI1F_ED ((uint16_t)0x0040) TIMIC1连接TI1,使用边缘检测
TIM_ExtTRGPrescaler 描述
TIM_ExtTRGPSC_OFF ((uint16_t)0x0000) TIM ETRP 不分频
TIM_ExtTRGPSC_DIV2 ((uint16_t)0x1000) TIM ETRP 二分频
TIM_ExtTRGPSC_DIV4 ((uint16_t)0x2000) TIM ETRP 四分频
TIM_ExtTRGPSC_DIV8 ((uint16_t)0x3000) TIM ETRP 八分频
TIM_ICPolarity 描述
TIM_ICPolarity_Rising ((uint16_t)0x0000) 上升沿有效
TIM_ICPolarity_Falling ((uint16_t)0x0002) 下降沿有效
TIM_ICPolarity_BothEdge ((uint16_t)0x000A) 双边缘有效
TIM_ICPolarity 描述
TIM_ExtTRGPolarity_Inverted ((uint16_t)0x8000) 极性翻转,低电平或下降沿有效
TIM_ExtTRGPolarity_NonInverted ((uint16_t)0x0000) 极性不翻转,高电平或上升沿有效

配置时基单元

  1. TIM_ClockDivision为时钟分频,与预分频器作用类似,但作用有限
  2. TIM_CounterMode为计数方式
  3. TIM_Period为自动重装值( ARR )
  4. TIM_Prescaler为预分频系数( PSC )
  5. TIM_RepetitionCounter为重复计数值( REP ,仅高级定时器有效)
TIM_ClockDivision 描述
TIM_CKD_DIV1 ((uint16_t)0x0000) 不分频
TIM_CKD_DIV2 ((uint16_t)0x0100) 二分频
TIM_CKD_DIV4 ((uint16_t)0x0200) 四分频
TIM_CounterMode 描述
TIM_CounterMode_Up ((uint16_t)0x0000) 向上计数模式
TIM_CounterMode_Down ((uint16_t)0x0010) 向下计数模式
TIM_CounterMode_CenterAligned1 ((uint16_t)0x0020) 中心对齐计数模式,向下计数时匹配
TIM_CounterMode_CenterAligned2 ((uint16_t)0x0040) 中心对齐计数模式,向上计数时匹配
TIM_CounterMode_CenterAligned3 ((uint16_t)0x0060) 中心对齐计数模式,匹配所有

配置中断

  • 在初始化时基单元后,会产生一个更新事件来装入自动重装值。因此需要用 TIM_ClearFlag清除中断标志位(当使用更新中断时)
  • 定时器能产生多种中断,需要用 TIM_ITConfig配置
TIM_IT 描述
TIM_IT_Update ((uint16_t)0x0001) 更新中断,计数器向上溢出/向下溢出,计数器初始化
TIM_IT_CC1 ((uint16_t)0x0002) 捕获/比较中断,CH1
TIM_IT_CC2 ((uint16_t)0x0004) 捕获/比较中断,CH2
TIM_IT_CC3 ((uint16_t)0x0008) 捕获/比较中断,CH3
TIM_IT_CC4 ((uint16_t)0x0010) 捕获/比较中断,CH4
TIM_IT_Trigger ((uint16_t)0x0040) 触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)

输出比较

  • OC(Output Compare)输出比较
  • 输出比较可以通过比较CNT与CCR寄存器值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波形
  • 每个高级定时器和通用定时器都拥有4个输出比较通道
  • 高级定时器的前3个通道额外拥有死区生成和互补输出的功能

模式 描述
冻结 CNT=CCR时,REF保持为原状态
匹配时置有效电平 CNT=CCR时,REF置有效电平
匹配时置无效电平 CNT=CCR时,REF置无效电平
匹配时电平翻转 CNT=CCR时,REF电平翻转
强制为无效电平 CNT与CCR无效,REF强制为无效电平
强制为有效电平 CNT与CCR无效,REF强制为有效电平
PWM模式1 向上计数:CNT<CCR时,REF置有效电平,CNT≥CCR时,REF置无效电平<br>向下计数:CNT>CCR时,REF置无效电平,CNT≤CCR时,REF置有效电平
PWM模式2 向上计数:CNT<CCR时,REF置无效电平,CNT≥CCR时,REF置有效电平<br>向下计数:CNT>CCR时,REF置有效电平,CNT≤CCR时,REF置无效电平

以PWM模式1向上计数为例:

  • PWM频率:
$$ Freq=\frac{CK_{PSC}}{(PSC+1)(ARR+1)} $$
  • PWM占空比:
$$ Duty=\frac{CCR}{ARR+1} $$
  • PWM分辨率:
$$ Reso=\frac{1}{ARR+1} $$

代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
//开启时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

//GPIO初始化
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);

//时钟配置
TIM_InternalClockConfig(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;
TIM_TimeBaseInitStructure.TIM_Prescaler = 720 - 1;
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;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OC1Init(TIM2, &TIM_OCInitStructure);

//使能定时器
TIM_Cmd(TIM2, ENABLE);

//CCR设置函数
void PWM_SetCompare1(uint16_t Compare)
{
    TIM_SetCompare1(TIM2, Compare);
}

//ARR设置函数
void PWM_SetAutoreload(uint16_t Autoreload)
{
    TIM_SetAutoreload(TIM2, Autoreload);
}

//PSC设置函数
void PWM_SetPrescaler(uint16_t Prescaler)
{
    TIM_PrescalerConfig(TIM2, Prescaler, TIM_PSCReloadMode_Update);
}

TIM_OCInitTypeDef为输出比较配置结构体

  1. TIM_OCStructInit函数为结构体赋默认值(特别)
  2. TIM_SetComparex函数能设置CCRx寄存器值
  3. TIM_SetAutoreload函数能设置ARR寄存器值
  4. TIM_PrescalerConfig函数能设置PSC寄存器值:
  • TIM_PSCReloadMode_Immediate立即生效
  • TIM_PSCReloadMode_Update更新事件后生效
  1. TIM_OCxInit函数能配置OCx通道
  2. TIM_OCMode为输出比较模式
  3. TIM_OCPolarity为输出极性:TIM_OCPolarity_High正常,TIM_OCPolarity_Low翻转
  4. TIM_OutputState为输出使能:TIM_OutputState_Enable开启,TIM_OutputState_Disable关闭
  5. TIM_Pulse为CCR初始值
TIM_OCMode 描述
TIM_OCMode_Timing ((uint16_t)0x0000) 冻结
TIM_OCMode_Active ((uint16_t)0x0010) 匹配时置有效电平
TIM_OCMode_Inactive ((uint16_t)0x0020) 匹配时置无效电平
TIM_OCMode_Toggle ((uint16_t)0x0030) 匹配时电平翻转
TIM_OCMode_PWM1 ((uint16_t)0x0060) PWM模式1
TIM_OCMode_PWM2 ((uint16_t)0x0070) PWM模式2

输入捕获

  • IC(Input Capture)输入捕获
  • 输入捕获模式下,当通道输入引脚出现指定电平跳变时,当前CNT的值将被锁存到CCR中,可用于测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参
  • 每个高级定时器和通用定时器都拥有4个输入捕获通道
  • 可配置为PWMI模式,同时测量频率和占空比
  • 可配合主从触发模式,实现硬件全自动测量

频率测量

  1. 测频法:在闸门时间T内,对上升沿计次,得到N,则频率

    $$ f_x = \frac{N}{T} $$
  2. 测周法:两个上升沿内,以标准频率fc计次,得到N ,则频率

    $$ f_x = \frac{f_c}{N} $$
  3. 中界频率:测频法与测周法误差相等的频率点

    $$ f_m = \sqrt\frac{f_c}{T} $$

PWMI(测周法)

代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
//配置时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

//配置GPIO
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

//配置定时器
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 = 65536 - 1;
TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1;
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);

//配置捕获通道
TIM_ICInitTypeDef TIM_ICInitStructure;
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
TIM_ICInitStructure.TIM_ICFilter = 0xF;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_PWMIConfig(TIM3, &TIM_ICInitStructure);
    //TIM_ICInit(TIM3, &TIM_ICInitStructure);

//配置从模式
TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1);
TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);

//使能定时器
TIM_Cmd(TIM3, ENABLE);

//获取频率
uint32_t IC_GetFreq(void)
{
    return 1000000 / (TIM_GetCapture1(TIM3) + 1);
}

//获取占空比
uint32_t IC_GetDuty(void)
{
    return (TIM_GetCapture2(TIM3) + 1) * 100 / (TIM_GetCapture1(TIM3) + 1);
}

TIM_ICInitTypeDef为输入捕获配置结构体

  1. TIM_Channel为输入通道:TIM_Channel_x(x=1,2,3,4)
  2. TIM_ICFilter为输入滤波器:0x0-0xF
  3. TIM_ICPolarity为输入极性选择
  4. TIM_ICPrescaler为预分频配置
  5. TIM_ICSelection为信号交叉选择
  6. TIM_PWMIConfig函数会对另一通道进行相应配置,TIM_ICInit函数只会配置当前通道
  7. TIM_GetCapturex函数会获取CCRx寄存器的值

计算占空比时,对CCR1和CCR2的值+1的的操作可以避免除0,实际值应为

$$ val_1=CCR1+0.5\quad(\pm0.5) $$$$ val_2=CCR2+0.5\quad(\pm0.5) $$$$ Freq=\frac{CK_{PSC}}{(PSC+1)*val_1} $$$$ Duty=100\%*\frac{val_2}{val_1} $$

主从触发

从模式

1
2
TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1);
TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);
  • TIM_SelectInputTrigger函数用于配置从模式触发源
  • TIM_SelectSlaveMode函数用于配置从模式
TIM_InputTriggerSource 描述
TIM_TS_ITR0 ((uint16_t)0x0000) Internal Trigger 0
TIM_TS_ITR1 ((uint16_t)0x0010) Internal Trigger 1
TIM_TS_ITR2 ((uint16_t)0x0020) Internal Trigger 2
TIM_TS_ITR3 ((uint16_t)0x0030) Internal Trigger 3
TIM_TS_TI1F_ED ((uint16_t)0x0040) TI1 Edge Detector
TIM_TS_TI1FP1 ((uint16_t)0x0050) Filtered Timer Input 1
TIM_TS_TI2FP2 ((uint16_t)0x0060) Filtered Timer Input 2
TIM_TS_ETRF ((uint16_t)0x0070) External Trigger input
TIM_SlaveMode 描述
TIM_SlaveMode_Reset ((uint16_t)0x0004) Rising edge of the selected trigger signal (TRGI) re-initializes<br> the counter and triggers an update of the registers.
TIM_SlaveMode_Gated ((uint16_t)0x0005) The counter clock is enabled when the trigger signal (TRGI) is high.
TIM_SlaveMode_Trigger ((uint16_t)0x0006) The counter starts at a rising edge of the trigger TRGI.
TIM_SlaveMode_External1 ((uint16_t)0x0007) Rising edges of the selected trigger (TRGI) clock the counter.

主模式

1
2
TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable);
TIM_SelectOutputTrigger(TIM3, TIM_TRGOSource_Update);
  • TIM_SelectMasterSlaveMode函数用于使能主模式:
    • TIM_MasterSlaveMode_Enable开启
    • TIM_MasterSlaveMode_Disable关闭
  • TIM_SelectOutputTrigger函数用于配置触发源
TIM_TRGOSource 描述
TIM_TRGOSource_Reset ((uint16_t)0x0000) The UG bit in the TIM_EGR register is used as the trigger output (TRGO).
TIM_TRGOSource_Enable ((uint16_t)0x0010) The Counter Enable CEN is used as the trigger output (TRGO).
TIM_TRGOSource_Update ((uint16_t)0x0020) The update event is selected as the trigger output (TRGO).
TIM_TRGOSource_OC1 ((uint16_t)0x0030) The trigger output sends a positive pulse when the CC1IF flag is to be set, as soon as a capture or compare match occurs (TRGO).
TIM_TRGOSource_OC1Ref ((uint16_t)0x0040) OC1REF signal is used as the trigger output (TRGO).
TIM_TRGOSource_OC2Ref ((uint16_t)0x0050) OC2REF signal is used as the trigger output (TRGO).
TIM_TRGOSource_OC3Ref ((uint16_t)0x0060) OC3REF signal is used as the trigger output (TRGO).
TIM_TRGOSource_OC4Ref ((uint16_t)0x0070) OC4REF signal is used as the trigger output (TRGO).

编码器接口

  • Encoder Interface 编码器接口
  • 编码器接口可接收增量(正交)编码器的信号,根据编码器旋转产生的正交信号脉冲,自动控制CNT自增或自减,从而指示编码器的位置、旋转方向和旋转速度
  • 每个高级定时器和通用定时器都拥有1个编码器接口
  • 两个输入引脚借用了输入捕获的通道1和通道2

代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
//配置时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);            RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

//GPIO配置(配置CH1和CH2)
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

//时基单元配置
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;            
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_Period = 65536 - 1;
TIM_TimeBaseInitStructure.TIM_Prescaler = 1 - 1;
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);

//通道配置(配置CH1和CH2)
TIM_ICInitTypeDef TIM_ICInitStructure;
TIM_ICStructInit(&TIM_ICInitStructure);
TIM_ICInitStructure.TIM_ICFilter = 0xF;
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
TIM_ICInit(TIM3, &TIM_ICInitStructure);
TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
TIM_ICInit(TIM3, &TIM_ICInitStructure);

//配置编码器接口
TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);

//使能定时器
TIM_Cmd(TIM3, ENABLE);

int16_t Encoder_Get(void)
{
    // int16_t Temp;
    // Temp = TIM_GetCounter(TIM3);
    // TIM_SetCounter(TIM3, 0);
    // return Temp;
    return TIM_GetCounter(TIM3);
}
  • TIM_EncoderInterfaceConfig为编码器配置函数
  • TIM_ICxPolarity参数与通道配置重复
  • TIM_ICPolarity_Rising代表不反相,TIM_ICPolarity_Falling表示反相
TIM_EncoderMode 描述
TIM_EncoderMode_TI1 ((uint16_t)0x0001) Counter counts on TI1FP1 edge depending on TI2FP2 level.
TIM_EncoderMode_TI2 ((uint16_t)0x0002) Counter counts on TI2FP2 edge depending on TI1FP1 level.
TIM_EncoderMode_TI12 ((uint16_t)0x0003) Counter counts on both TI1FP1 and TI2FP2 edges depending on the level of the other input.
Licensed under CC BY-NC-SA 4.0
使用 Hugo 构建
主题 StackJimmy 设计