stm32 TIM输入捕获

文章介绍了微控制器中的IC输入捕获功能,用于测量PWM波形的频率和占空比。通过配置不同的定时器通道,可以实现硬件自动化测量。测量方法包括测频法和测周法,适应不同频率范围。此外,文章还提到了GPIO口的配置以及相关的寄存器设置。
摘要由CSDN通过智能技术生成

IC(Input Capture)输入捕获

输入捕获模式下,当通道输入引脚出现指定电平跳变时,当前CNT的值将被锁存到CCR中,可用于测量PWM 波形的频率、占空比、脉冲间隔、电平持续时间等参数

每个高级定时器和通用定时器都拥有4个输入捕获通道

可配置为PWMI模式(PWM输入模式),同时测量频率和占空比

可配合主从触发模式,实现硬件全自动测量

频率测量

测频法适合频率高时测量,测量结果是一段时间的平均值,值比较平滑

测周法适合频率低时测量,只测量一个周期,就能出一次结果

当待测频率小于中界误差时,测周法误差小;当待测频率大于中界误差时,测频法误差小。

输入捕获通道

 TI1--->CH1信号     TI1F——>滤波后的信号   fDTS是滤波器的采样时钟来源

CCMR1寄存器里的ICF位可以控制滤波器的参数

边沿检测器捕获上升沿还是下降沿,通过CCER寄存器里的CC1P位选择级性(选择有效电平是高电平还是低电平)

从模式可以自动清理CNT,是自动化操作的利器

 

 获得频率

通过2个通道来捕获频率和占空比

CCR1捕获周期,CCR2捕获高电平的时间,CCR1/CCR2就是占空比

代码部分

void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode);
//单独写入预分频值的函数
TIM_PSCReloadMode_Update: The Prescaler is loaded at the update event.
//有个缓冲期,在更新事件时有个缓存器,延迟参数写入时间,周期结束再开始新的周期
TIM_PSCReloadMode_Immediate: The Prescaler is loaded immediately.
//立刻生效,立刻切断波形开始新的周期
void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct);
//单一的配置一个通道
void TIM_PWMIConfig(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct);
//配置2个通道,配置成PWMI模式
void TIM_ICStructInit(TIM_ICInitTypeDef* TIM_ICInitStruct);
//给输入捕获结构体赋初始值
void TIM_SelectInputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);
//选择输入触发源TRGI
void TIM_SelectOutputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_TRGOSource);
//选择输出触发源TRGO
void TIM_SelectSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_SlaveMode);
//选择从模式
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);
//分别单独配置通道1234的分频器
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);
//CCR只读,用这些函数读出

IC中GPIO口的配置

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
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(TIM2);

定时器

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;		//ARR
//为什么值要大一些?这里是通过输入捕获的方式,在上升沿时将时基单元里面CNT的值传递给CCR。再补充一句,这里采用的是测周法测频率,前面讲过测周法测频率要N的值越大越好,这里N对应着CNT传给CCR的值
TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1;		//PSC
//对应着标准频率fc,psc也不能给的太小,防止测量的信号频率过低,导致计数器溢出
//PSC越小,测周法N越大,适合测大频率
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);

在下载程序过程中出现了OLED不亮的情况,对比源码,并无出现过大的问题

删除了一下杂七杂八的文件,问题解决。

猜想,碰到过

 这个建,但再次点击后却无影响,不懂哩

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值