您的位置 首页 > 数码极客

“单片机如何采集脉冲“单片机采集脉冲信号有尖峰

[本文属原创,转载请附上原文出处链接。]

STM32采集频率低频用捕获精度很高,测量高频误差有点大,可能是这种方法我掌握的不够好,决定采用外部计数的方法来测量比较高的频率。用一个定时器定时,另一个定时器计数再根据f=n/t算出频率,这种方法原理上是定时时间越长求出的频率越高,但是STM32的定时器是16位的,要考虑到计时溢出的情况。关于误差的产生,测量的信号源的精度也是关键,在进入中断的时候,定时器获取计数值都会延时几个微秒,可能会丢失脉冲。我现在这种测量方法测量100K-130k误差大概8-10hz左右。下图为通用定时器框图:

通用定时器框图

先从main函数开始介绍:

int main(void)

{

int i;

SystemInit();

COMInit(COM2, 115200);

RCC_Configuration(); /* System Clocks Configuration*/

GPIO_Configuration(); /* Configure the GPIO ports */

Time_Configuration(); /* Time configuration */

Tim2_Timer();

while(1)

{

//Delayms(10);

for(i=0;i<1000000;i++)

{

}

}

}


下面是时钟配置函数:

/*******************************************************************************

* Function Name : RCC_Configuration

* Description : System Clocks Configuration

* Input : None

* Output : None

* Return : None

*******************************************************************************/

void RCC_Configuration(void)

{

/* TIM2 clock enable */

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

/* TIM3 clock enable */

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);

#if 0

/* TIM4 clock enable */

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);

#endif

}


I/O配置函数:

/********************************************************************************

* Function Name : GPIO_Configuration

* Description : The I/O configuration function

* Input : None

* Output : None

* Return : None

*******************************************************************************/

void GPIO_Configuration(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

GPIO_Ini = GPIO_Pin_2;

GPIO_Ini = GPIO_Mode_IPU;

GPIO_Ini = GPIO_Speed_50MHz;

GPIO_Init(GPIOD, &GPIO_InitStructure);

#if 0

GPIO_Ini = GPIO_Pin_0;

GPIO_Ini = GPIO_Mode_IPU;

GPIO_Ini = GPIO_Speed_50MHz;

GPIO_Init(GPIOE, &GPIO_InitStructure);

#endif

}


定时器初始化函数:

/********************************************************************************

* Function Name : Time_Configuration

* Description : 定时器3配置函数

* Input : None

* Output : None

* Return : None

*******************************************************************************/

void Time_Configuration()

{

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

TIM_TimeBa = 0x00;

TIM_TimeBa = 0xFFFF;

TIM_TimeBa = 0x0;

TIM_TimeBa = TIM_CounterMode_Up;

TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); // Time base configuration


TIM_ETRClockMode2Config(TIM3, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0);

//TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);

TIM_SetCounter(TIM3, 0);

TIM_Cmd(TIM3, ENABLE);

}


定时器定时函数定时250ms

void Tim2_Timer(void)

{

TIM_TimeBaseInitTypeDef TIM2_TimeBaseStructure;

NVIC_InitTypeDef NVIC_InitStructure;

TIM_DeInit(TIM2);

TIM2_TimeBa =2499;

TIM2_TimeBa = (7200-1);

TIM2_TimeBa = 0x0;

TIM2_TimeBa = TIM_CounterMode_Up;

TIM_TimeBaseInit(TIM2, &TIM2_TimeBaseStructure); // Time base configuration

TIM_ClearFlag(TIM2,TIM_FLAG_Update);

TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE );

TIM_Cmd(TIM2, ENABLE);


NVIC_Ini = TIM2_IRQn;

NVIC_IniPreemptionPriority = 0;

NVIC_IniSubPriority = 0;

NVIC_IniCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

}


中断服务函数:

#if 1

void TIM2_IRQHandler(void)

{

if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)

{

TIM_ClearITPendingBit(TIM2, TIM_IT_Update);

CAPTURE1=(u32)TIM_GetCounter(TIM3);

//CAPTURE2=(u32)TIM_GetCounter(TIM4);

}

sum+=CAPTURE1;

count++;

if(count==4)

{

Frequency1=sum/4;

sum=0;

count=0;

}

TIM_SetCounter(TIM3,0);

}

#endif

责任编辑: 鲁达

1.内容基于多重复合算法人工智能语言模型创作,旨在以深度学习研究为目的传播信息知识,内容观点与本网站无关,反馈举报请
2.仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证;
3.本站属于非营利性站点无毒无广告,请读者放心使用!

“单片机如何采集脉冲,单片机采集脉冲信号有尖峰,单片机如何采集脉冲信号,单片机采集脉冲信号,单片机采集脉冲量时,可以采用什么方法”边界阅读