国产精品久久久久影院,成人午夜福利视频,国产精品久久久久高潮,国产精品 欧美 亚洲 制服,国产精品白浆无码流出

歷史上的今天

今天是:2024年09月18日(星期三)

正在發(fā)生

2021年09月18日 | 【STM32模塊化程序】定時(shí)器輸入捕獲實(shí)現(xiàn)超聲波測(cè)距

發(fā)布者:快樂舞蹈 來源: eefocus關(guān)鍵字:STM32  模塊化程序  定時(shí)器  輸入捕獲  超聲波測(cè)距 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

一、輸入捕獲介紹

輸入捕獲模式可以用來測(cè)量脈沖寬度或者測(cè)量頻率。


除了基本定時(shí)器,通用和高級(jí)均有輸入捕獲功能。


TIMx_CCMR1(捕獲/比較模式寄存器) - 通道1和2的控制

TIMx_CCMR2(捕獲/比較模式寄存器) - 通道3和4的控制


以下將分別使用通用定時(shí)器和高級(jí)定時(shí)器實(shí)現(xiàn)超聲波測(cè)距。需要說明的是,代碼中的TIM×CH×_CAPTURE_STA我們定義其低八位含義如下:

在這里插入圖片描述

二、通用/高級(jí)定時(shí)器實(shí)現(xiàn)超聲波測(cè)距

通用定時(shí)器輸入捕獲以TIM3的CH3為例,對(duì)應(yīng)IO為PB1。PB0實(shí)現(xiàn)觸發(fā)功能


當(dāng)然還需要配合printf一起使用,<參考這里>


完整工程可見github<傳送門>


timer.c


#include "timer.h"

#include "delay.h"

#include "usart.h"



//**************以下TIM1實(shí)現(xiàn)超聲波測(cè)距****************//

u16 TIM1CH1_CAPTURE_STA,TIM1CH1_CAPTURE_VAL;


void TIM1_Cap_Init(u16 arr,u16 psc)

{

GPIO_InitTypeDef GPIO_InitStructure;

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

NVIC_InitTypeDef NVIC_InitStructure;

TIM_ICInitTypeDef TIM_ICInitStructure;


RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);  //使能GPIOB時(shí)鐘



GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_1;     

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;     //PB1輸出 

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;     //2M

GPIO_Init(GPIOB, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;  

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; 

GPIO_Init(GPIOA, &GPIO_InitStructure);



TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);//設(shè)置缺省值,這一步最好加上

TIM_TimeBaseStructure.TIM_Period = arr; //自動(dòng)重裝載寄存器周期的值,溢出值

TIM_TimeBaseStructure.TIM_Prescaler =psc; //時(shí)鐘頻率預(yù)分頻值

TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //設(shè)置時(shí)鐘分割:輸入捕獲模式用來濾波

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上計(jì)數(shù)模式

TIM_TimeBaseStructure.TIM_RepetitionCounter=0;//設(shè)置重復(fù)溢出次數(shù),就是多少次溢出后進(jìn)入中斷,一般為0,只有高級(jí)定時(shí)器才有用

TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); 



TIM_ICStructInit(&TIM_ICInitStructure);//設(shè)置缺省值,這一步最好加上

TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕獲

TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上

TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;   //配置輸入分頻,不分頻 

TIM_ICInitStructure.TIM_ICFilter = 0x00;   //IC1F=0000 配置輸入濾波器 0不濾波

TIM_ICInitStructure.TIM_Channel = TIM_Channel_1; //IC1映射到TI1上,這四句不能合并

TIM_ICInit(TIM1, &TIM_ICInitStructure);


//中斷分組初始化

NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn;  

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; 

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; 

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 

NVIC_Init(&NVIC_InitStructure);   


TIM_ITConfig(TIM1,TIM_IT_Update|TIM_IT_CC1,ENABLE);   //允許更新中斷,允許CC1IE,CC2IE,CC3IE,CC4IE捕獲中斷

TIM_CtrlPWMOutputs(TIM1,ENABLE); //主輸出使能

TIM_Cmd(TIM1, ENABLE); //使能定時(shí)器1

}


