近期空閑時做了一個STM8L101芯片的PWM檢測程序,在此發(fā)表個人見解。
預(yù)備知識:
STM8L庫函數(shù)的使用、STM8L定時器的使用,相關(guān)資料自行百度
目標(biāo):通過TIM3輸出PWM波,將輸出的波輸入至TIM2的捕獲通道。
好了,接下來進(jìn)入正題。
STM8L10X的定時器的功能比較豐富,而且價格低廉,做輸入捕獲還是挺好的
首先介紹一個STM8L101X固件庫的一個函數(shù),在固件庫的
line 444 of file stm8l10x_tim2.c.
TIM2_PWMIConfig是專門用來配置PWM輸入模式的庫函數(shù),網(wǎng)上關(guān)于此處的介紹比較少,這里簡要介紹并應(yīng)用
該函數(shù)原型如下:
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連接
第三個值好像是與另外一個管腳連接,應(yīng)該是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 分頻,表示多少個電位突變觸發(fā)一個事件
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) //配置開始時觸發(fā)方式
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) //另外一個捕獲通道觸發(fā)方式相反
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
部分注釋見上,簡要分析可知,該函數(shù)將選擇的輸入通道連接到定時器的捕獲通道1和捕獲通道2上,并且捕獲通道1為檢測開始沿,捕獲通道2則檢測
第二個電位沿,比如配置為上升沿為PWM開始,則PWM中間為下降沿
好了,該函數(shù)功能就是這樣了,下面是一些檢測函數(shù),環(huán)境為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; //高電位溢出總數(shù) extern u8 update_count; //溢出總數(shù) extern u8 rate; //占空比,丟棄小數(shù)位 void Tim2_Impulse_Detection_Init(void); //Tim2_Impulse_Detection初始化 @far @interrupt void TIM2_Capture_Compare_HandledInterrupt (void);//捕獲中斷服務(wù)函數(shù) @far @interrupt void TIM2_Update_Overflow_Trigger_Break_HandledInterrupt (void);//溢出中斷服務(wù)函數(shù) 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; //中間變量,用于判斷第一次進(jìn)入上升沿捕獲0/第二次上升沿捕獲1 int ICValue1; //上升沿記錄的值 int ICValue2; //下降沿記錄的值 int ICValue3; //第二個上升沿記錄的值 u8 update_high; //高電位溢出總數(shù) u8 update_count; //溢出總數(shù) /************************************** 函數(shù)名:Tim2_Impulse_Detection_Init 功能:初始化Tim2為輸入捕獲 參數(shù):無 返回值:無 描述: **************************************/ void Tim2_Impulse_Detection_Init(void) //Tim2_Impulse_Detection初始化 { CLK_MasterPrescalerConfig(CLK_MasterPrescaler_HSIDiv8);//系統(tǒng)時鐘頻率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);//計數(shù)周期1us,向上計數(shù),溢出值為30000 TIM2_PWMIConfig(TIM2_Channel_1, TIM2_ICPolarity_Rising, TIM2_ICSelection_DirectTI, 0x00, 0x00); //PWN輸入配置:通道1,上升沿,直接輸入,無分頻,無濾波 //該函數(shù)配置捕獲通道1為上升沿,捕獲通道2為下降沿 } /************************************** 函數(shù)名:TIM2_Capture_Compare_HandledInterrupt 功能:TIM2_Capture_Compare_HandledInterrupt中斷服務(wù)程序 參數(shù):無 返回值:無 描述: **************************************/ @far @interrupt void TIM2_Capture_Compare_HandledInterrupt (void)//捕獲中斷服務(wù)函數(shù) { if((TIM2_GetITStatus(TIM2_FLAG_CC1)) != RESET) { if(temp) { ICValue3=TIM2_GetCapture1(); TIM2_ClearFlag(TIM2_FLAG_CC1);//清除通道中斷標(biāo)志 TIM2_ClearITPendingBit(TIM2_IT_CC1); TIM2_ITConfig( TIM2_IT_Update, DISABLE);//關(guān)閉溢出中斷 TIM2_CCxCmd(TIM2_Channel_1, DISABLE);//關(guān)閉通道1 TIM2_ITConfig(TIM2_IT_CC1, DISABLE);//關(guān)閉捕獲通道1中斷 TIM2_CCxCmd(TIM2_Channel_2, DISABLE);//關(guān)閉通道2 TIM2_ITConfig(TIM2_IT_CC2, DISABLE);//關(guān)閉捕獲通道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);//清除中斷標(biāo)志 TIM2_CCxCmd(TIM2_Channel_2,ENABLE);//使能捕獲通道2 TIM2_ITConfig( TIM2_IT_CC2 , ENABLE);//使能TIM2輸入通道2中斷 TIM2_ClearFlag(TIM2_FLAG_CC2);//清除通道中斷標(biāo)志 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);//清除通道中斷標(biāo)志 TIM2_ClearITPendingBit(TIM2_IT_CC2); TIM2_CCxCmd(TIM2_Channel_2,DISABLE);//失能捕獲通道2 TIM2_ITConfig( TIM2_IT_CC2 , DISABLE);//失能TIM2輸入通道2中斷 } } /************************************** 函數(shù)名:TIM2_Update_Overflow_Trigger_Break_HandledInterrupt 功能:TIM2_Update_Overflow_Trigger_Break_HandledInterrupt中斷服務(wù)程序 參數(shù):無 返回值:無 描述: **************************************/ @far @interrupt void TIM2_Update_Overflow_Trigger_Break_HandledInterrupt (void)//溢出中斷服務(wù)函數(shù) { update_count++; TIM2_ClearITPendingBit(TIM2_IT_Update); TIM2_ClearFlag(TIM2_IT_Update); } /************************************** 函數(shù)名:Tim2_Impulse_Detection_Get_Cycle 功能:Tim2_Impulse_Detection_Get_Cycle獲取輸入PWM波的脈寬與占空比 參數(shù): cycle_ms 一個儲存周期毫秒數(shù)的指針 cycle_us 一個儲存周期微秒數(shù)的指針 rate 一個儲存占空比的指針 返回值:無 描述:初始化完畢后,直接調(diào)用即可取得脈寬與占空比 **************************************/ void Tim2_Impulse_Detection_Get_Cycle(int* cycle_ms,int* cycle_us,u8* rate)//獲得輸入信號周期以及脈寬
上一篇:STM8S庫文件判斷指定IO輸入引腳電平GPIO_ReadInputPin有問題
下一篇:解決stm8s003中timer2配置初始化中引起中斷更新
推薦閱讀最新更新時間:2025-04-28 16:28

