借用江协科技ppt:
介绍:
检测到左边的通道123,某一个发生电平翻转(与其他通道电平不同)会通过输入滤波器,可以去到ICx->预分频器->由输入捕获/输出比较寄存器(再一定时间里计数)得到计数值返回到CNT计数器里(CNT由内部标准时钟驱动)->下一个上升沿来前CNT先清零 (配置从模式复位清零,由硬件执行清零)
*(频率不要太小,频率太低计数有可能会溢出(超过计数范围65535) )
通道1和2都可以实现直连或级联,例如TI1->TI1FP1 TI1->TI1FP2 通道3和4也一样。
(由上升沿开始)一个引脚可以 控制两个捕获单元,一个上升沿触发(测频率),一个下降沿触发(间接占空比),实现PWMI模式(可以测出频率和占空比)
基本结构:
先打开定时器和gpio时钟 ->gpio初始化->配置时基单元->配置IC模式(PWMI)->选择触发源->选择从模式
代码:
#include "stm32f10x.h" // Device header
void IC_Init()
{ //打开时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
TIM_InternalClockConfig(TIM3);//*定时器一定有时钟
//GPIO配置
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU ;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6 ; //PA6为TIM_CH1
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
//配置时基单元
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1 ;
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up ;
TIM_TimeBaseInitStruct.TIM_Period = 65536 -1 ;//要保证不会溢出
TIM_TimeBaseInitStruct.TIM_Prescaler = 72-1 ;
TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);
//配置IC(输入捕获)
TIM_ICInitTypeDef TIM_ICInitStruct;
TIM_ICInitStruct.TIM_Channel = TIM_Channel_1 ; //CH1对应通道1/2
TIM_ICInitStruct.TIM_ICFilter = 0xF ; //滤波
TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising ;
TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1 ;
TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI;//直连
TIM_ICInit(TIM3, &TIM_ICInitStruct);
TIM_PWMIConfig(TIM3,&TIM_ICInitStruct);//PWMI模式,1对2,上对下,直对交
TIM_SelectInputTrigger(TIM3,TIM_TS_TI1FP1);//触发源
TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset);//从模式
TIM_Cmd(TIM3,ENABLE);//开启定时器
}
uint32_t IC_GetFreq()
{
return 1000000/(TIM_GetCapture1(TIM3)+1);//读取频率
}
uint32_t IC_GetDuty()
{
return (TIM_GetCapture2(TIM3)+1)*100/(TIM_GetCapture1(TIM3)+1);//读取占空比
}
在时基单元中的计数寄存器和预分频器,可以认为先有分频,才有计数。预分频器为72 -1 .时钟频率就为1MHz=1us,每过1us->计数器+1