1. 程式人生 > >TIM通用定時器(三):PWM輸入捕獲模式

TIM通用定時器(三):PWM輸入捕獲模式

一、概念理解

PWM輸入捕獲模式是輸入捕獲模式的特例,自己理解如下

1. 每個定時器有四個輸入捕獲通道IC1、IC2、IC3、IC4。且IC1 IC2一組,IC3 IC4一組。並且可是設定管腳和暫存器的對應關係。

2. 同一個TIx輸入映射了兩個ICx訊號。

3. 這兩個ICx訊號分別在相反的極性邊沿有效。

4. 兩個邊沿訊號中的一個被選為觸發訊號,並且從模式控制器被設定成復位模式。

5. 當觸發訊號來臨時,被設定成觸發輸入訊號的捕獲暫存器,捕獲“一個PWM週期(即連續的兩個上升沿或下降沿)”,它等於包含TIM

    時鐘週期的個數(即捕獲暫存器中捕獲的為TIM的計數個數n)。

6. 同樣另一個捕獲通道捕獲觸發訊號和下一個相反極性的邊沿訊號的計數個數m,即(即高電平的週期或低電平的週期)

7. 由此可以計算出PWM的時鐘週期和佔空比了

    frequency=f(TIM時鐘頻率)/n。

    duty cycle=(高電平計數個數/n),

    若m為高電平計數個數,則duty cycle=m/n

    若m為高電平計數個數,則duty cycle=(n-m)/n

注:因為計數器為16位,所以一個週期最多技術65535個,所以測得的 最小頻率= TIM時鐘頻率/65535。

二、程式設計與分析

1. 程式概述:選擇TIM3作為PWM輸入捕獲。IC2設定為上升沿,並設定為有效的觸發輸入訊號。所以IC2的捕獲暫存器捕獲PWM週期,

                   IC1的捕獲暫存器捕獲PWM的高電平週期。

2.程式程式碼如下:

  /* TIM3 clock enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);      //時鐘配置

  /* GPIOA clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

/* TIM3 channel 2 pin (PA.01) configuration */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;                               //GPIO配置
  PIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(GPIOA, &GPIO_InitStructure);

 /* Enable the TIM3 global Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;                     //NVIC配置
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

/*TIM配置*/ 

  TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;                   //通道選擇
  TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;       //上升沿觸發
  TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;    //管腳與暫存器對應關係
  TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;           //輸入預分頻。意思是控制在多少個輸入週期做一次捕獲,如果

//輸入的訊號頻率沒有變,測得的週期也不會變。比如選擇4分頻,則每四個輸入週期才做一次捕獲,這樣在輸入訊號變化不頻繁的情況下,

//可以減少軟體被不斷中斷的次數。
  TIM_ICInitStructure.TIM_ICFilter = 0x0;                            //濾波設定,經歷幾個週期跳變認定波形穩定0x0~0xF

  TIM_PWMIConfig(TIM3, &TIM_ICInitStructure);                 //根據引數配置TIM外設資訊

  /* Select the TIM3 Input Trigger: TI2FP2 */
  TIM_SelectInputTrigger(TIM3, TIM_TS_TI2FP2);                //選擇IC2為始終觸發源

  /* Select the slave Mode: Reset Mode */
  TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);//TIM從模式:觸發訊號的上升沿重新初始化計數器和觸發暫存器的更新事件

  /* Enable the Master/Slave Mode */
  TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable); //啟動定時器的被動觸發

  /* TIM enable counter */
  TIM_Cmd(TIM3, ENABLE);                                 //啟動TIM2

  /* Enable the CC2 Interrupt Request */        
  TIM_ITConfig(TIM3, TIM_IT_CC2, ENABLE);     //開啟中斷 

中斷處理函式

