|
分享一個(gè)超聲波的程序,實(shí)測(cè)可用。
單片機(jī)源程序如下:
- #include "tim_wave.h"
- #include "systick.h"
- #include "usart.h"
- #include "bsp_led.h"
- #include "wave3.h"
- // 中斷優(yōu)先級(jí)配置
- static void GENERAL_TIM_NVIC_Config(void)
- {
- NVIC_InitTypeDef NVIC_InitStructure;
-
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); // 設(shè)置中斷組為0
-
- NVIC_InitStructure.NVIC_IRQChannel = WAVE_TIM_IRQ ; // 設(shè)置中斷來(lái)源
-
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 設(shè)置主優(yōu)先級(jí)為 0
-
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; // 設(shè)置搶占優(yōu)先級(jí)為3
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- }
- static void GENERAL_TIM_GPIO_Config(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- // 輸入捕獲通道 GPIO 初始化
- RCC_APB2PeriphClockCmd(WAVE1_TIM_CH1_GPIO_CLK, ENABLE);
- GPIO_InitStructure.GPIO_Pin = WAVE1_TIM_CH1_PIN;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
- GPIO_Init(WAVE1_TIM_CH1_PORT, &GPIO_InitStructure);
- /*-----------------------------------------------------------------------------------------------------------------*/
- RCC_APB2PeriphClockCmd(WAVE2_TIM_CH1_GPIO_CLK, ENABLE);
- GPIO_InitStructure.GPIO_Pin = WAVE2_TIM_CH1_PIN;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
- GPIO_Init(WAVE2_TIM_CH1_PORT, &GPIO_InitStructure);
- /*-----------------------------------------------------------------------------------------------------------------*/
- }
- ///*
- // * 注意:TIM_TimeBaseInitTypeDef結(jié)構(gòu)體里面有5個(gè)成員,TIM6和TIM7的寄存器里面只有
- // * TIM_Prescaler和TIM_Period,所以使用TIM6和TIM7的時(shí)候只需初始化這兩個(gè)成員即可,
- // * 另外三個(gè)成員是通用定時(shí)器和高級(jí)定時(shí)器才有.
- // *-----------------------------------------------------------------------------
- // *typedef struct
- // *{ TIM_Prescaler 都有
- // * TIM_CounterMode TIMx,x[6,7]沒(méi)有,其他都有
- // * TIM_Period 都有
- // * TIM_ClockDivision TIMx,x[6,7]沒(méi)有,其他都有
- // * TIM_RepetitionCounter TIMx,x[1,8,15,16,17]才有
- // *}TIM_TimeBaseInitTypeDef;
- // *-----------------------------------------------------------------------------
- // */
- /* ---------------- PWM信號(hào) 周期和占空比的計(jì)算--------------- */
- // ARR :自動(dòng)重裝載寄存器的值
- // CLK_cnt:計(jì)數(shù)器的時(shí)鐘,等于 Fck_int / (psc+1) = 72M/(psc+1)
- // PWM 信號(hào)的周期 T = ARR * (1/CLK_cnt) = ARR*(PSC+1) / 72M
- // 占空比P=CCR/(ARR+1)
- static void GENERAL_TIM_Mode_Config(void)
- {
- // 開(kāi)啟定時(shí)器時(shí)鐘,即內(nèi)部時(shí)鐘CK_INT=72M
- WAVE_TIM_APBxClock_FUN(WAVE_TIM_CLK,ENABLE);
- /*--------------------時(shí)基結(jié)構(gòu)體初始化-------------------------*/
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- // 自動(dòng)重裝載寄存器的值,累計(jì)TIM_Period+1個(gè)頻率后產(chǎn)生一個(gè)更新或者中斷
- TIM_TimeBaseStructure.TIM_Period=WAVE_TIM_PERIOD;
- // 驅(qū)動(dòng)CNT計(jì)數(shù)器的時(shí)鐘 = Fck_int/(psc+1)
- TIM_TimeBaseStructure.TIM_Prescaler= WAVE_TIM_PSC;
- // 時(shí)鐘分頻因子 ,配置死區(qū)時(shí)間時(shí)需要用到
- TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
- // 計(jì)數(shù)器計(jì)數(shù)模式,設(shè)置為向上計(jì)數(shù)
- TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
- // 重復(fù)計(jì)數(shù)器的值,沒(méi)用到不用管
- TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
- // 初始化定時(shí)器
- TIM_TimeBaseInit(WAVE_TIM, &TIM_TimeBaseStructure);
- /*--------------------輸入捕獲結(jié)構(gòu)體初始化-------------------*/
- TIM_ICInitTypeDef TIM_ICInitStructure;
- // 配置輸入捕獲的通道,需要根據(jù)具體的GPIO來(lái)配置
- TIM_ICInitStructure.TIM_Channel = WAVE1_TIM_CHANNEL_x;
- // 輸入捕獲信號(hào)的極性配置
- TIM_ICInitStructure.TIM_ICPolarity = WAVE_TIM_STRAT_ICPolarity;
- // 輸入通道和捕獲通道的映射關(guān)系,有直連和非直連兩種
- TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
- // 輸入的需要被捕獲的信號(hào)的分頻系數(shù)
- TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
- // 輸入的需要被捕獲的信號(hào)的濾波系數(shù)
- TIM_ICInitStructure.TIM_ICFilter = 0;
- // 定時(shí)器輸入捕獲初始化
- TIM_ICInit(WAVE_TIM, &TIM_ICInitStructure);
- /*---------------------------------------------------------------------------------------------------------------*/
- TIM_ICInitStructure.TIM_Channel = WAVE2_TIM_CHANNEL_x;
- // 輸入捕獲信號(hào)的極性配置
- TIM_ICInitStructure.TIM_ICPolarity = WAVE_TIM_STRAT_ICPolarity;
- // 輸入通道和捕獲通道的映射關(guān)系,有直連和非直連兩種
- TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
- // 輸入的需要被捕獲的信號(hào)的分頻系數(shù)
- TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
- // 輸入的需要被捕獲的信號(hào)的濾波系數(shù)
- TIM_ICInitStructure.TIM_ICFilter = 0;
- // 定時(shí)器輸入捕獲初始化
- TIM_ICInit(WAVE_TIM, &TIM_ICInitStructure);
- /*---------------------------------------------------------------------------------------------------------------*/
- // 清除更新和捕獲中斷標(biāo)志位
- TIM_ClearFlag(WAVE_TIM, TIM_FLAG_Update|WAVE1_TIM_IT_CCx|WAVE2_TIM_IT_CCx);
- // 開(kāi)啟更新和捕獲中斷
- TIM_ITConfig (WAVE_TIM, TIM_IT_Update |WAVE1_TIM_IT_CCx|WAVE2_TIM_IT_CCx, ENABLE );
-
- // 使能計(jì)數(shù)器
- TIM_Cmd(WAVE_TIM, ENABLE);
- }
- static void WAVE_TRIG_Config(void)
- {
-
- GPIO_InitTypeDef GPIO_InitStructure; //定義TRIG_GPIO結(jié)構(gòu)體
-
- RCC_APB2PeriphClockCmd(WAVE1_TRIG_GPIO_CLK, ENABLE);
- GPIO_InitStructure.GPIO_Pin = WAVE1_TRIG_GPIO_PIN;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(WAVE1_TRIG_GPIO_PORT, &GPIO_InitStructure);
- /*------------------------------------------------------------------------------------------------------------------*/
- RCC_APB2PeriphClockCmd(WAVE2_TRIG_GPIO_CLK, ENABLE);
- GPIO_InitStructure.GPIO_Pin = WAVE2_TRIG_GPIO_PIN;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(WAVE2_TRIG_GPIO_PORT, &GPIO_InitStructure);
- /*------------------------------------------------------------------------------------------------------------------*/
- }
- void WAVE_Start(void)
- {
- //Time_Start();
- GPIO_SetBits(WAVE1_TRIG_GPIO_PORT,WAVE1_TRIG_GPIO_PIN);
- GPIO_SetBits(WAVE2_TRIG_GPIO_PORT,WAVE2_TRIG_GPIO_PIN);
- SysTick_Delay_us(20);
- GPIO_ResetBits(WAVE1_TRIG_GPIO_PORT,WAVE1_TRIG_GPIO_PIN);
- GPIO_ResetBits(WAVE2_TRIG_GPIO_PORT,WAVE2_TRIG_GPIO_PIN);
- //SysTick_Delay_ms(20);
- }
- extern float Distance1,Distance2;
- extern u8 W1_TIM3CH1_CAPTURE_STA,W2_TIM3CH1_CAPTURE_STA; //輸入捕獲狀態(tài)
- //bit7:捕獲完成標(biāo)志
- //bit6:捕獲到高點(diǎn)平標(biāo)志
- //bit5~0:捕獲到高電平后定時(shí)器溢出的次數(shù)
- extern u32 W1_TIM3CH1_CAPTURE_VAL,W2_TIM3CH1_CAPTURE_VAL;//輸入捕獲值
- uint32_t time1,time2;
- void Dis_Print(void)
- {
- if(W1_TIM3CH1_CAPTURE_STA&0X80) //成功捕獲到了一次高電平
- {
- time1=W1_TIM3CH1_CAPTURE_STA&0X3F;
- time1*=5000; //溢出時(shí)間總和
- time1+=W1_TIM3CH1_CAPTURE_VAL; //得到總的高電平時(shí)間
- Distance1=time1*340/200.0;
- //printf("Distance1:%f cm\r\n",Distance1);
- //printf("Time1:%d s\r\n",time1);
- W1_TIM3CH1_CAPTURE_STA=0; //開(kāi)啟下一次捕獲
- }
- if(W2_TIM3CH1_CAPTURE_STA&0X80) //成功捕獲到了一次高電平
- {
- time2=W2_TIM3CH1_CAPTURE_STA&0X3F;
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
tim_wave.rar
(3.02 KB, 下載次數(shù): 172)
2017-5-12 16:48 上傳
點(diǎn)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|