void Read_TIM1Distane(void)

{   

PBout(1)=1;

delay_us(15);  

PBout(1)=0;

if(TIM1CH1_CAPTURE_STA&0X80)

{

Distance=TIM1CH1_CAPTURE_STA&0X3F;

Distance*=65536;         //溢出時(shí)間總和

Distance+=TIM1CH1_CAPTURE_VAL; //得到總的高電平時(shí)間

Distance = Distance*170/1000;

printf("%d rn",Distance);

TIM1CH1_CAPTURE_STA = 0;

}

}


void TIM1_CC_IRQHandler(void)

{

if((TIM1CH1_CAPTURE_STA&0X80) == 0)

{

if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET)

{

  //通道1

if(TIM1CH1_CAPTURE_STA&0X40)//已經(jīng)捕獲到高電平了

{

if((TIM1CH1_CAPTURE_STA&0X3F)==0X3F)//高電平太長(zhǎng)了

{

TIM1CH1_CAPTURE_STA|=0X80;

TIM1CH1_CAPTURE_VAL = 0xFFFF;

}

else

{

TIM1CH1_CAPTURE_STA++;

}

}

}


//通道1

if (TIM_GetITStatus(TIM1, TIM_IT_CC1) != RESET) //捕獲1發(fā)生捕獲事件

{

if (TIM1CH1_CAPTURE_STA & 0X40) //捕獲到一個(gè)下降沿

{

TIM1CH1_CAPTURE_STA|=0X80;

TIM1CH1_CAPTURE_VAL = TIM_GetCapture1(TIM1);//記錄下此時(shí)的定時(shí)器計(jì)數(shù)值

TIM_OC1PolarityConfig(TIM1, TIM_ICPolarity_Rising); //設(shè)置為上升沿捕獲

}

else //發(fā)生捕獲時(shí)間但不是下降沿,第一次捕獲到上升沿,記錄此時(shí)的定時(shí)器計(jì)數(shù)值

{

TIM1CH1_CAPTURE_STA = 0;

TIM1CH1_CAPTURE_VAL = 0;

TIM1CH1_CAPTURE_STA |= 0X40; //標(biāo)記已捕獲到上升沿

TIM_SetCounter(TIM1, 0); //清空計(jì)數(shù)器

TIM_OC1PolarityConfig(TIM1, TIM_ICPolarity_Falling);//設(shè)置為下降沿捕獲

}

}

}

    TIM_ClearITPendingBit(TIM1, TIM_IT_CC1|TIM_IT_Update); //清除中斷標(biāo)志位

}


//**************以下TIM3實(shí)現(xiàn)超聲波測(cè)距****************//

u16 TIM3CH3_CAPTURE_STA,TIM3CH3_CAPTURE_VAL;


void TIM3_Cap_Init(u16 arr,u16 psc)

{  

GPIO_InitTypeDef GPIO_InitStructure;

TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

NVIC_InitTypeDef NVIC_InitStructure;

TIM_ICInitTypeDef  TIM3_ICInitStructure;


RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能TIM3時(shí)鐘

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);  //使能GPIOB時(shí)鐘


GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0; 

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PB0 輸入  

GPIO_Init(GPIOB, &GPIO_InitStructure);


GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_1;     

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;     //PB1輸出 

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;     //2M

GPIO_Init(GPIOB, &GPIO_InitStructure);


//初始化定時(shí)器3 TIM3  

TIM_TimeBaseStructure.TIM_Period = arr; //設(shè)定計(jì)數(shù)器自動(dòng)重裝值 

TIM_TimeBaseStructure.TIM_Prescaler =psc; //預(yù)分頻器   

TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //設(shè)置時(shí)鐘分割:TDTS = Tck_tim

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上計(jì)數(shù)模式

TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根據(jù)TIM_TimeBaseInitStruct中指定的參數(shù)初始化TIMx的時(shí)間基數(shù)單位


//初始化TIM3輸入捕獲參數(shù)

TIM3_ICInitStructure.TIM_Channel = TIM_Channel_3; //CC1S=03 選擇輸入端 IC3映射到TI1上