void TIM3_IRQHandler(void)
{
  /* Clear TIM3 Capture compare interrupt pending bit */
  TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);                //清楚TIM的中斷待處理位

  /* Get the Input Capture value */
  IC2Value = TIM_GetCapture2(TIM3);                         //讀取IC2捕獲暫存器的值,即為PWM週期的計數值

  if (IC2Value != 0)
  {
    /* Duty cycle computation */
    DutyCycle = (TIM_GetCapture1(TIM3) * 100) / IC2Value;         //讀取IC1捕獲暫存器的值,並計算佔空比

    /* Frequency computation */
    Frequency = 72000000 / IC2Value;                                          //計算PWM頻率。
  }
  else
  {
    DutyCycle = 0;
    Frequency = 0;
  }
}

注(一):若想改變測量的PWM頻率範圍,可將TIM時鐘頻率做分頻處理

 TIM_TimeBaseStructure.TIM_Period = 0xFFFF;     //週期0~FFFF
  TIM_TimeBaseStructure.TIM_Prescaler = 5;       //時鐘分頻,分頻數為5+1即6分頻
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;   //時鐘分割
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//模式
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);//基本初始化
注注(二):定時器TIM的倍頻器X1或X2。在APB分頻為1時,倍頻值為1,否則為2。

相關推薦

TIM通用定時PWM輸入捕獲模式

一、概念理解 PWM輸入捕獲模式是輸入捕獲模式的特例,自己理解如下 1. 每個定時器有四個輸入捕獲通道IC1、IC2、IC3、IC4。且IC1 IC2一組,IC3 IC4一組。並且可是設定管腳和暫存器的對應關係。 2. 同一個TIx輸入映射了兩個ICx訊號。 3. 這兩個IC

TIM通用定時計數器模式

1. 向上計數模式 2. 向下計數模式 3.. 中央對齊模式(向上/向下計數) 在中央對齊模式,計數器從0開始計數到自動載入的值(TIMx_ARR暫存器)−1,產生一個計數器溢位事件,然後向下計數到1並且產生一個計數器下溢事件;然後再從0開始重新計數。 1. 時鐘配置  

定時Timer的替代ScheduledExecutorService

ScheduledExecutorService其實是一個執行緒池,用來定時多執行緒會互不影響, SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); ScheduledExecutorServic

定時

前言 前面講了利用定時器3的查詢方式來實現LED1的閃爍,那麼我們怎麼用中斷方式控制呢?今天,我們主要來討論這個話題。 那麼我們想想,應該怎麼讓定時器3產生中斷呢? 無非也就這幾步驟:分頻、開啟溢位中斷、裝數、使能定時器3中斷,使能總中斷、啟動計數。

Java多線程編程模式實戰指南Two-phase Termination模式

增加 row throws mgr 額外 finally join table 還需 停止線程是一個目標簡單而實現卻不那麽簡單的任務。首先,Java沒有提供直接的API用於停止線程。此外,停止線程時還有一些額外的細節需要考慮,如待停止的線程處於阻塞(等待鎖)或者等待狀態(等

學習之路-RabbitMQRabbitMQ的工作模式

RabbitMQ有以下幾種工作模式 : 1、Work queues 工作佇列 2、Publish/Subscribe 釋出訂閱模式 3、Routing 路由模式 4、Topics 萬用字元模式 5、Header 6、RPC 一:Work queues 工作佇列 work queues與

Java多執行緒程式設計模式實戰指南Two-phase Termination模式

 本文由本人首次釋出在infoq中文站上:http://www.infoq.com/cn/articles/java-multithreaded-programming-mode-two-phase-termination 停止執行緒是一個目標簡單而實現卻不那麼簡單的

自己的HADOOP平臺Mysql+hive遠端模式+Spark on Yarn

Spark和hive配置較為簡單,為了方便Spark對資料的使用與測試,因此在搭建Spark on Yarn模式的同時,也把Mysql + Hive一起搭建完成,並且配置Hive對Spark的支援,讓Spark也能像Hive一樣操作資料。 前期準備

執行緒Lock互斥鎖、RLock 遞迴鎖、Semaphore訊號量、Event事件、Condition條件、Timer定時、queue佇列

目錄 一、鎖 1)同步鎖 2)死鎖與遞迴鎖 二、訊號量 三、事件 四、條件 五、定時器 六、執行緒佇列 一、鎖 1)同步鎖 #同步鎖的引用 from threading import Thread,Lock import os,time def wor

