首先说明:我手里有两个程序,一个原理是读两个方波之间的时间,从而计算频率的,还有一个是读某一段时间内有几个上升沿,从而计算频率的,从原理上来说这两个都是对的,但是我们测的频率一般在35-65Hz之间,所以我觉得还是第一种比较好,但是同事非说第一种不对,所以两种贴上来让大家看看
首先是第一种,读两个方波之间的时间
void Drv_Fre_Cal(void)//u16 wHcSpace
{
static u32 wTemp1,wTemp2;
static u32 CaptureNumber=0;
static u32 Capture;
if(TIM_GetFlagStatus(TIM4, TIM_FLAG_CC2) != RESET) //判断捕获通道3是否有捕获?
{
if(CaptureNumber==0)
{
wTemp1 = TIM_GetCapture2(TIM4); //读取捕获通道3的值 Fre of Fre2(UA)
CaptureNumber=1;
}
else if(CaptureNumber==1)
{
wTemp2 = TIM_GetCapture2(TIM4);
if (wTemp2 > wTemp1)
{
Capture = (wTemp2 - wTemp1);
}
else
{
Capture = (( 0xFFFF- wTemp1) + wTemp2);//
}
if ((Capture>=36363) && (Capture<=44444))
c_wFre=MulDivU32(2000000,100,Capture);
CaptureNumber = 0;
}
TIM_ClearFlag(TIM4,TIM_FLAG_CC2);
}
}
下面是对定时器的设置
void DRV_TIM4_Configration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
TIM_TimeBaseStructure.TIM_Period = 0xFFFF; //10000 这个值实际上就是TIMX->ARR,延时开始时重新设定即可
TIM_TimeBaseStructure.TIM_Prescaler =TIM4_Prescaler ; // 72Mhz/(TIM4_Prescaler+1)=2MHZ 计数频率为1KHz 设置TIMx_PSC寄存器
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 定时器基准频率32MHz?? 时钟分配
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
TIM_Cmd(TIM4, ENABLE);
}
void STM32_Fre_Configration(void)
{
TIM_ICInitTypeDef TIM_ICInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
TIM_DeInit(TIM4);
//TIM_ICInitStructure.TIM_ICMode = TIM_ICMode_ICAP; //配置为输入捕获模式
TIM_ICInitStructure.TIM_Channel = TIM_Channel_2; //选择通道1
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //输入上升沿捕获
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; // 通道方向选择
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //每次检测到捕获输入就触发一次捕获
TIM_ICInitStructure.TIM_ICFilter = 0x0; //滤波设置,经历几个周期跳变认定波形稳定0x0~0xF
TIM_ICInit(TIM4, &TIM_ICInitStructure);
TIM_PrescalerConfig(TIM4,0x23,TIM_PSCReloadMode_Immediate);
// Select the TIM4 Input Trigger: TIFP
TIM_SelectInputTrigger(TIM4, TIM_TS_ITR2);// TIM_TS_TI1F_ED //选择时钟触发源
//从模式可以不用选择
// Select the slave Mode: Reset Mode 复位模式,选中的触发输入的上升沿初始化计数器,并且产生一个更新信号
//TIM_SelectSlaveMode(TIM4, TIM_SlaveMode_External1);
//TIM_SelectSlaveMode(TIM4, TIM_SlaveMode_Reset);
// Enable the Master/Slave Mode 主从模式选择
//TIM_SelectMasterSlaveMode(TIM4, TIM_MasterSlaveMode_Enable); //启动定时器的被动触发
//TIM_ITConfig(TIM4, TIM_IT_CC4 , ENABLE);
// TIM enable counter
TIM_Cmd(TIM4, ENABLE);
}
|