|
2018年全國電子設(shè)計(jì)大賽(吉林賽區(qū))B題程序源碼基于STM32F103ZET6,圓盤懸吊裝置8路PWM輸出定時(shí)器,編碼器測速,陀螺儀
單片機(jī)源程序如下:
- #include "touch_key.h"
- #include "SysTick.h"
- #include "usart.h"
- #define Touch_ARR_MAX_VAL 0xffff //最大的ARR值
- u16 touch_default_val=0; //為按下觸摸按鍵時(shí)的值
- /*******************************************************************************
- * 函 數(shù) 名 : TIM5_CH2_Input_Init
- * 函數(shù)功能 : TIM5_CH2輸入捕獲初始化函數(shù)
- * 輸 入 : arr:自動(dòng)重裝載值
- psc:預(yù)分頻系數(shù)
- * 輸 出 : 無
- *******************************************************************************/
- void TIM5_CH2_Input_Init(u16 arr,u16 psc)
- {
- TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
- TIM_ICInitTypeDef TIM_ICInitStructure;
- GPIO_InitTypeDef GPIO_InitStructure;
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);//使能TIM5時(shí)鐘
-
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空輸入模式
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度為50MHz
- GPIO_Init(GPIOA, &GPIO_InitStructure); // PA0
-
-
- TIM_TimeBaseInitStructure.TIM_Period=arr; //自動(dòng)裝載值
- TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //分頻系數(shù)
- TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
- TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //設(shè)置向上計(jì)數(shù)模式
- TIM_TimeBaseInit(TIM5,&TIM_TimeBaseInitStructure);
-
- TIM_ICInitStructure.TIM_Channel=TIM_Channel_2; //通道2
- TIM_ICInitStructure.TIM_ICFilter=0x00; //濾波
- TIM_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;//捕獲極性
- TIM_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1; //分頻系數(shù)
- TIM_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;//直接映射到TI1
- TIM_ICInit(TIM5,&TIM_ICInitStructure);
-
- TIM_Cmd(TIM5,ENABLE); //使能定時(shí)器
- }
- /*******************************************************************************
- * 函 數(shù) 名 : Touch_Reset
- * 函數(shù)功能 : 觸摸按鍵復(fù)位 先放電然后充電并釋放計(jì)時(shí)器內(nèi)的值
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- void Touch_Reset(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出模式
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度為50MHz
- GPIO_Init(GPIOA, &GPIO_InitStructure);
-
- GPIO_ResetBits(GPIOA,GPIO_Pin_0);//輸出0,放電
- delay_ms(5);
- TIM_ClearFlag(TIM5, TIM_FLAG_CC2|TIM_FLAG_Update); //清除標(biāo)志
- TIM_SetCounter(TIM5,0); //歸0
-
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空輸入模式
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- }
- /*******************************************************************************
- * 函 數(shù) 名 : Touch_Get_Val
- * 函數(shù)功能 : 返回捕獲高電平值
- * 輸 入 : 無
- * 輸 出 : 捕獲高電平值
- *******************************************************************************/
- u16 Touch_Get_Val(void)
- {
- Touch_Reset();
- while(TIM_GetFlagStatus(TIM5,TIM_FLAG_CC2)==0) //等待捕獲到高電平標(biāo)志
- {
- if(TIM_GetCounter(TIM5)>Touch_ARR_MAX_VAL-500) //超時(shí)了直接返回CNT值
- {
- return TIM_GetCounter(TIM5);
- }
- }
- return TIM_GetCapture2(TIM5); //返回捕獲高電平值
- }
- /*******************************************************************************
- * 函 數(shù) 名 : Touch_Key_Init
- * 函數(shù)功能 : 觸摸按鍵初始化
- * 輸 入 : 無
- * 輸 出 : 0:正常
- 1:不正常
- *******************************************************************************/
- u8 Touch_Key_Init(u8 psc)
- {
- u8 i;
- u16 buf[10];
- u8 j;
- u16 temp;
- TIM5_CH2_Input_Init(Touch_ARR_MAX_VAL,psc);
-
- for(i=0;i<10;i++) //讀取10次為按下時(shí)候的觸摸值
- {
- buf[i]=Touch_Get_Val();
- delay_ms(10);
- }
-
- for(i=0;i<9;i++) //從小到大排序
- {
- for(j=i+1;j<10;j++)
- {
- if(buf[i]>buf[j])
- {
- temp=buf[i];
- buf[j]=buf[j];
- buf[j]=temp;
- }
- }
- }
-
- temp=0;
- for(i=2;i<8;i++) //取中間6個(gè)數(shù)值求和 取其平均數(shù)
- {
- temp+=buf[i];
- }
- touch_default_val=temp/6;
- printf("touch_default_val=%d \r\n",touch_default_val);
- if(touch_default_val>Touch_ARR_MAX_VAL/2)
- {
- return 1;//初始化遇到超過Touch_ARR_MAX_VAL/2的數(shù)值,不正常!
- }
- return 0;
- }
- /*******************************************************************************
- * 函 數(shù) 名 : Touch_Get_MaxVal
- * 函數(shù)功能 : 讀取n次,取最大值
- * 輸 入 : n:連續(xù)獲取的次數(shù)
- * 輸 出 : n次讀數(shù)里面讀到的最大讀數(shù)值
- *******************************************************************************/
- u16 Touch_Get_MaxVal(u8 n)
- {
- u16 temp=0;
- u16 res=0;
- while(n--)
- {
- temp=Touch_Get_Val();//得到一次值
- if(temp>res)res=temp;
- }
- return res;
- }
- /*******************************************************************************
- * 函 數(shù) 名 : Touch_Key_Scan
- * 函數(shù)功能 : 觸摸按鍵掃描
- * 輸 入 : 0:不支持連續(xù)觸發(fā)(按下一次必須松開才能按下一次)
- 1:支持連續(xù)觸發(fā)(可以一直按下)
- * 輸 出 : 0:沒有按下
- 1:有按下
- *******************************************************************************/
- #define TOUCH_GATE_VAL 100 //觸摸的門限值,也就是必須大于tpad_default_val+TOUCH_GATE_VAL,才認(rèn)為是有效觸摸.
- u8 Touch_Key_Scan(u8 mode)
- {
- static u8 keyen=0; //0,可以開始檢測;>0,還不能開始檢測
- u8 res=0;
- u8 sample=3; //默認(rèn)采樣次數(shù)為3次
- u16 rval;
- if(mode)
- {
- sample=6; //支持連按的時(shí)候,設(shè)置采樣次數(shù)為6次
- keyen=0; //支持連按
- }
- rval=Touch_Get_MaxVal(sample);
- if(rval>(touch_default_val+TOUCH_GATE_VAL)&&rval<(10*touch_default_val))//大于touch_default_val+TPAD_GATE_VAL,且小于10倍touch_default_val,則有效
- {
- if((keyen==0)&&(rval>(touch_default_val+TOUCH_GATE_VAL))) //大于touch_default_val+TOUCH_GATE_VAL,有效
- {
- res=1;
- }
- printf("觸摸后捕獲高電平值為:%d\r\n",rval);
- keyen=3; //至少要再過3次之后才能按鍵有效
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
光電門測速.rar
(547.93 KB, 下載次數(shù): 14)
2018-9-14 03:56 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
chengxu.rar
(455.96 KB, 下載次數(shù): 14)
2018-9-14 03:56 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
|