找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 36506|回復(fù): 10
打印 上一主題 下一主題
收起左側(cè)

STM32使用ETR引腳進行脈沖計數(shù)程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:105323 發(fā)表于 2016-2-24 17:12 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
今天早上開始做項目中的測速部分,采用3144E開關(guān)型霍爾傳感器數(shù)字輸出,只要單片機采集模塊輸出的脈沖個數(shù),從而即可計算出速度。折騰了一下下,現(xiàn)在寫下思路。

首先總結(jié)下STM32外部脈沖ETR引腳:
TIMER1-----PA12
TIMER2-----PA0
TIMER3-----PD2
TIMER4-----PE0
其他大家有需要再查數(shù)據(jù)手冊的引腳圖即可。
這邊使用使用定時器TIM1的ETR輸入引腳PA12作為采集脈沖輸入引腳,定時器TIM1是16位可自動裝載初始值的高級計數(shù)器,使能GPIO和TIM1時鐘后,把GPIO口配置成浮空輸入模式,自動重裝初始值和分頻系數(shù)大家可以根據(jù)實際情況自己設(shè)置,這邊開啟更新中斷TIM_IT_Update,查了數(shù)據(jù)手冊后發(fā)現(xiàn)中斷向量號是TIM1_UP_IRQn,并不是TIM1_IRQn。
初始化代碼
void TIM1_Counter_Init(u32 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_InitTypeDef  GPIO_InitStructuer;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE); ///使能TIM1時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructuer.GPIO_Pin=GPIO_Pin_12;
GPIO_InitStructuer.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_InitStructuer.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_Init(GPIOA,&GPIO_InitStructuer);
//timer1 NVIC 配置

NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//搶占優(yōu)先級2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;//子優(yōu)先級2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根據(jù)指定的參數(shù)初始化VIC寄存器
  TIM_TimeBaseInitStructure.TIM_Period = arr;//自動重裝載值
TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //定時器分頻
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上計數(shù)模式
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStructure);//初始化TIM1
TIM_ETRClockMode2Config(TIM1, TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInverted, 5);//5次采樣濾波  外部時鐘模式2
TIM_ClearITPendingBit(TIM1,TIM_IT_Update); //清除中斷標志位,避免第一次自動進入中斷一次
TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE);

TIM_SetCounter(TIM1,0);//設(shè)置計數(shù)初值
TIM_Cmd(TIM1,ENABLE); //使能定時器1
}
//定時器1中斷服務(wù)函數(shù)
u8 overflow_cnt=0;//溢出次數(shù)
void TIM1_UP_IRQHandler(void)
{
if(TIM_GetITStatus(TIM1,TIM_IT_Update)==SET) //溢出中斷
{
overflow_cnt++;
printf("\r\n*********測速計數(shù)溢出***********\r\n");
}
TIM_ClearITPendingBit(TIM1,TIM_IT_Update); //清除中斷標志位
}


一開始,中斷服務(wù)函數(shù)名稱寫錯成TIM1_IRQHandler,導(dǎo)致沒有進入中斷,看了下啟動文件中的中斷函數(shù)名發(fā)現(xiàn)定時器1有好幾個中斷函數(shù),于是便看了下數(shù)據(jù)手冊的說明,才發(fā)現(xiàn)是錯了,改正后,程序正常。
主函數(shù)那邊printf("CNT:%d\r\n",TIM_GetCounter(TIM1));獲取計數(shù)值,打開串口調(diào)試助手,再用小磁鋼在模塊旁邊甩動,一開始小磁鋼的方向放錯了,導(dǎo)致計數(shù)值一直沒增加,改用按鍵輸入脈沖調(diào)試了一會想到會不會是因為磁場方向問題,換了下小磁鋼的方向,計數(shù)值就增加了,哎。

因為用了delay函數(shù)延時顯示避免刷屏,所以有點跳數(shù)了,不過數(shù)值還是正確的。


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩

相關(guān)帖子

回復(fù)

使用道具 舉報

沙發(fā)
ID:186426 發(fā)表于 2017-4-12 13:51 | 只看該作者
我也在做速度檢測,求大神完整程序
回復(fù)

使用道具 舉報

板凳
ID:186426 發(fā)表于 2017-4-12 13:53 | 只看該作者
我也在做速度檢測,求大神完整程序
回復(fù)

使用道具 舉報