TIM3_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕獲

TIM3_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;

TIM3_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置輸入分頻,不分頻 

TIM3_ICInitStructure.TIM_ICFilter = 0x00;//配置輸入濾波器 不濾波

TIM_ICInit(TIM3, &TIM3_ICInitStructure);


//中斷分組初始化

NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中斷

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;  //先占優(yōu)先級(jí)2級(jí)

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;  //從優(yōu)先級(jí)0級(jí)

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能

NVIC_Init(&NVIC_InitStructure);  //根據(jù)NVIC_InitStruct中指定的參數(shù)初始化外設(shè)NVIC寄存器

TIM_ITConfig(TIM3,TIM_IT_Update|TIM_IT_CC3,ENABLE);//允許更新中斷 ,允許CC3IE捕獲中斷

TIM_Cmd(TIM3,ENABLE ); //使能定時(shí)器3

}


void Read_TIM3Distane(void)

{   

PBout(1)=1;

delay_us(15);  

PBout(1)=0;

if(TIM3CH3_CAPTURE_STA&0X80)//成功捕獲到了一次高電平

{

Distance=TIM3CH3_CAPTURE_STA&0X3F;

Distance*=65536;         //溢出時(shí)間總和

Distance+=TIM3CH3_CAPTURE_VAL; //得到總的高電平時(shí)間

Distance=Distance*170/1000;

printf("%d rn",Distance);

TIM3CH3_CAPTURE_STA=0; //開啟下一次捕獲

}

}


void TIM3_IRQHandler(void)

{           

if((TIM3CH3_CAPTURE_STA&0X80)==0)//還未成功捕獲

{

if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)//溢出

{     

if(TIM3CH3_CAPTURE_STA&0X40)//已經(jīng)捕獲到高電平了

{

if((TIM3CH3_CAPTURE_STA&0X3F)==0X3F)//高電平太長(zhǎng)了

{

TIM3CH3_CAPTURE_STA|=0X80;//標(biāo)記成功捕獲了一次

TIM3CH3_CAPTURE_VAL=0XFFFF;

}

else 

TIM3CH3_CAPTURE_STA++;

}  

}

if (TIM_GetITStatus(TIM3, TIM_IT_CC3) != RESET)//捕獲3發(fā)生捕獲事件

{

if(TIM3CH3_CAPTURE_STA&0X40) //捕獲到一個(gè)下降沿

{  

TIM3CH3_CAPTURE_STA|=0X80; //標(biāo)記成功捕獲到一次高電平脈寬

TIM3CH3_CAPTURE_VAL=TIM_GetCapture3(TIM3); //獲取當(dāng)前的捕獲值.

TIM_OC3PolarityConfig(TIM3, TIM_ICPolarity_Rising); //設(shè)置為上升沿捕獲

}

else  //還未開始,第一次捕獲上升沿

{

TIM3CH3_CAPTURE_STA=0; //清空

TIM3CH3_CAPTURE_VAL=0;

TIM3CH3_CAPTURE_STA|=0X40; //標(biāo)記捕獲到了上升沿

TIM_SetCounter(TIM3, 0); //清空計(jì)數(shù)器

TIM_OC3PolarityConfig(TIM3, TIM_ICPolarity_Falling);//設(shè)置為下降沿捕獲

}     

}              

}

TIM_ClearITPendingBit(TIM3, TIM_IT_Update|TIM_IT_CC3); //清除中斷標(biāo)志位

}


timer.h


#ifndef __TIMERs_H

#define __TIMERs_H

#include "sys.h"

#include "stm32f10x.h"


extern u32 Distance;


//******TIM1相關(guān)***********//


void TIM1_Cap_Init(u16 arr,u16 psc);

void Read_TIM1Distane(void);


//******TIM3相關(guān)***********//

void TIM3_Cap_Init(u16 arr,u16 psc);

void Read_TIM3Distane(void);


#endif


main.c


#include "led.h"

#include "delay.h"

#include "sys.h"

#include "usart.h"

#include "timer.h"

 

#define jishu_pinlv_psc 71