設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦
- 人形機器人馬拉松背后的思考,兆易創(chuàng)新如何賦能機器人產(chǎn)業(yè)
- 一種基于STM32的智能柜控制器設(shè)計
- 小型傾轉(zhuǎn)旋翼機的無刷直流電機驅(qū)動器設(shè)計
- 超高速攝影機電控系統(tǒng)設(shè)計
- 基于GPS自動授時的無線智能控制器的設(shè)計
- 基于PTR2000的無線氣象信息采集系統(tǒng)設(shè)計
- Microchip推出MEC175xB系列器件,為嵌入式控制器引入硬件 抗量子攻擊能力
- 無人飛行器機載穩(wěn)定云臺控制系統(tǒng)的設(shè)計
- 匠芯創(chuàng)推出面向具身智能高性能實時處理器M7000
- NB4N441MNGEVB,用于 NB4N441 的評估板,用于 SONET 的 12.5 至 425 MHz PLL 時鐘發(fā)生器
- RC522-232
- NCP5181BAL36WEVB,用于 NCP5181、36W 鎮(zhèn)流器、高壓功率 MOSFET 驅(qū)動器的評估板
- LTC3526LBEDC 2 節(jié)電池至 3.3V 升壓轉(zhuǎn)換器的典型應(yīng)用電路
- 使用 Aimtec 的 AM3G-0515DH30Z 的參考設(shè)計
- LT3467AES6 5V 至 40V 升壓轉(zhuǎn)換器的典型應(yīng)用
- AM1D-2415S-RZ 15V 1 瓦 DC/DC 轉(zhuǎn)換器的典型應(yīng)用
- 使用 ROHM Semiconductor 的 BD45272 的參考設(shè)計
- GameBoyOne
- V26_v2
- 吉利電池安全標(biāo)準(zhǔn)升級,“神盾金磚電池”有什么技術(shù)亮點?
- 中國汽車工程學(xué)會出臺全固態(tài)電池新標(biāo)準(zhǔn)
- Allegro如何用技術(shù)定義汽車電子新范式
- 恩智浦半導(dǎo)體推出汽車級開發(fā)平臺OrangeBox 2.0 旨在促進(jìn)安全的汽車通信
- 三大上市公司加碼/跨界固態(tài)電池關(guān)鍵材料!
- 一大波全固態(tài)電池新產(chǎn)品來了!
- 欣旺達(dá)/瑞浦/恩捷/力華/杜爾······12大企業(yè)電池行業(yè)新品來襲
- 新唐科技發(fā)布第四代『GerdaTM』系列,車用HMI顯示IC產(chǎn)品開始量產(chǎn)
- 寧德時代的電+Momenta的腦,“智電雙極”重構(gòu)全球汽車格局
- 一文讀懂:固態(tài)電池產(chǎn)業(yè)鏈通覽
- TI 最新CapTIvate™ 觸控微控制器技術(shù)直播開始報名嘍!報名參與有禮呦!
- 評論有禮:用混合信號示波器探索總線的秘密
- 贏京東卡——我家房子“成精”了!與英飛凌一起來探索吧!
- 【泰有聊】系列技術(shù)文章連載1:示波器“芯”升級,聊一聊TEK061/041 ASIC創(chuàng)新平臺
- 【答題有獎】賽靈思工業(yè)與醫(yī)療專題有獎問答
- 美光邀你元宵節(jié)貼窗花、領(lǐng)福利
- 預(yù)約有禮:預(yù)約理想配電網(wǎng)絡(luò)的電源完整性設(shè)計等直播,漲知識贏好禮
- EEworld獨家原創(chuàng)視頻:大話TI CC2650,邀你來看!
- 韓國開發(fā)VR LIVE技術(shù),打造全球都能享受的VIP視角
- 松下日本總部確認(rèn)會遵守美國禁令,官方聲明卻打臉
- 在華建廠難落地,JDI苦想尋金主
- 智能耳戴式設(shè)備或?qū)⒊蔀橹悄苁直韽娪辛Φ母偁帉κ?/a>
- ST發(fā)布《2019年可持續(xù)發(fā)展報告》
- 工業(yè)機器人產(chǎn)業(yè)鏈 這些干貨你應(yīng)該知道
- JDI正洽談接受中國財團投資 出讓約33%股份
- 詳細(xì)解讀我國近年工業(yè)機器人的各項重要政策
- 功率半導(dǎo)體器件的未來趨勢
- 斯坦福AI報告:語言處理應(yīng)用備受重視 中國企業(yè)發(fā)展迅猛