ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

STM32-TIM 02

STM32-TIM 02 定时器简介TIM定义对输入的时钟进行计数并在计数值达到设定值时触发中断TIM:时基单元16位计数器预分频器自动重装寄存器分类高级定时器 通用定时器 基本定时器计数模式 向上计数模式cnt arr溢出 向下计数 cnt arr - 0 溢出 中央对齐模式cnt arrcnt arr - 0注意中央对齐模式先向上计数再向下计数定时器溢出效应 更新中断 更新事件 影子寄存器更新将预装载寄存器的值立即更新到影子寄存器中包括ARR、PSC和比较值CCR 中心对齐模式计数器计数方向改变注意影子寄存器是实际起作用的寄存器预装载寄存器供读写定时器时钟源选择 内部时钟源系统时钟 外部时钟模式1 外部时钟模式2TIM2_ETR引脚注意stm32f103c8t6的TIM2_ETR引脚位PA0各时钟频率 基准计数时钟频率(内外时钟源) 计数器计数时钟频率(基准计数时钟分频后) 计数器溢出频率基准计数时钟/分频系数1/重装载值1定时器函数时基单元初始化函数函数使用 函数TIM_TimeBaseInit 入参定时器 结构体指针 返回值无注意 为了寄存器重载函数内部会让定时器产生一个更新事件同时伴随更新中断这样板子一上电定时器就会进入一次中断 措施调用TIM_ClearFlag(TIM2, TIM_IT_Flag);TIM_TimeBaseInitTypedef结构体成员 TIM_ClockDivision 配置滤波器时钟,对时基单元无影响 TIM_CKD_DIV1 / TIM_CKD_DIV2 / TIM_CKD_DIV4 TIM_CounterMode 计数器模式TIM_CounterMode_Up / TIM_CounterMode_Down TIM_Period ARR数值 TIM_Prescaler 预分频系数 TIM_RepetitionCounter 高级定时器控制更新中断的发生频率时基单元初始化函数调用示例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);定时器配置外部时钟模式2函数函数使用 函数TIM_ETRClockMode2Config 入参定时器 外部时钟分频 外部触发极性 外部触发滤波器 返回值无入参解析 外部时钟分频 TIM_ExtTRGPSC_OFF / TIM_ExtTRGPSC_DIV2 / TIM_ExtTRGPSC_DIV4 / TIM_ExtTRGPSC_DIV8 外部触发极性 TIM_ExtTRGPolarity_Inverted 上升沿触发 / TIM_ExtTRGPolarity_NonInverted 下降沿触发 外部触发滤波器外部触发滤波器函数调用示例TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0x0F);定时器中断使能函数函数使用 函数TIM_ITConfig 入参定时器 待使能的中断标志位 ENABLE/DISABLE 返回值无定时器中断使能函数调用示例TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);定时器使能函数函数使用 函数TIM_Cmd 入参定时器 ENABLE/DISABLE 返回值无定时器使能函数调用示例TIM_Cmd(TIM2, ENABLE);定时器查询CNT函数函数使用 函数TIM_GetCounter 入参定时器 返回值CNT值定时器使能函数调用示例uint16_t cnt TIM_GetCounter(TIM2);定时器标志位TIM_GetITStatus函数 TIM_IT_Update定时器产生更新中断定时器中断服务函数EXTI中断服务函数示例 void TIM2_IRQHandler(void) { if(TIM_GetITStatus(TIM2, TIM_IT_Update)) { //中断处理事件 TIM_ClearITPendingBit(TIM2, TIM_IT_Update); } }定时器输出比较简介OC前置英文 OC:输出比较 IC:输入捕获 CCR:捕获/比较寄存器, OC:比较寄存器 IC:捕获寄存器OC定义通过比较CNT与CCR寄存器值的关系对输出电平进行置1置0操作用于输出一定占空比的PWM波OC模式PWM模式1PWM波 定义 配置不同占空比的PWM波等效模拟参量参数计算 周期定时器中断周期 占空比OC值 / ARR值 分辨率1 / ARR 1高级定时器PWM波 需调用PWM波输出使能函数TIM_CtrlPWMOutputs(TIM1, ENABLE);定时器输出比较函数OC初始化函数函数使用 函数:TIM_OC1Init 入参定时器 结构体指针 返回值返回值注意OC1借用TIM2_CH1输出TIM_OCInitTypedef结构体成员变量 TIM_OCMode PWM1模式 TIM_OCMode_PWM1 TIM_OCPolarity 输出极性 TIM_OCPolarity_High / TIM_OCPolarity_Low 输出高低电平取反 TIM_OutputState 输出使能 TIM_OutputState_Enable / TIM_OutputState_Disable TIM_Pulse OC值函数调用示例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_OC2Init(TIM2, TIM_OCInitStructure);输出比较模式修改OC值函数函数使用 函数TIM_SetCompare1 入参定时器 OC值 返回值无函数调用示例TIM_SetCompare1(TIM2, 33);定时器输入捕获简介IC前置测量频率的方法 测频法时基1s内的数波形有多少个上升沿波形数就是频率 测周发波形俩个上升沿按一定频率fc数N次fc/N就是频率IC定义通道输入引脚出现指定电平跳变时当前CNT的值将被锁存到CCR中IC通道 定时器输出比较与输入捕获共用4个通道OC1 OC2 OC3 OC4 IC1 IC2 IC3 IC4,同一通道输出比较与输入捕获不可同时进行输入捕获模式测频率 TIM2_CH1通道输入的PWM波给单片机的输入滤波器和边沿检测器得到TI1FP1信号再经过分频器进行分频每来一个触发信号CNT值锁存到CCR1中后清零根据CNT的驱动时钟频率fc得频率fc/CNT注意若fc频率过低可能导致CNT溢出输入捕获模式测PWM波频率占空比PWMI模式 TIM2_CH1通道输入的PWM波经过单片机的输入滤波器和边沿检测器得到TI1FP1与TI2FP2俩路信号 IC1配置为上升沿触发直连捕获TI1FP1上升沿IC2配置为下降沿触发交叉捕获TI1FP1下升沿 再经过分频器进行分频TI1FP1来一个上升沿CNT值锁存到CCR1中后清零TI2FP2来一个下降沿CNT锁存到CCR2中 根据CNT的驱动时钟频率fc得频率fc/CCR1 得占空比CCR2/CCR1注意TI1FP1与TI2FP2相同的信号只不过被不同的通道捕获 CCR1就是一个周期的计数值CCR2就是高电平的计数值定时器输入捕获函数输入捕获初始化函数函数使用 函数TIM_ICInit 入参定时器 结构体指针 返回值无TIM_ICInitTypedef结构体成员变量 TIM_Channel 选择IC通道 TIM_Channel_1 / TIM_Channel_2 / TIM_Channel_3 / TIM_Channel_4 TIM_ICFilter 触发锁存边沿 TIM_ICPolarity_Rising / TIM_ICPolarity_Falling / TIM_ICPolarity_BothEdgeTIM_ICPrescaler 捕获预分频选择不分频每次信号都触发捕获TIM_ICPSC_DIV1 / TIM_ICPSC_DIV2 / TIM_ICPSC_DIV4 / TIM_ICPSC_DIV8TIM_ICSelection 输入信号交叉与否 TIM_ICSelection_DirectTI 只测频率 / TIM_ICSelection_IndirectTI 测频率与占空比函数调用示例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_ICInit(TIM3, TIM_ICInitStructure);PWMI模式配置函数函数使用 函数TIM_PWMIConfig 入参定时器 结构体指针 返回值无注意仅支持通道1与通道2的配合使用函数调用示例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_PWMIConfig()内部会调用一次IC_init在配置通道1为上升沿触发、直连的同时会将通道2自动配置为下降沿触发并将其输入选择为“间接”从通道1获取信号以实现对同一PWM信号周期和脉宽的测量。输入触发源选择函数函数使用 函数TIM_SelectInputTrigger 入参定时器 输入触发源 返回值无函数调用示例TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1); TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);从模式选择函数函数使用 函数TIM_SelectSlaveMode 入参定时器 从模式 返回值无函数调用示例TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1); TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);注意前面TI1FP1配置为上升沿触发这里表示每来一个上升沿作为触发源都会引发从模式把CNT计数值清0CCR寄存器读取函数函数使用 函数TIM_GetCapture1 入参定时器 返回值CCR值函数调用示例uint16_t ccr TIM_GetCapture1(TIM3);定时器输入捕获模块函数void IC_Init(void){ RCC_APB1PeriphClockCmd//开启TIM3的时钟 RCC_APB2PeriphClockCmd//开启GPIOA的时钟 GPIO_Init//将PA6引脚初始化为上拉输入 TIM_TimeBaseInit TIM_PWMIConfig TIM_SelectInputTrigger//触发源选择TI1FP1 TIM_SelectSlaveMode//从模式选择复位 TIM_Cmd }uint32_t IC_GetFreq(void){ return 1000000 / (TIM_GetCapture1(TIM3)); //测周法得到频率fx fc / N }uint32_t IC_GetDuty(void){ return (TIM_GetCapture2(TIM3) 1) * 100 / (TIM_GetCapture1(TIM3) 1); }定时器编码器接口编码器接口前置正交编码器 输出A B俩相波形俩个波形相位相差90度正转波形A相波形上升沿B相低电平A相波形下降沿B相高电平B相波形上升沿A相高电平B相波形下降沿A相低电平 反转波形A相波形上升沿B相高电平B相波形上升沿A相低电平A相波形下降沿B相低电平B相波形下降沿A相高电平编码器接口定义接收正交编码器信号通过定时器输入捕获的通道1与通道2输入到定时器编码器接口正转编码器接口控制CNT自增反转控制自减编码器接口资源 每一个高级定时器与通用定时器都有一个编码器接口工作模式 仅在TI1计数 仅在TI2计数 在TI1与TI2都计数定时器编码器接口函数编码器接口配置函数函数使用 函数TIM_EncoderInterfaceConfig 入参定时器 计数模式 A相波形极性 B相波形极性 返回值无参数解析 计数模式选择单相波形计数还是俩项波形都计数TIM_EncoderMode_TI1 / TIM_EncoderMode_TI2 / TIM_EncoderMode_TI12A相波形极性A相波形不反转 TIM_ICPolarity_Rising / A相波形反转 TIM_ICPolarity_Falling B相波形极性B相波形不反转 TIM_ICPolarity_Rising / B相波形反转 TIM_ICPolarity_Falling函数调用示例TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);定时器编码器接口模块函数int16_t Encoder_Get(void){ int16_t Temp; Temp TIM_GetCounter(TIM3); TIM_SetCounter(TIM3, 0); return Temp; }注意TIM_GetCounter函数返回的是uint16_t类型的数据范围0~65535 赋值给int16_t类型的数据范围-32768~32767TIM_GetCounter返回45678对应temp -19858俩者相减为65536隔一段时间取一次CNT值就代表编码器转速
返回列表