Linux時間子系統之六高精度定時HRTIMER的原理和實現

3.4 size 屬於 running return repr 而是 復雜度 ctu 上一篇文章,我介紹了傳統的低分辨率定時器的實現原理。而隨著內核的不斷演進,大牛們已經對這種低分辨率定時器的精度不再滿足,而且,硬件也在不斷地發展,系統中的定時器硬件的精度也越來越高,這也給

Learn OpenGL 著色

GLSL 著色器是使用一種叫GLSL的類C語言寫成的。GLSL是為圖形計算量身定製的,它包含一些針對向量和矩陣操作的有用特性。 著色器的開頭總是要宣告版本,接著是輸入和輸出變數、uniform和main函式。每個著色器的入口點都是main函式,在這個函式中我們處理所有的輸入變數,並將結果輸出

API閘道Kong功能梳理和外掛使用-基本使用過程

作者: 李佶澳   轉載請保留:原文地址   釋出時間:2018-10-10 14:37:53 +0800   說明 Kong的Admin API Kong定義的資源之間的關聯關係

selenium模組種選擇id、css、xpath

三種查詢元素方式 :id、css、xpath 最常用xpath,css更靈活。 from selenium import webdriver from selenium.webdriver import ActionChains from selenium.webdriver.commo

Python之numpy教程轉置、乘積、通用函式

1.陣列轉置和軸對換:陣列不僅有transpose方法,還有一個特殊的T屬性: arr = np.arange(15).reshape(3,5) arr輸出: array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8,

第七章系統滴答定時systick應用

     Systick就是一個定時器而已,只是它放在了NVIC中,主要的目的是為了給作業系統提供一個硬體上的中斷(號稱滴答中斷)。滴答中斷?這裡來簡單地解釋一下。作業系統進行運轉的時候,也會有“心跳”。它會根據“心跳”的節拍來工作,把整個時間段分成很多小小的時間片,每個任務每次只能執行一個“時間片”的時間長

spring cloud+.net core搭建微服務架構Api閘道

前言 國慶假期,一直沒有時間更新。 根據群裡面的同學的提問,強烈推薦大家先熟悉下spring cloud。文章下面有純潔大神的spring cloud系列。 上一章最後說了,因為服務是不對外暴露的,所以在外網要訪問服務必須通過API閘道器來完成,而spring cloud 提供了現成的Api閘道器元件zuul

Spring Boot學習定時任務

一、簡介 專案中經常會遇到使用定時任務的情況,那麼SpringBoot如何實現這種需求呢,還是簡潔到要命。 二、環境準備 eclipse + maven + Spring Boot 三、程式碼示例 pom.xml檔案不用特殊引入依賴包,保持一般初始化就可以,如下

JVM類載入機制類載入過程和類載入

一、為什麼要使用類載入器?Java語言裡,類載入都是在程式執行期間完成的,這種策略雖然會令類載入時稍微增加一些效能開銷,但是會給java應用程式提供高度的靈活性。例如:1.編寫一個面向介面的應用程式,可能等到執行時再指定其實現的子類;2.使用者可以自定義一個類載入器,讓程式在

Unity編輯開發實戰、開發一個AB包編輯工具

前言 本系列將會從零開始開發一個輕量級的AB包編輯器工具(也就是打包或者管理AssetBundle的工具),完成以後,他的最終應用介面可能是如下這樣的: 介面詳解: 1、Create:建立一個新的空的AB包; 2、Rename:重新命名當前選中的AB

機器學習感知演算法實現鳶尾花分類專案實戰

上一章我們已經介紹了感知器演算法規則,並且用python語言實現了。現在我們應用感知器學習規則進行鳶尾花分類實驗。 測試資料我們從鳶尾花資料集中挑選出了山鳶尾(Setosa)和變色鳶尾(Versicolor)兩種花的資訊作為測試資料。雖然感知器並不將資料樣本特