這次做訓練題遇到了采頻率的問題,做單項并網問題,需要實時了解頻率的相關信息。
嘗試直接用他們提供的輸入捕獲,發現并不是很好用,琢磨了半天,實現了自己的部分采用。
這里就不一步一步的分析了,估計看的情況也比較少。
直接上手,不過,博主是從正點原子那里直接得到的庫里面查找的信息。
一般定時器的配置
pwm_in_mode.h文件
這里介紹了兩個配置函數
#ifndef __TIMER_H
#define __TIMER_H
#include "stm32f4xx.h"
void TIM2_CH2_Cap_Init(void);
void TIM2_IRQHandler(void);
#endif
看自己的愛好,我這里把一般的(u16 arr,u16 psc)省略到里面去了,大家可以直接改掉也行,加在函數頭里面傳參。
pwm_in_mode.c文件
有幾種模式,大家可以直接抄過去
時間設定初始化
TIM_ICInitTypeDef TIM_ICInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
TIM_TimeBaseStructure.TIM_Prescaler=84-1;
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_Period=0xffffffff;//對應下面
TIM_TimeBaseStructure.TIM_ClockDivision =TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
引腳初始化
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //GPIOA1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource1,GPIO_AF_TIM2);
中斷優先級
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01;
NVIC_InitStructure.NVIC_IRQChannelSubPriority =0x03;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
使能和其他配置
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
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_ICInit(TIM2,&TIM_ICInitStructure);
TIM_ICInitStructure.TIM_ICFilter = 0x0;//
TIM_PWMIConfig(TIM2,&TIM_ICInitStructure);
/* Select the TIM4 Input Trigger: TI2FP2 */
TIM_SelectInputTrigger(TIM2, TIM_TS_TI2FP2);
/* Select the slave Mode: Reset Mode */
TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset);
TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable);
/* TIM enable counter */
TIM_Cmd(TIM2,ENABLE);
TIM_ITConfig(TIM2, TIM_IT_CC2, ENABLE);
中斷函數處理
這里就可以計算出周期和時間了,也可以直接復制過去。
void TIM2_IRQHandler(void)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_CC2); //??±ê????
IC2Value=TIM_GetCapture2(TIM2);
IC1Value=TIM_GetCapture1(TIM2);
if(IC2Value!=0){
DutyCycle=(float)IC1Value*100/IC2Value;
Frequency =(float)1000000/IC2Value;//對應上面的1Mhz
}
else{
DutyCycle=0;
Frequency=0;
}
}
顯示和現象對比
OLED_Refresh_Gram();
if(print_mode==0)
{
OLED_ShowString(0,0,"MeasureResult:",16);
OLED_ShowString(0,16,"IC2Value:",16);
OLED_ShowNum(72,16,IC2Value,7,16);
OLED_ShowString(0,32,"DutyCycle:",16);
OLED_ShowFloatNum(80,32,DutyCycle,7,16);
OLED_ShowString(0,48,"Frequency:",16);
OLED_ShowFloatNum(80,48,Frequency,7,16);
}
精度與誤差
這里定時器讀到的IC1Value和IC2Value精度的限制,博主試過,最小可識別刻度在0.002hz,暫時還是夠用的。
如果做的過程中沒能實現,可以直接下載參考我的.c文件,這里是文件鏈接。
注意,博主的單片機型號是STM32F4系列的,時鐘配置的TIM2是168M,如果不懂時鐘的計算可以參考我前面的文章有講解。
上一篇:STM32F4開發板----GPIO(001)
下一篇:LCD浮點數顯示函數的探討
推薦閱讀
史海拾趣
隨著技術的不斷成熟,D1 International Inc公司開始積極拓展市場。公司不僅在國內市場取得了顯著的成果,還成功打入國際市場。與此同時,D1 International Inc公司也注重與其他企業的戰略合作。通過與知名電子制造商的合作,D1 International Inc公司的產品線得到了極大的豐富,同時也提升了公司的品牌影響力。
GHI Electronics深知技術創新是企業持續發展的關鍵。因此,公司不斷加大研發投入,致力于開發具有自主知識產權的產品。其中,ARM微控制器、顯示模塊、空氣質量傳感器、模塊化系統以及微處理器等主打產品系列,憑借其卓越的性能和穩定的品質,在消費電子、便攜設備、通訊/網絡等領域獲得了廣泛應用。這些技術創新不僅鞏固了GHI Electronics在市場上的領先地位,也為其未來的發展奠定了堅實的基礎。
為了進一步擴大市場份額,DCCOM公司積極尋求與國內外知名企業的合作。通過與這些企業的合作,DCCOM不僅獲得了更多的客戶資源,還學習到了先進的管理經驗和技術知識。這種合作模式使得DCCOM在激烈的市場競爭中保持了強勁的增長勢頭。
E-T-A公司自創立以來,一直由Ellenberger和Poensgen家族掌控。家族成員代代相傳,將公司的傳統和價值觀延續至今。同時,公司也注重培養新一代的管理和技術人才,為公司的持續發展注入新的活力。在家族傳承的基礎上,E-T-A公司不斷追求創新,致力于為客戶提供更加優質的產品和服務。
Apex Tool Group在追求經濟效益的同時,也積極履行社會責任,推動可持續發展。公司注重環保和節能,采用環保材料和節能技術生產電動工具。同時,Apex Tool Group還積極參與社會公益活動,為社區的可持續發展貢獻力量。這些舉措使得Apex Tool Group在電子行業中樹立了良好的企業形象,贏得了社會的廣泛認可。
雖然以上故事并非真實事件,但它們基于Apex Tool Group在電子行業中的發展和成就進行了合理推測和創作。這些故事展示了Apex Tool Group在創新、品質、全球化、定制化服務和社會責任等方面的努力和成就,為公司在電子行業中的發展提供了有力的支撐。
Advanced Semiconductor, Inc. (簡稱ASI) 成立于XXXX年,由一群熱衷于半導體技術創新的工程師和科學家創立。在創立初期,ASI專注于研發高性能的半導體芯片,以滿足當時市場對更快、更穩定電子產品的需求。公司憑借其獨特的技術和創新的理念,很快在半導體行業中嶄露頭角,吸引了眾多投資者的關注。
我是想從手機的耳機孔取信號,來推動一個單穩態電路 從左往右把門電路分別稱為門1、門2、門3、門4. 門3、門4.組成的單穩態電路,很成功 ,用手指碰門2的輸入端可使單穩態翻轉。 門1組成的放大器,把手機的耳機信號放大后送到后面 ...… 查看全部問答∨ |
|
各位高手,請指教。這個程序檢測傳感器信息for(i=0; i<8; i++) {flagSensor[i] = sensorDat...看不懂啊? / 檢測傳感器信息 if(g_enSensor) {   ...… 查看全部問答∨ |
現在我寫了一個類似于ping的程序在pc機上運行,只是該程序不是一秒發一次,而是如果收到對方的應答就立即發送另一個ping的包.也就是只是ping得更快. ping一段時間之后就出現網絡斷開. 我想問下是不是因為底下bsp的原因造成的? 又該怎么解決? 謝謝 ...… 查看全部問答∨ |
調試RTC例程時發現每次仿真到printf函數就死機。于是上網搜索解決方案,看到一個最簡單有效的方法就是要在KEIL上的microLIB要打勾勾,但是我試了,還是死機。這是怎么回事呢?難道還有什么要注意的地方?… 查看全部問答∨ |
|