/************************************************

 printf使用串口2、波特率115200

 USART2_TX GPIOA.2,USART2_RX GPIOA.3

 

 超聲波測(cè)距【輸入捕獲】

 TIM1_CH1(PA8) 

 TIM3_CH3(PB0)

************************************************/


u32 Distance;

int main(void)

{

delay_init();     //延時(shí)函數(shù)初始化   

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級(jí),2位響應(yīng)優(yōu)先級(jí)

uart_init(115200); //串口初始化為115200

LED_Init();

TIM3_Cap_Init(0xFFFF,71);

printf("okrn");

LED = 0;

while(1)

{

Read_TIM3Distane();

delay_ms(200);

}

}

關(guān)鍵字:STM32  模塊化程序  定時(shí)器  輸入捕獲  超聲波測(cè)距 引用地址:【STM32模塊化程序】定時(shí)器輸入捕獲實(shí)現(xiàn)超聲波測(cè)距

上一篇:原子的串口ISP一鍵下載研究
下一篇:STM32中斷源位置

推薦閱讀

  光伏群英匯印度巡回培訓(xùn)?  9月,古瑞瓦特光伏群英匯全球巡回技術(shù)培訓(xùn)會(huì)在印度拉開序幕,先后在博帕爾、海得拉巴、班加羅爾、普納、新德里、勒克瑙、加爾各七大城市開展培訓(xùn),就戶用、工商業(yè)光伏與儲(chǔ)能逆變器、組件、智慧能源管理等新技術(shù)的應(yīng)用進(jìn)行深度演繹與講解,精彩干貨內(nèi)容吸引了大批客戶參與,收到客戶高度贊許。 ? ?    古瑞瓦特博帕...
據(jù)外媒報(bào)道,Cepton Technologies發(fā)布了最新的Vista激光雷達(dá)傳感器VistaTM-X120,適用于ADAS和自動(dòng)應(yīng)用。(圖片來源:Cepton官網(wǎng))Vista-X120具有120度水平視場(chǎng)角(FOV),0.15度角分辨率,最大探測(cè)范圍可達(dá)200米,反射率為10%,為ADAS和自動(dòng)駕駛汽車提供了出色的激光雷達(dá)解決方案,并且適用于其他自動(dòng)應(yīng)用中的智能機(jī)器。Vista-X120由Cepton的專利微動(dòng)技...
在剛剛的發(fā)布會(huì)上,繼 Apple Watch Series 6 后,蘋果又發(fā)布了外形不落后,價(jià)格更加親民的全新型號(hào)-Apple Watch SE。在發(fā)布會(huì)上蘋果對(duì)于 Apple Watch SE 的描述非常簡(jiǎn)單且快捷,這款產(chǎn)品有 40mm 和 44nm 型號(hào),內(nèi)部采用 S5 芯片,有蜂窩版本和 GPS 版本,支持蜂窩版本的「家庭設(shè)置」。SE 具有與 Series 6 相同的加速度計(jì),陀螺儀,...
續(xù)航焦慮依然普遍存在于電動(dòng)車用戶身上現(xiàn)階段大家對(duì)于電動(dòng)車最擔(dān)心的無(wú)非就是兩點(diǎn):續(xù)航以及安全,只要突破了這兩點(diǎn)會(huì)有更多的消費(fèi)者拋棄燃油車選擇電動(dòng)車。因?yàn)楝F(xiàn)階段在20萬(wàn)出頭價(jià)位的燃油車和電動(dòng)車對(duì)比,除了沒有續(xù)航焦慮之外,沒有哪一點(diǎn)比得上同價(jià)位的電動(dòng)車,請(qǐng)注意是同價(jià)位。電動(dòng)車在動(dòng)力、擁堵路況時(shí)的平順性、用車成本等方面都要遠(yuǎn)強(qiáng)于同類燃油車...

史海拾趣

小廣播
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號(hào)

 
EEWorld服務(wù)號(hào)

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號(hào) 京ICP備10001474號(hào)-1 電信業(yè)務(wù)審批[2006]字第258號(hào)函 京公網(wǎng)安備 11010802033920號(hào) Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved