嵌入式軟件采集頻率值的方法
點擊上方藍(lán)字關(guān)注我哦~
01
前言
嵌入式軟件輸入采集較為常見有g(shù)pio讀取高低電平、ad讀取電壓值等,但是如果要采集一個頻率信號的頻率值,該如何采集?
02
采集頻率值
我們知道傳感器的輸出信號形式除了電壓電流,還有頻率,例如一些加速度傳感、轉(zhuǎn)速傳感器,輸出的就是頻率信號。
測量頻率要用到stm32的定時器輸入捕獲模式。與PWM輸出不同頻率的矩形波相對反,PWM輸入捕獲就是可以給輸入的矩形波計數(shù),從而測得頻率。簡單來說就是通過檢測TIMx_CHx上的邊沿信號,在邊沿信號發(fā)生跳變(比如上升沿/下降沿)的時候,將當(dāng)前定時器的值(TIMx_CNT)存放到對應(yīng)的通道的捕獲/比較寄存(TIMx_CCRx)里面,完成一次捕獲。
本例以STM32F105系列PA7管腳,查看規(guī)格書可知PA7可配置成TIM3的通道2。
開啟 TIM3 時鐘和 GPIOA 時鐘,
PA7 管腳初始化配置成浮空輸入
TIM3初始化設(shè)置預(yù)分頻值
配置TIM3中斷
設(shè)置TIM3_CH2的輸入比較參數(shù)并配置TIM3的被動觸發(fā)模式
使能TIM3并打開中斷
在TIM3中斷中計算頻率值
//-----------------------------------------------------------------
// * @函數(shù)名 PwmInit
// * @功能 完成輸入管腳和TIM3等初始化
// * @作者 嵌入式案例Show
// * @參數(shù) 無
// * @返回值 無
//-----------------------------------------------------------------
void PwmInit(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
//開啟TIM3和GPIOA的時鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
//PA7 管腳初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//TIM3初始化
TIM_TimeBaseStructure.TIM_Period = 0xffff;//
TIM_TimeBaseStructure.TIM_Prescaler = 4-1;//定時器的頻率36M*2/4=18M
TIM_TimeBaseStructure.TIM_ClockDivision = 0;//
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
//TIM3中斷配置
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//TIM3_CH2輸入?yún)?shù)配置
TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
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;
TIM_PWMIConfig(TIM3, &TIM_ICInitStructure);
TIM_SelectInputTrigger(TIM3, TIM_TS_TI2FP2);//配置TI2輸入觸發(fā)源
TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);//TIM從模式
TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable); //使能被動觸發(fā)
//使能TIM3并開啟中斷
TIM_Cmd(TIM3, ENABLE);
TIM_ITConfig(TIM3,TIM_IT_CC2,ENABLE);
}
u16 Tim3IC2Value;
void TIM3_IRQHandler(void)
{
u16 j;
TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);
//一個定時器周期內(nèi)捕獲的次數(shù)
Tim3IC2Value = TIM_GetCapture2(TIM3);
if (Tim3IC2Value != 0)
{
//計算 PWM 頻率。單位KHz
f2CurrentFreq = (u16)(180000 / Tim3IC2Value);
}
else
{
f2CurrentFreq = 0;
}
}
}
實測500KHz的輸入頻率可以非常精確的測量出來。注意stm32除了 TIM6 和 TIM7,其他定時器都有輸入捕獲功能。
/ The End /
相關(guān)閱讀
掃碼關(guān)注我們
看更多嵌入式案例
喜歡本篇內(nèi)容請給我們點個在看
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!