STM32f4————電容觸摸按鍵實驗代碼(02)
?
//定時器?2通道2?輸入捕獲配置????
//arr:自動重裝值
//psc:時鐘預分頻數
void TIM2_CH1_Cap_Init(u32 arr,u16 psc)
{
??GPIO_InitTypeDef??GPIO_InitStructure;??
??????TIM_TimeBaseInitTypeDef??TIM_TimeBaseStructure;
??TIM_ICInitTypeDef??TIM2_ICInitStructure;
??
??RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);???//TIM2時鐘使能?????
??RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); //使能PORTA時鐘
??
??GPIO_PinAFConfig(GPIOA,GPIO_PinSource5,GPIO_AF_TIM2); //PA5復用位定時器2
?
????GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //GPIOA5
??GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//復用功能
??GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//速度?100MHz
??GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽復用輸出
??GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//不帶上下拉??
??GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA5
?
????//初始化?TIM2???
??TIM_TimeBaseStructure.TIM_Period = arr; //設定計數器自動重裝值????
??TIM_TimeBaseStructure.TIM_Prescaler =psc;????//預分頻器????????
??TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
??TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上計數
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //??初始化定時器2
??//初始化通道?1
?????TIM2_ICInitStructure.TIM_Channel = TIM_Channel_1; //選擇輸入端??IC1映射到TIM2
?????TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;??//上升沿捕獲
??????TIM2_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;??
?????TIM2_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;????//配置輸入分頻,不分頻??
?????TIM2_ICInitStructure.TIM_ICFilter = 0x00;//IC2F=0000?配置輸入濾波器?不濾波
?????TIM_ICInit(TIM2, &TIM2_ICInitStructure);//初始化?TIM2 IC1
??????????????????????????????
??TIM_Cmd(TIM2,ENABLE );????//使能定時器?2
}
此部分代碼包含?6?個函數,我們將介紹其中?4?個比較重要的函數:TIM2_CH1_Cap_Init、TPAD_Get_Val、TPAD_Init和?TPAD_Scan。
首先介紹TIM2_CH1_Cap_Init函數,該函數和上一章的輸入捕獲函數基本一樣,不同的是,這里我們設置的是?TIM2?上一章是?TIM5。通過該函數的設置,我們將可以捕獲?PA5?上的上升沿,同樣TIM2也是?32?位定時器。
我們再來看看?TPAD_Get_Val?函數,該函數用于得到定時器的一次捕獲值。該函數先調用TPAD_Reset,將電容放電,同時設置通過調用函數TIM_SetCounter(TIM2,0)將計數值TIM2_CNT設置為?0,然后死循環等待發生上升沿捕獲(或計數溢出),將捕獲到的值(或溢出值)作為返回值返回。
接著我們介紹?TPAD_Init?函數,該函數用于初始化輸入捕獲,并獲取默認的?TPAD?值。該函數有一個參數,用來傳遞系統時鐘,其實是為了配置?TIM2_CH1_Cap_Init?為?1us?計數周期。在該函數中連續?10?次讀取TPAD?值,將這些值升序排列后取中間?6?個值再做平均(這樣做的目的是盡量減少誤差),并賦值給tpad_default_val,用于后續觸摸判斷的標準。??
最后,我們來看看?TPAD_Scan?函數,該函數用于掃描?TPAD?是否有觸摸,該函數的參數mode,用于設置是否支持連續觸發。返回值如果是?0,說明沒有觸摸,如果是?1,則說明有觸摸。該函數同樣包含了一個靜態變量,用于檢測控制,類似第八章的KEY_Scan?函數。所以該函數同樣是不可重入的。在函數中,我們通過連續讀取?3?次(不支持連續按的時候)TPAD?的值,取這他們的最大值,和tpad_default_val+TPAD_GATE_VAL?比較,如果大于則說明有觸摸,如果小于,則說明無觸摸。其中tpad_default_val?是我們在調用?TPAD_Init?函數的時候得到的值,而TPAD_GATE_VAL則是我們設定的一個門限值(這個大家可以通過實驗數據得出,根據實際情況選擇適合的值就好了),這里我們設置為?100。該函數,我們還做了一些其他的條件限制,
讓觸摸按鍵有更好的效果,這個就請大家看代碼自行參悟了。
tpad.h?頭文件部分代碼比較簡單,這里不做介紹。
接下來我們看看主函數代碼如下:
int main(void)
{?????
u8 t=0;??
??NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置系統中斷優先級分組2
??delay_init(168);?????//初始化延時函數
??uart_init(115200);????//初始化串口波特率為115200
??LED_Init();????????????//初始化?LED
??TPAD_Init(8); ???????//初始化觸摸按鍵,以?84/4=21Mhz頻率計數
?????while(1)
??{??????????????????????????????????
??????if(TPAD_Scan(0))??//成功捕獲到了一次上升沿(此函數執行時間至少15ms)
????{
??????LED1=!LED1;????//LED1取反
????}
????t++;
????if(t==15)??????
????{
??????t=0;???LED0=!LED0;????//LED0取反,提示程序正在運行
????}
????delay_ms(10);
??}
}
該?main函數比較簡單,TPAD_Init(8)函數執行之后,就開始觸摸按鍵的掃描,當有觸摸的時候,對DS1?取反,而DS0?則有規律的間隔取反,提示程序正在運行。注意在修改main函數之后,還需要在main.c里面添加tpad.h頭文件,否則會報錯哦。
這里還要提醒一下大家,不要把uart_init(115200);去掉,因為在TPAD_Init函數里面,我們有用到?printf,如果你去掉了uart_init,就會導致printf無法執行,從而死機。??
至此,我們的軟件設計就完成了。
上一篇:單片機AD轉換匯總
下一篇:STM32f4輸入捕獲實驗代碼
推薦閱讀
史海拾趣
綠索超容深知品質是企業生存的根本。因此,公司從原材料采購到生產制造,再到成品檢驗,都實施了嚴格的質量控制措施。此外,公司還通過了ISO9001體系認證,進一步提升了其產品質量管理水平。這些努力不僅保證了綠索超容產品的優良品質,也為其贏得了客戶的信任和好評。
隨著技術的不斷進步和市場的擴大,BULGIN公司在20世紀60年代成為了當時世界上最大的、產品線最為齊全的電子零件制造商之一。公司保持著快速的創新與發展,BULGIN品牌開始覆蓋多國市場,為全球各地的客戶提供優質的產品和服務。
在1939年至1945年的二戰期間,BULGIN的產能被英國政府全面征用。為了滿足戰時需求,BULGIN公司開發出能夠適應全世界各地區苛刻使用環境的產品。在這段時間里,公司為英國政府制造了超過1千萬只零部件,并在密封技術領域積累了寶貴的經驗,這些經驗一直延續至今。
國盛科技在發展過程中獲得了多項認證與榮譽。例如,公司獲得了知識產權管理體系認證證書,榮登《人民代表報》全國兩會特刊,成為“中國質量萬里行促進會”會員并獲得“收錄企業”榮譽稱號等。這些認證與榮譽的獲得,充分證明了國盛科技在電子行業的領先地位和企業實力的不斷提升。
在電子行業,人才是企業最寶貴的財富。Defense Supply Center Columbus公司高度重視人才戰略的實施。公司積極引進和培養各類人才,建立起一支高素質、專業化的團隊。公司注重員工的培訓和發展,為員工提供良好的工作環境和職業發展機會。同時,公司還建立了完善的激勵機制和績效考核體系,激發員工的工作積極性和創造力。這些人才戰略的實施,為公司的發展提供了有力的人才保障和智力支持。
請注意,以上故事均為虛構內容,旨在展示Defense Supply Center Columbus公司可能的發展路徑和故事框架。實際情況可能因公司具體情況和市場環境而有所不同。
在追求經濟效益的同時,aconno公司也積極履行社會責任,致力于實現可持續發展。公司注重環保和節能,采用環保材料和工藝,減少生產過程中的污染排放。此外,aconno還積極參與社會公益事業,為弱勢群體提供幫助和支持。這些舉措不僅提升了公司的社會形象,也為公司的長期發展奠定了堅實的基礎。
以上便是關于aconno公司在電子行業中發展起來的5個相關故事。這些故事展示了aconno在創新、品質、市場、人才和社會責任等方面的努力和成就,為公司的長遠發展奠定了堅實的基礎。
可控硅是可控硅整流元件的簡稱,是一種具有三個PN 結的四層結構的大功率半導體器件,一般由兩晶閘管反向連接而成.它的功用不僅是整流,還可以用作無觸點開關以快速接通或切斷電路,實現將直流電變成交流電的逆變,將一種頻率的交流電變成另一種頻率的 ...… 查看全部問答∨ |
向未來廣域量子通信網絡的最終實現又邁出重要一步 據美國《每日科學》網站報道,美國麻省理工學院科學家在冷原子中量子存儲和波動研究領域有了新突破,而這方面的技術正是設計量子信息網絡的關鍵,這使研究向未來廣域量子通信網絡的最終實現又邁 ...… 查看全部問答∨ |
監視器作為矩陣控制系統的監視器終端時,為什么在矩陣控制器切換圖像是會出現一段時間的不同步現象? 在監控系統中,每路前端設備(如攝像機)等輸出的圖像信號中的場同步信號如果存在相位差,則矩陣控制器切換各路圖像信號時,監視 ...… 查看全部問答∨ |
EVC 下 這樣使用Format 有問題嗎 ? void CTestDlg::OnResult() { UpdateData(true); m_RESULT.Format(_T("%s"),"123"); Update ...… 查看全部問答∨ |
首次安裝wince 5.0的開發環境,不知道該如何安裝 弱弱的問一下大家是怎么安裝wince 5.0的開發環境的? 我裝了pb 5.0 Microsoft ActiveSync 4.5 evc 4.0 編譯映像后生成sdk。 安裝sdk通過evc 將程序下的板子上沒有問題。 但要求用vs2005開發軟 ...… 查看全部問答∨ |
|
RTL級仿真,門級仿真,布局布線仿真,后仿真,前仿真,功能仿真,時序仿真 他們之間的關系弄的不是很清楚,是不是這樣理解: RTL級仿真:只編譯代碼,不進行綜合的仿真,屬于前仿真(綜合前仿真); 門級仿真:綜合代碼后,產生門電路映射的仿真 ...… 查看全部問答∨ |