99久久全国免费观看_国产一区二区三区四区五区VM_久久www人成免费看片中文_国产高清在线a视频大全_深夜福利www_日韩一级成人av

  • 回復
  • 收藏
  • 點贊
  • 分享
  • 發新帖

stm32定時器實現捕獲脈寬的方法

利用定時器測量脈沖寬度有兩種方法。

  方法1:

  在捕獲中斷函數里改變捕獲信號的觸發沿(上升沿觸發改為下降沿觸發,或者下降沿觸發改為上升沿觸發),通過兩次觸發得到的計數器的差值,來計算出脈沖寬度。這種

  方法需要定時器的配置方法是一樣的,不同的地方在中斷函數里修改觸發沿,以TIM2, 捕獲通道2為例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
if(CapState == 0)
        {
             
            /* First time capture */
            Val1         = TIM_GetCapture2(TIM2);
            CapState     = 1;
             
            /* Change the trigger */
            TIM2->CCER         |=    1UL << 5;
        }
 
        else if(CapState == 1)
        {
            /* Second time capture */
            Val2 = TIM_GetCapture2(TIM2);
             
            /* Change the trigger */
            TIM2->CCER         &=    ~(1UL << 5);
 
            /* Capture computation */
            if (Val2 > Val1)
            {
                CapVal = Val2 - Val1;
            }
            else
            {
                CapVal = ((0xFFFF - Val1) + Val2);
            }
 
        CapState = 0;
     }

  當然,在第一次捕獲的時候將計數器清零,然后第二次捕獲直接讀取捕獲值也是一個不錯的選擇,如下,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
if(CapState == 0)
        {
             
            /* First time capture */
           TIM_GetCapture2(TIM2);
           CapState     = 1;
             
            /* Change the trigger */
            TIM2->CCER         |=    1UL << 5;
 
            /* Clear CNT */
            TIM_SetCounter(TIM2, 0);
        }
 
        else if(CapState == 1)
        {
            /* Second time capture */
            CapVal = TIM_GetCapture2(TIM2);
             
            /* Change the trigger */
            TIM2->CCER         &=    ~(1UL << 5);
 
 
        CapState = 0;
     }

觸發沿的配置在CCER這個寄存器里面,這里直接對寄存器進行操作,具體請查閱STM32F10x的參考說明書。

 

  方法2:

  利用定時器的PWM輸入模式(PWM input mode)。所謂的PWM模式,其實就是利通了定時器捕獲單元映射功能,定時器捕獲單元1(IC1)和捕獲單元2(IC2)可以映射

  到同一個捕獲通道,一個捕獲單元配置成捕獲上升沿信號,另一個捕獲單元配置成捕獲下降沿信號,那么兩個捕獲值的差就是脈沖寬度的值。還是以TIM2, 捕獲通道2

  為例,配置代碼如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void CaptureConfig(void)
{
    TIM_ICInitTypeDef  TIM_ICInitStructure;
     
    TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_IndirectTI;
    TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
    TIM_ICInitStructure.TIM_ICFilter    = 0x0;
    TIM_ICInitStructure.TIM_Channel     = TIM_Channel_1;
    TIM_ICInitStructure.TIM_ICPolarity  = TIM_ICPolarity_Rising;
    TIM_PWMIConfig(TIM2, &TIM_ICInitStructure);
     
    /* TIM enable counter */
    TIM_Cmd(TIM2, ENABLE);
 
    /* Enable the CC1, CC2 Interrupt Request */
    TIM_ITConfig(TIM2, TIM_IT_CC2 | TIM_IT_CC1, ENABLE);
}

各行代碼的意思:

    L2:  指定捕獲單元的映射方式,TIM_ICSelection_IndirectTI 說明捕獲單元1(IC1)和捕獲單元2(IC2)映射到捕獲通道2(TI2,這里是指捕獲通道2,區別

        定時器TIM2),假如該值為TIM_ICSelection_DirectTI,則捕獲單元1(IC1)和捕獲單元2(IC2)映射到捕獲通道1(TI1)。

    L8, L9:  指定捕獲單元觸發的信號沿(上升沿還是下降沿)。TIM_Channel_1對應捕獲單元1(IC1),TIM_Channel_2對應捕獲單元2(IC2)注意這里

          只需要指定一個捕獲單元,另一個捕獲單元將會在調用初始化函數TIM_PWMICConfig時設定為相反的邊沿。

    L16:  允許捕獲單元1和捕獲單元2的中斷。

  這樣,當捕獲通道2(TI2)檢測到上升沿時,捕獲單元1(IC1)將會記錄下計數器的值,同時捕獲單元1的中斷標志位(CC1IF)將置位;

  當捕獲通道2(TI2)檢測到下降沿時,捕獲單元2(IC2)將會記錄下計數器的值,同時捕獲單元2的中斷中斷標志位(CC2F)將置位。

  中斷處理函數示例代碼如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
