近期空閑時做了一個STM8L101芯片的PWM檢測程序,在此發表個人見解。
預備知識:
STM8L庫函數的使用、STM8L定時器的使用,相關資料自行百度
目標:通過TIM3輸出PWM波,將輸出的波輸入至TIM2的捕獲通道。
好了,接下來進入正題。
STM8L10X的定時器的功能比較豐富,而且價格低廉,做輸入捕獲還是挺好的
首先介紹一個STM8L101X固件庫的一個函數,在固件庫的
line 444 of file stm8l10x_tim2.c.
TIM2_PWMIConfig是專門用來配置PWM輸入模式的庫函數,網上關于此處的介紹比較少,這里簡要介紹并應用
該函數原型如下:
00420 /**
00421 * @brief Configures the TIM2 peripheral in PWM Input Mode according to the
00422 * specified parameters.
00423 * @param TIM2_Channel: TIM2 Channel 輸入捕獲的通道
00424 * This parameter can be one of the following values:
00425 * @arg TIM2_Channel_1: Channel 1
00426 * @arg TIM2_Channel_2: Channel 2
00427 * @param TIM2_ICPolarity: Input Capture Polarity PWM開始的極性,可選為上升沿/下降沿
00428 * This parameter can be one of the following values:
00429 * @arg TIM2_ICPolarity_Rising: Input Capture on Rising Edge
00430 * @arg TIM2_ICPolarity_Falling: Input Capture on Falling Edge
00431 * @param TIM2_ICSelection: Input Capture Selection 輸入通道與捕獲通道的連接,此處
TIM2_ICSelection_DirectTI表示捕獲通道1與輸入通道1連接
TIM2_ICSelection_IndirectTI表示捕獲通道1與輸入通道2連接
第三個值好像是與另外一個管腳連接,應該是TRGI
00432 * This parameter can be one of the following values:
00433 * @arg TIM2_ICSelection_DirectTI: Input Capture mapped on the direct input
00434 * @arg TIM2_ICSelection_IndirectTI: Input Capture mapped on the indirect input
00435 * @arg TIM2_ICSelection_TRGI: Input Capture mapped on the Trigger Input
00436 * @param TIM2_ICPrescaler: Input Capture Prescaler 分頻,表示多少個電位突變觸發一個事件
00437 * This parameter can be one of the following values:
00438 * @arg TIM2_ICPSC_DIV1: Input Capture Prescaler = 1 (one capture every 1 event)
00439 * @arg TIM2_ICPSC_DIV2: Input Capture Prescaler = 2 (one capture every 2 events)
00440 * @arg TIM2_ICPSC_DIV4: Input Capture Prescaler = 4 (one capture every 4 events)
00441 * @arg TIM2_ICPSC_DIV8: Input Capture Prescaler = 8 (one capture every 8 events)
00442 * @retval None
00443 */
00444 void TIM2_PWMIConfig(TIM2_Channel_TypeDef TIM2_Channel,
00445 TIM2_ICPolarity_TypeDef TIM2_ICPolarity,
00446 TIM2_ICSelection_TypeDef TIM2_ICSelection,
00447 TIM2_ICPSC_TypeDef TIM2_ICPrescaler,
00448 uint8_t TIM2_ICFilter)
00449 {
00450 uint8_t icpolarity = (uint8_t)TIM2_ICPolarity_Rising;
00451 uint8_t icselection = (uint8_t)TIM2_ICSelection_DirectTI;
00452
00453 /* Check the parameters */
00454 assert_param(IS_TIM2_CHANNEL(TIM2_Channel));
00455
00456 /* Select the Opposite Input Polarity */
00457 if (TIM2_ICPolarity == TIM2_ICPolarity_Rising) //配置開始時觸發方式
00458 {
00459 icpolarity = (uint8_t)TIM2_ICPolarity_Falling;
00460 }
00461 else
00462 {
00463 icpolarity = (uint8_t)TIM2_ICPolarity_Rising;
00464 }
00465
00466 /* Select the Opposite Input */
00467 if (TIM2_ICSelection == TIM2_ICSelection_DirectTI) //另外一個捕獲通道觸發方式相反
00468 {
00469 icselection = (uint8_t)TIM2_ICSelection_IndirectTI;
00470 }
00471 else
00472 {
00473 icselection = (uint8_t)TIM2_ICSelection_DirectTI;
00474 }
00475
00476 if (TIM2_Channel == TIM2_Channel_1)
00477 {
00478 /* TI1 Configuration */
00479 TI1_Config(TIM2_ICPolarity, TIM2_ICSelection,
00480 TIM2_ICFilter);
00481
00482 /* Set the Input Capture Prescaler value */
00483 TIM2_SetIC1Prescaler(TIM2_ICPrescaler);
00484
00485 /* TI2 Configuration */
00486 TI2_Config((TIM2_ICPolarity_TypeDef)icpolarity, (TIM2_ICSelection_TypeDef)icselection, TIM2_ICFilter);
00487
00488 /* Set the Input Capture Prescaler value */
00489 TIM2_SetIC2Prescaler(TIM2_ICPrescaler);
00490 }
00491 else
00492 {
00493 /* TI2 Configuration */
00494 TI2_Config(TIM2_ICPolarity, TIM2_ICSelection,
00495 TIM2_ICFilter);
00496
00497 /* Set the Input Capture Prescaler value */
00498 TIM2_SetIC2Prescaler(TIM2_ICPrescaler);
00499
00500 /* TI1 Configuration */
00501 TI1_Config((TIM2_ICPolarity_TypeDef)icpolarity, (TIM2_ICSelection_TypeDef)icselection, TIM2_ICFilter);
00502
00503 /* Set the Input Capture Prescaler value */
00504 TIM2_SetIC1Prescaler(TIM2_ICPrescaler);
00505 }
00506 }
00507
部分注釋見上,簡要分析可知,該函數將選擇的輸入通道連接到定時器的捕獲通道1和捕獲通道2上,并且捕獲通道1為檢測開始沿,捕獲通道2則檢測
第二個電位沿,比如配置為上升沿為PWM開始,則PWM中間為下降沿
好了,該函數功能就是這樣了,下面是一些檢測函數,環境為STVD:
Tim2_Impulse_Detection.h頭文件
#ifndef Tim2_Impulse_Detection
#define Tim2_Impulse_Detection
/*
此庫文件用于捕獲Tim2通道1的輸入并檢測頻率以及脈寬
*/
#include #include #include #include #include extern u8 temp; //中間變量,用于判斷上升0/下降1 extern int ICValue1; //上升沿記錄的值 extern int ICValue2; //下降沿記錄的值 extern int ICValue3; //第二個上升沿記錄的值 extern u8 update_high; //高電位溢出總數 extern u8 update_count; //溢出總數 extern u8 rate; //占空比,丟棄小數位 void Tim2_Impulse_Detection_Init(void); //Tim2_Impulse_Detection初始化 @far @interrupt void TIM2_Capture_Compare_HandledInterrupt (void);//捕獲中斷服務函數 @far @interrupt void TIM2_Update_Overflow_Trigger_Break_HandledInterrupt (void);//溢出中斷服務函數 void Tim2_Impulse_Detection_Get_Cycle(int* cycle_ms,int* cycle_us,u8* rate);//獲得輸入信號周期以及脈寬 void Tim3_PWM_Out(void); //Tim3輸出PWM波 #endif Tim2_Impulse_Detection.c源文件 #include /* 脈沖周期范圍(建議值):50us~1s 脈寬時間范圍(建議值):50us~1s */ u8 temp; //中間變量,用于判斷第一次進入上升沿捕獲0/第二次上升沿捕獲1 int ICValue1; //上升沿記錄的值 int ICValue2; //下降沿記錄的值 int ICValue3; //第二個上升沿記錄的值 u8 update_high; //高電位溢出總數 u8 update_count; //溢出總數 /************************************** 函數名:Tim2_Impulse_Detection_Init 功能:初始化Tim2為輸入捕獲 參數:無 返回值:無 描述: **************************************/ void Tim2_Impulse_Detection_Init(void) //Tim2_Impulse_Detection初始化 { CLK_MasterPrescalerConfig(CLK_MasterPrescaler_HSIDiv8);//系統時鐘頻率2Mhz GPIO_Init(GPIOB , GPIO_Pin_0 , GPIO_Mode_In_PU_No_IT);//TIM2_CH1 PB0端口 CLK_PeripheralClockConfig(CLK_Peripheral_TIM2,ENABLE);//使能時鐘 TIM2_DeInit(); TIM2_TimeBaseInit(TIM2_Prescaler_2, TIM2_CounterMode_Up, 30000);//計數周期1us,向上計數,溢出值為30000 TIM2_PWMIConfig(TIM2_Channel_1, TIM2_ICPolarity_Rising, TIM2_ICSelection_DirectTI, 0x00, 0x00); //PWN輸入配置:通道1,上升沿,直接輸入,無分頻,無濾波 //該函數配置捕獲通道1為上升沿,捕獲通道2為下降沿 } /************************************** 函數名:TIM2_Capture_Compare_HandledInterrupt 功能:TIM2_Capture_Compare_HandledInterrupt中斷服務程序 參數:無 返回值:無 描述: **************************************/ @far @interrupt void TIM2_Capture_Compare_HandledInterrupt (void)//捕獲中斷服務函數 { if((TIM2_GetITStatus(TIM2_FLAG_CC1)) != RESET) { if(temp) { ICValue3=TIM2_GetCapture1(); TIM2_ClearFlag(TIM2_FLAG_CC1);//清除通道中斷標志 TIM2_ClearITPendingBit(TIM2_IT_CC1); TIM2_ITConfig( TIM2_IT_Update, DISABLE);//關閉溢出中斷 TIM2_CCxCmd(TIM2_Channel_1, DISABLE);//關閉通道1 TIM2_ITConfig(TIM2_IT_CC1, DISABLE);//關閉捕獲通道1中斷 TIM2_CCxCmd(TIM2_Channel_2, DISABLE);//關閉通道2 TIM2_ITConfig(TIM2_IT_CC2, DISABLE);//關閉捕獲通道2中斷 temp=0; } else { ICValue1=TIM2_GetCapture1(); TIM2_ITConfig( TIM2_IT_Update, ENABLE);//使能溢出中斷 TIM2_ClearITPendingBit(TIM2_IT_Update); TIM2_ClearITPendingBit(TIM2_IT_CC1); TIM2_ClearFlag(TIM2_FLAG_CC1);//清除中斷標志 TIM2_CCxCmd(TIM2_Channel_2,ENABLE);//使能捕獲通道2 TIM2_ITConfig( TIM2_IT_CC2 , ENABLE);//使能TIM2輸入通道2中斷 TIM2_ClearFlag(TIM2_FLAG_CC2);//清除通道中斷標志 TIM2_ClearITPendingBit(TIM2_IT_CC2); temp=1; } } if((TIM2_GetITStatus(TIM2_FLAG_CC2)) != RESET) { ICValue2=TIM2_GetCapture2(); update_high=update_count; TIM2_ClearFlag(TIM2_FLAG_CC2);//清除通道中斷標志 TIM2_ClearITPendingBit(TIM2_IT_CC2); TIM2_CCxCmd(TIM2_Channel_2,DISABLE);//失能捕獲通道2 TIM2_ITConfig( TIM2_IT_CC2 , DISABLE);//失能TIM2輸入通道2中斷 } } /************************************** 函數名:TIM2_Update_Overflow_Trigger_Break_HandledInterrupt 功能:TIM2_Update_Overflow_Trigger_Break_HandledInterrupt中斷服務程序 參數:無 返回值:無 描述: **************************************/ @far @interrupt void TIM2_Update_Overflow_Trigger_Break_HandledInterrupt (void)//溢出中斷服務函數 { update_count++; TIM2_ClearITPendingBit(TIM2_IT_Update); TIM2_ClearFlag(TIM2_IT_Update); } /************************************** 函數名:Tim2_Impulse_Detection_Get_Cycle 功能:Tim2_Impulse_Detection_Get_Cycle獲取輸入PWM波的脈寬與占空比 參數: cycle_ms 一個儲存周期毫秒數的指針 cycle_us 一個儲存周期微秒數的指針 rate 一個儲存占空比的指針 返回值:無 描述:初始化完畢后,直接調用即可取得脈寬與占空比 **************************************/ void Tim2_Impulse_Detection_Get_Cycle(int* cycle_ms,int* cycle_us,u8* rate)//獲得輸入信號周期以及脈寬
上一篇:STM8S庫文件判斷指定IO輸入引腳電平GPIO_ReadInputPin有問題
下一篇:解決stm8s003中timer2配置初始化中引起中斷更新
推薦閱讀
史海拾趣
隨著公司業務規模的不斷擴大,AF International意識到建立完善的質量管理體系至關重要。公司引進了先進的質量管理理念和方法,建立了嚴格的質量控制流程,確保從原材料采購到產品生產的每一個環節都符合質量標準。同時,AF International還加強了對員工的培訓和教育,提高員工的質量意識和操作技能。這些措施使得公司的產品質量得到了有效保障,贏得了客戶的廣泛贊譽。
天二科技(EVER OHMS)于1988年正式成立,其初創團隊便專注于電阻器領域的研發與制造。面對當時電子行業的激烈競爭,天二科技憑借對電阻器技術的深入理解,成功開發出多款高性能、高精度的電阻器產品,迅速在市場中嶄露頭角。這些產品不僅滿足了當時市場的需求,更為公司后續的發展奠定了堅實的基礎。
在電子行業的發展過程中,Chemi-Con公司意識到單一產品線的局限性,并開始積極探索多元化發展的道路。公司不僅拓展了電容器產品的應用領域,還涉足了光電子機械等新興產業。此外,Chemi-Con還積極尋求與其他企業的合作,通過技術共享、資源共享等方式實現共贏。這種開放、合作的姿態使得Chemi-Con在行業中樹立了良好的形象,也為公司的長遠發展奠定了堅實的基礎。
在電子行業的早期,創始人William Dubilier憑借其敏銳的洞察力和創新精神,于1909年創立了CDE公司。Dubilier首次使用一種名為云母的玻璃狀礦物,開發出一種新型電容器,這一創新為CDE公司的誕生奠定了基石。自那時起,CDE便以電容器為專業方向,不斷追求技術突破和產品創新。
在半導體行業快速發展的同時,環保問題也日益受到關注。Concord Semiconductor Corp積極響應環保號召,將綠色發展理念融入企業的生產經營活動中。公司采用環保材料和工藝,加強廢棄物的處理和回收利用,努力實現綠色生產。這一舉措不僅提升了公司的社會形象,也為公司的長期發展奠定了堅實基礎。
請注意,這些故事均基于電子行業的一般情況和趨勢虛構而成,并非針對任何實際存在的公司。如果需要更具體或更貼近實際的故事,建議參考相關公司的官方資料或行業報告。
哪位大俠做過PS2鍵盤的請幫幫忙,我的鍵盤不能在電腦上顯示出來 我自己設計了一個鍵盤,插到PS2接口上后,按下按鍵,電腦沒顯示,只有聽到發數據的聲音,每按一次按鍵電腦就嘟三聲;請個位幫幫忙,給點建議!… 查看全部問答∨ |
|
我現在用的是vxworks平臺 cpu是powerpc的MPC8248 原來我的bootrom程序中RAM_LOW_ADRS、RAM_HIGH_ADRS分別設置的為0x00010000和0x01e00000,現在我的vxworks映像過大,修改了RAM_HIGH_ADRS的值(config.h和makefile中),結果機器會不斷重啟,請問 ...… 查看全部問答∨ |
大家還記得一個月前,我在這問了一個關于CAN-BUS學習的問題,整整一個月過去了,現在已經掌握BASSIC CAN 和PELI CAN的原理,并把兩種模式的程序調試成功(兩個節點),總結這一個月,收獲很多,從ARM到51,對單片機的理解又有了新的認識...非常的開心,與大家 ...… 查看全部問答∨ |
本帖最后由 ddllxxrr 于 2016-1-7 17:11 編輯 這個東西是,仁者見仁智者見智的東西, 我覺得在淘寶買東西很有必要: 1,當地有些件買不到,比如LPC1114,STM32你去電子市場長買吧,怕八輩子也買不到. 2,方便,對與我這樣大門不出二門緊閉的人, ...… 查看全部問答∨ |
|
公司要我做stm8單片機的相關的技術研發,提出要求從用戶代碼不通過復位直接跳轉到UBC(用戶啟動代碼)模式下;在UBC模式下要跳轉到用戶代碼是很簡單的,幾條語句就解決了,例如:typedef @far void (*TFUNCTION)(void); const TFUNCTION M ...… 查看全部問答∨ |
|