性无码一区二区三区在线观看,少妇被爽到高潮在线观看,午夜精品一区二区三区,无码中文字幕人妻在线一区二区三区,无码精品国产一区二区三区免费

  • 回復(fù)
  • 收藏
  • 點(diǎn)贊
  • 分享
  • 發(fā)新帖

stm32定時(shí)器實(shí)現(xiàn)捕獲脈寬的方法

利用定時(shí)器測(cè)量脈沖寬度有兩種方法。

  方法1:

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

  方法需要定時(shí)器的配置方法是一樣的,不同的地方在中斷函數(shù)里修改觸發(fā)沿,以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;
     }

  當(dāng)然,在第一次捕獲的時(shí)候?qū)⒂?jì)數(shù)器清零,然后第二次捕獲直接讀取捕獲值也是一個(gè)不錯(cuò)的選擇,如下,

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;
     }

觸發(fā)沿的配置在CCER這個(gè)寄存器里面,這里直接對(duì)寄存器進(jìn)行操作,具體請(qǐng)查閱STM32F10x的參考說明書。

 

  方法2:

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

  到同一個(gè)捕獲通道,一個(gè)捕獲單元配置成捕獲上升沿信號(hào),另一個(gè)捕獲單元配置成捕獲下降沿信號(hào),那么兩個(gè)捕獲值的差就是脈沖寬度的值。還是以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,區(qū)別

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

    L8, L9:  指定捕獲單元觸發(fā)的信號(hào)沿(上升沿還是下降沿)。TIM_Channel_1對(duì)應(yīng)捕獲單元1(IC1),TIM_Channel_2對(duì)應(yīng)捕獲單元2(IC2)注意這里

          只需要指定一個(gè)捕獲單元,另一個(gè)捕獲單元將會(huì)在調(diào)用初始化函數(shù)TIM_PWMICConfig時(shí)設(shè)定為相反的邊沿。

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

  這樣,當(dāng)捕獲通道2(TI2)檢測(cè)到上升沿時(shí),捕獲單元1(IC1)將會(huì)記錄下計(jì)數(shù)器的值,同時(shí)捕獲單元1的中斷標(biāo)志位(CC1IF)將置位;

  當(dāng)捕獲通道2(TI2)檢測(cè)到下降沿時(shí),捕獲單元2(IC2)將會(huì)記錄下計(jì)數(shù)器的值,同時(shí)捕獲單元2的中斷中斷標(biāo)志位(CC2F)將置位。

  中斷處理函數(shù)示例代碼如下:

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);
    }
}

總結(jié):  

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

    簡(jiǎn)單來說,STM32F10x的每個(gè)通用定時(shí)器有4個(gè)捕獲通道(TI1, TI2, TI3, TI4, 對(duì)應(yīng)4個(gè)GPIO口),每個(gè)捕獲通道對(duì)應(yīng)一個(gè)捕獲單元,即IC1, IC2, IC3, IC4,

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

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

大概了解上述小點(diǎn)后,這里說明我們本次測(cè)試使用到的PWM輸入模式,它是最便捷的測(cè)量脈寬和頻率的方法。當(dāng)使用PWM 輸入模式的時(shí)候,因?yàn)橐粋€(gè)輸入通道

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

    工作原理是這樣的:

      PWM 信號(hào)由輸入通道TI1 進(jìn)入,因?yàn)槭荘WM 輸入模式的緣故,信號(hào)會(huì)被分為兩路,一路是TI1FP1,另外一路是TI2FP2。其中一路是周期,另一路是占空比,

    具體哪一路信號(hào)對(duì)應(yīng)周期還是占空比,得從程序上設(shè)置哪一路信號(hào)作為觸發(fā)輸入,作為觸發(fā)輸入的哪一路信號(hào)對(duì)應(yīng)的就是周期,另一路就是對(duì)應(yīng)占空比。作為觸發(fā)

    輸入的那一路信號(hào)還需要設(shè)置極性,是上升沿還是下降沿捕獲,一旦設(shè)置好觸發(fā)輸入的極性,另外一路硬件就會(huì)自動(dòng)配置為相反的極性捕獲,無需軟件配置。一句

    話概括就是:選定輸入通道,確定觸發(fā)信號(hào),然后設(shè)置觸發(fā)信號(hào)的極性即可,因?yàn)槭荘WM 輸入的緣故,另一路信號(hào)則由硬件配置,無需軟件配置。

      當(dāng)使用PWM 輸入模式的時(shí)候必須將從模式控制器配置為復(fù)位模式(配置寄存器SMCR 的位SMS[2:0]來實(shí)現(xiàn)),即當(dāng)我們啟動(dòng)觸發(fā)信號(hào)開始進(jìn)行捕獲的時(shí)候,

0
回復(fù)
發(fā)