if(TIM_GetITStatus(DEMOD_CAPTURE_TIM, TIM_IT_CC1) == SET)
    {
        TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);
        TIM_GetCapture1(TIM2);
        TIM_SetCounter(TIM2, 0);
                
    }   
    else if(TIM_GetITStatus(DEMOD_CAPTURE_TIM, TIM_IT_CC2) == SET)
    {
        TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);
        CapVal = TIM_GetCapture2(TIM2);
    }
}

總結:  

      STM32F10x系列的定時器是一個很靈活的東西,想靈活應用它首先要理解它的原理和運作的過程。定時器的捕獲單元和捕獲通道是比較容易混淆的兩個東西

    簡單來說,STM32F10x的每個通用定時器有4個捕獲通道(TI1, TI2, TI3, TI4, 對應4個GPIO口),每個捕獲通道對應一個捕獲單元,即IC1, IC2, IC3, IC4,

    其中捕獲單元1和捕獲單元2可以映射到同一個捕獲通道,TI1或者TI2。

全部回復(3)
正序查看
倒序查看
2020-10-28 10:27
0
回復
jsapin
LV.5
3
2020-10-28 21:18
@電源網-fqd
[圖片]
學習
0
回復
2022-03-10 16:18

大概了解上述小點后,這里說明我們本次測試使用到的PWM輸入模式,它是最便捷的測量脈寬和頻率的方法。當使用PWM 輸入模式的時候,因為一個輸入通道

    (TIx)會占用兩個捕獲通道(ICx),所以一個定時器在使用PWM輸入的時候最多只能使用兩個輸入通道(TIx)。本次試驗就是使用TIM1的CH1 和CH2。

    工作原理是這樣的:

      PWM 信號由輸入通道TI1 進入,因為是PWM 輸入模式的緣故,信號會被分為兩路,一路是TI1FP1,另外一路是TI2FP2。其中一路是周期,另一路是占空比,

    具體哪一路信號對應周期還是占空比,得從程序上設置哪一路信號作為觸發輸入,作為觸發輸入的哪一路信號對應的就是周期,另一路就是對應占空比。作為觸發

    輸入的那一路信號還需要設置極性,是上升沿還是下降沿捕獲,一旦設置好觸發輸入的極性,另外一路硬件就會自動配置為相反的極性捕獲,無需軟件配置。一句

    話概括就是:選定輸入通道,確定觸發信號,然后設置觸發信號的極性即可,因為是PWM 輸入的緣故,另一路信號則由硬件配置,無需軟件配置。

      當使用PWM 輸入模式的時候必須將從模式控制器配置為復位模式(配置寄存器SMCR 的位SMS[2:0]來實現),即當我們啟動觸發信號開始進行捕獲的時候,

0
回復
主站蜘蛛池模板: 亚洲av无码免费成人av | 9999热视频在线观看 | 国产成人精品午夜2022 | 欧美日韩国产高清一区二区三区 | av中文在线资源 | 斗罗大陆3龙王传说第四季免费观看 | 麻豆影院 | 亚洲成人高清av | 韩国中文字幕在线观看 | 夜色亚洲 | 亚洲国产精品毛片AV不卡在线 | 日本啪啪网站永久免费 | 免费黄av| 五月花成人网 | 国人国产免费AV影院 | 一本黄色片 | 免费看黄色一级大片 | 日本少妇高潮喷水视频 | 日本aⅴ日本高清视频影片www | 91亚洲国产在人线播放午夜 | 91精品在线影院 | 沦为公交两奶头春药高潮迭起 | 国产女优在线观看 | 亚洲啪啪av无码片 | 国产成人精品不卡 | 无码专区国产精品第一页 | 国内精品久久久久国产盗摄 | 久久久久亚洲AV成人片无码 | 一区二区视频免费看 | 国产精品自产拍在线观看 | 久久人人爽天天玩人人妻精品 | 成人综合在线观看视频 | 色播影院性播影院私人影院 | 午夜影院免费视频 | 久久久无码精品亚洲欧美 | 国产精品久久久久成人av | 国产农村熟妇出轨VIDEOS | 日韩精品99| 中文字幕天堂av | 亚洲熟女色情网中文字幕 | 亚洲国产精品999久久久婷婷 |