TIM输入捕获
- 频率测量
- 输入捕获基本结构
- PWMI基本结构
- 主从触发模式
- 输入捕获测量频率
- PWMI测占空比
频率测量
输入捕获基本结构
CNT计数一个周期,转运到CCR1里面去,CNT=0
这时候CCR1=N
Fx=Fc/N Fc cnt的驱动时钟 这时候就可以得到频率 Fc=72M/PSC
PWMI基本结构
这里用到了两个CCR2 CCR2用来记录高电平时候的cnt 正好为总数的占空比
CCR2/CCR1 就是占空比
主从触发模式
输入捕获测量频率
由于我们是测量频率,是要修改频率的
我们之前都是修改占空比,修改的是CCR,这里不同
频率=72M/(PSC+1)/(ARR+1)
PSC 和 ARR都可以调节频率
但是占空比=CRR/ARR+1 ,如果调节ARR会影响到占空比
而通过PSC则不会影响占空比
单独修改PSC的函数为
void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode)
TIM2 PSC的值、重装模式(立刻,还是周期结束)
第一步 RCC开启时钟
GPIO 和 TIM的时钟打开
第二步 GPIO初始化,把GPIO配置成输入模式 一般是上拉输入
第三步 配置时基单元,让cnt计数器在内部时钟的驱动下自增运行
第四步 配置输入捕获单元包括滤波器,极性,直连通道,交叉通道,分频器这些参数
一个结构体
第五步 选择从模式的触发源 触发源选择为TI1FP1
第六步 选择触发之后执行的操作,执行reset操作
最后 调用 TIM_CMD 开启定时器
IC 输入捕获常用函数
TIM_ICInit 输入捕获的初始化函数 只可以1个通道 4选1 通用 结构体里区别
TIM_PWMIConfig 也是初始化 可以两个同时
TIM_OCStructInit 可以给输入捕获结构体一个初始值
TIM_SelectInputTrigger 选择触发源TRGI 从模式的触发源选择
TIM_SelectOutputTrigger 选择主模式输出的触发源
TIM_SelectSlaveMode 选择从模式配置四个 分频器
void TIM_SetIC1Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC);
void TIM_SetIC2Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC);
void TIM_SetIC3Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC);
void TIM_SetIC4Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC);
void TIM_SetClockDivision(TIM_TypeDef* TIMx, uint16_t TIM_CKD);输出比较下 CCR只写
void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1);
void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2);
void TIM_SetCompare3(TIM_TypeDef* TIMx, uint16_t Compare3);
void TIM_SetCompare4(TIM_TypeDef* TIMx, uint16_t Compare4);输入捕获下 CCR只读
分别读取四个通道的CCR
uint16_t TIM_GetCapture1(TIM_TypeDef* TIMx);
uint16_t TIM_GetCapture2(TIM_TypeDef* TIMx);
uint16_t TIM_GetCapture3(TIM_TypeDef* TIMx);
uint16_t TIM_GetCapture4(TIM_TypeDef* TIMx);
uint16_t TIM_GetCounter(TIM_TypeDef* TIMx);
本次代码需要注意的点
TIM3 对应的四个通道为PA6 PA7 PB0 PB1
GPIO引脚设置为上拉输入 IPU PA6
为了让cnt更好的计数 而不被重载 我们需要把ARR设置为65536-1
输入捕获单元结构体配置
结构体从滤波开始 每一部分都对应了图片的一个模块
TIM_ICInitTypeDef TIM_ICInitStructure;
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1; //设置通道1 PA6
TIM_ICInitStructure.TIM_ICFilter = 0xF;//滤波 连续的高电平 为 高电平,采样频率很高
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;//极性 边沿检测 机型选择 rising or falling
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; // 分频器 不分频
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //配置数据选择器,直连通道还是交叉通道 这里是直连 交叉为indirectTI
TIM_ICInit(TIM3, &TIM_ICInitStructure);
配置 TRGI的触发源为TI1FP1
TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1);//配置从模式为Reset 清除CNTTIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);/*TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1)是一个函数调用,用于选择定时器 TIM3 的输入触发源。在这种模式下,选择了 TI1FP1 作为触发源。
TI1FP1 是一个特定的触发源选择,它指的是使用 TIM3 输入捕获通道 1 (TI1) 的上升或下降沿来触发定时器。这意味着当输入捕获通道 1 上出现一个上升或下降沿时,TIM3 定时器将会被触发。
具体地,当 TI1FP1 触发条件满足时,TIM3 可能执行一些预定义的操作,例如开始一个计时操作、启动/停止测量等。触发操作的具体行为取决于你的代码实现。
要注意的是,使用 TIM_SelectInputTrigger 函数只是选择了触发源。在使用时,你还需要配置相应的引脚和定时器相关的参数,以确保触发源的正确连接和正常工作。*/
PWMI测占空比
TIM3 增加通道3
输出捕获单元设置为交叉通道,下降沿触发
因为在上升沿结束时 cnt 清零 所以过了半个周期到了下降沿 CCR2=CNT=总的1半
然后到了上升沿CCR=CNT=总的
最后占空比的时候就时
CCR2/CCR1 经过测量 CCR总是计数少一
所以需要+1
(CCR2+1)/(CCR+1)