欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 37501|回復: 10
收起左側

STM32使用ETR引腳進行脈沖計數程序

[復制鏈接]
ID:105323 發表于 2016-2-24 17:12 | 顯示全部樓層 |閱讀模式
今天早上開始做項目中的測速部分,采用3144E開關型霍爾傳感器數字輸出,只要單片機采集模塊輸出的脈沖個數,從而即可計算出速度。折騰了一下下,現在寫下思路。

首先總結下STM32外部脈沖ETR引腳:
TIMER1-----PA12
TIMER2-----PA0
TIMER3-----PD2
TIMER4-----PE0
其他大家有需要再查數據手冊的引腳圖即可。
這邊使用使用定時器TIM1的ETR輸入引腳PA12作為采集脈沖輸入引腳,定時器TIM1是16位可自動裝載初始值的高級計數器,使能GPIO和TIM1時鐘后,把GPIO口配置成浮空輸入模式,自動重裝初始值和分頻系數大家可以根據實際情況自己設置,這邊開啟更新中斷TIM_IT_Update,查了數據手冊后發現中斷向量號是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;//搶占優先級2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;//子優先級2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根據指定的參數初始化VIC寄存器
  TIM_TimeBaseInitStructure.TIM_Period = arr;//自動重裝載值
TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //定時器分頻
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上計數模式
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);//設置計數初值
TIM_Cmd(TIM1,ENABLE); //使能定時器1
}
//定時器1中斷服務函數
u8 overflow_cnt=0;//溢出次數
void TIM1_UP_IRQHandler(void)
{
if(TIM_GetITStatus(TIM1,TIM_IT_Update)==SET) //溢出中斷
{
overflow_cnt++;
printf("\r\n*********測速計數溢出***********\r\n");
}
TIM_ClearITPendingBit(TIM1,TIM_IT_Update); //清除中斷標志位
}


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

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


回復

使用道具 舉報

ID:186426 發表于 2017-4-12 13:51 | 顯示全部樓層
我也在做速度檢測,求大神完整程序
回復

使用道具 舉報

ID:186426 發表于 2017-4-12 13:53 | 顯示全部樓層
我也在做速度檢測,求大神完整程序
回復

使用道具 舉報

ID:317046 發表于 2018-6-5 03:50 | 顯示全部樓層
測出脈沖值后怎么算速度啊
回復

使用道具 舉報

ID:385496 發表于 2018-8-12 15:25 | 顯示全部樓層
一波三折 發表于 2018-6-5 03:50
測出脈沖值后怎么算速度啊

定時讀取數值,求差值就是速度
回復

使用道具 舉報

ID:136106 發表于 2018-9-20 17:20 | 顯示全部樓層
進不了中斷是怎么回事?
回復

使用道具 舉報

ID:601030 發表于 2019-10-13 11:15 | 顯示全部樓層
厲害可以的
回復

使用道具 舉報

ID:660599 發表于 2019-12-10 14:46 | 顯示全部樓層
樓主,請問TIM2的配置不一樣嗎?我這么配置 讀取的數據一直為0呢
void TIM2_Int_Init(void)                                                //配置 TIM2_CH1_ETR 為外部脈沖計數
{       
                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作為計數器
                TIM_DeInit(TIM2);                //缺省模式

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

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

使用道具 舉報

ID:367920 發表于 2020-3-24 15:14 | 顯示全部樓層
按照樓主的配置是進不了中斷的。。。。
回復

使用道具 舉報

ID:320340 發表于 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以后就亂了  不知道為什么  
回復

使用道具 舉報

ID:830876 發表于 2021-5-7 14:23 | 顯示全部樓層
1027082796 發表于 2019-12-10 14:46
樓主,請問TIM2的配置不一樣嗎?我這么配置 讀取的數據一直為0呢
void TIM2_Int_Init(void)                                                //配置 TI ...

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

使用道具 舉報

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

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表