地板
ID:317046 發(fā)表于 2018-6-5 03:50 | 只看該作者
測出脈沖值后怎么算速度啊
回復(fù)

使用道具 舉報

5#
ID:385496 發(fā)表于 2018-8-12 15:25 | 只看該作者
一波三折 發(fā)表于 2018-6-5 03:50
測出脈沖值后怎么算速度啊

定時讀取數(shù)值,求差值就是速度
回復(fù)

使用道具 舉報

6#
ID:136106 發(fā)表于 2018-9-20 17:20 | 只看該作者
進不了中斷是怎么回事?
回復(fù)

使用道具 舉報

7#
ID:601030 發(fā)表于 2019-10-13 11:15 | 只看該作者
厲害可以的
回復(fù)

使用道具 舉報

8#
ID:660599 發(fā)表于 2019-12-10 14:46 | 只看該作者
樓主,請問TIM2的配置不一樣嗎?我這么配置 讀取的數(shù)據(jù)一直為0呢
void TIM2_Int_Init(void)                                                //配置 TIM2_CH1_ETR 為外部脈沖計數(shù)
{       
                GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
       
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);                 //使能GPIOA,使能AFIO時鐘
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);                        //使能定時器2

                GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_15;                       
                GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
                GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
                GPIO_Init(GPIOA, &GPIO_InitStructure);
                //GPIO_PinRemapConfig(GPIO_FullRemap_TIM2,ENABLE);                //默認 TIM2_ETR 端口為 PA0, 不需要映射
    //配置TIMER2作為計數(shù)器
                TIM_DeInit(TIM2);                //缺省模式

    //初始化定時器2 TIM2   
    TIM_TimeBaseStructure.TIM_Period = 0xFFFF;              //設(shè)定計數(shù)器自動重裝值
    TIM_TimeBaseStructure.TIM_Prescaler =0;             //預(yù)分頻器   
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //設(shè)置時鐘分割:TDTS = Tck_tim
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上計數(shù)模式
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);         //根據(jù)TIM_TimeBaseInitStruct中指定的參數(shù)初始化TIMx的時間基數(shù)單位
               
                //TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); //允許定時器2更新中斷
    TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0);                //外部時鐘輸入2,上升沿觸發(fā),無濾波

    TIM_SetCounter(TIM2,0);        //清楚計數(shù)器
    TIM_Cmd(TIM2,ENABLE);          //使能定時器
               
}
回復(fù)

使用道具 舉報

9#
ID:367920 發(fā)表于 2020-3-24 15:14 | 只看該作者
按照樓主的配置是進不了中斷的。。。。
回復(fù)

使用道具 舉報

10#
ID:320340 發(fā)表于 2020-8-12 11:37 | 只看該作者
void TIM8_NVIC_Init(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);                 
    NVIC_InitStructure.NVIC_IRQChannel = TIM8_UP_IRQn;  
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);  
}

void TIM8_ETR_GPIO_Init(void)        //PA0
{
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
       
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50M
        GPIO_Init(GPIOA, &GPIO_InitStructure);
}

void TIM8_Init(void)
{
                TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;
       
                TIM_DeInit(TIM8);
               
                TIM8_NVIC_Init();
               
                TIM_TimeBaseStructure.TIM_Period = 65000;//¼Æêyμ½65000¾í½øèëÖD¶Ï
                TIM_TimeBaseStructure.TIM_Prescaler = 0x00;
                TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
                TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
//                TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;//??????????  
                TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure); // Time base configuration
               
                TIM_ETRClockMode2Config(TIM8, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 2);
                TIM_ClearITPendingBit(TIM8,TIM_IT_Update);
               
                TIM_ITConfig(TIM8,TIM_IT_Update,ENABLE );
               
                TIM_SetCounter(TIM8, 0);
                TIM_Cmd(TIM8, ENABLE);
}
我的TIM8_ETR實際輸入頻率到50Khz以后就亂了  不知道為什么  
回復(fù)

使用道具 舉報

11#
ID:830876 發(fā)表于 2021-5-7 14:23 | 只看該作者
1027082796 發(fā)表于 2019-12-10 14:46
樓主,請問TIM2的配置不一樣嗎?我這么配置 讀取的數(shù)據(jù)一直為0呢
void TIM2_Int_Init(void)                                                //配置 TI ...

兄弟,解決沒有,我可以進入中斷,在串口讀到中斷次數(shù)沒問題,但串口上顯示的脈沖也一直是0,
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表