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不亮的情况,对比源码,并无出现过大的问题
删除了一下杂七杂八的文件,问题解决。
猜想,碰到过
这个建,但再次点击后却无影响,不懂哩