STM32定時器捕獲PWM脈衝頻率

2020-11-21 電子工程世界

一、概念理解

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.程序代碼如下:

 
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);      //時鐘配置

 
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

 

 


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

 

 

 

 
  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_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外設信息

 
  TIM_SelectInputTrigger(TIM3, TIM_TS_TI2FP2);                //選擇IC2為始終觸發源

 
  TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);//TIM從模式:觸發信號的上升沿重新初始化計數器和觸發寄存器的更新事件

 
  TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable); //啟動定時器的被動觸發

 
  TIM_Cmd(TIM3, ENABLE);                                 //啟動TIM2

           
  TIM_ITConfig(TIM3, TIM_IT_CC2, ENABLE);     //打開中斷 

 

中斷處理函數

 

void TIM3_IRQHandler(void)
{
 
  TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);                //清楚TIM的中斷待處理位

 
  IC2Value = TIM_GetCapture2(TIM3);                         //讀取IC2捕獲寄存器的值,即為PWM周期的計數值

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

   
    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_Period還是要設置成0xffff,而TIM_Prescaler是進行分頻用的,也就是說,如果定時器時鐘為72M,則將TIM_Prescaler設置成5後,TIM的時鐘為14.4M,此時可以檢測的最小頻率=14.4M/0xffff,也就是說最小檢測頻率= 14.4M/TIM_Period;

    之前關於這個TIM_Period自動重載值沒有理解好,怎麼都調試不同,終於搞定了,記錄一下,以便後期查閱


關鍵字:STM32  定時器  捕獲PWM  脈衝頻率 編輯:什麼魚 引用地址:http://news.eeworld.com.cn/mcu/2018/ic-news070140148.html 本網站轉載的所有的文章、圖片、音頻視頻文件等資料的版權歸版權所有人所有,本站採用的非本站原創文章及圖片等內容無法一一聯繫確認版權者。如果本網所選內容的文章作者及編輯認為其作品不宜公開自由傳播,或不應無償使用,請及時通過電子郵件或電話通知我們,以迅速採取適當措施,避免給雙方造成不必要的經濟損失。

推薦閱讀

STM32MxCube配置串口

基於上一次將第一章:STM32MxCube 基本使用方法,本章直接講敘述STM32配置串口2的。查看STM32F407電路圖:可得USART2接在PA2、PA3。下面新建STM32MxCube工程,開始配置。這裡我們配置IO(定義PF9、PF10引腳為LED)、RCC(使用HSE)、USART(串口)。配置USART(串口)USART的配置有好幾種,也是最常見的一種」UART異步串行通信」配置來講述。選擇USART2模式為「asynchronous」(異步通信)對應的引腳自動轉換為USART。對於系統時鐘應該都知道它的作用,就是驅動整個晶片工作的心臟,如果沒有了它,就等於人沒有了心跳。時鐘的快慢也就決定了程序的快慢。STM32

發表於 2020-05-04

STM32CubeMX學習教程之一:GPIO輸出之跑馬燈

完整源碼下載:https://github.com/simonliu009/STM32CubeMX-GPIO-Control軟體版本:STM32CubeMX V4.25.0 System Workbench V2.4固件庫版本:STM32Cube FW_F1 V1.6.1硬體:OneNet 麒麟座V2.3在STM32CubeMX中新建項目,選擇正確的MCU型號首先設置RCC和SYS,如下圖然後根據板子實際情況設置時鐘(麒麟座外部晶振是12M,STM32F103x的最高主頻是72M),如下圖GPIO設置 PC7, PC8, PA12和 PC10為GPIO_OUTPUT, (這是麒麟座V2.3的四個LED管腳),如下圖

發表於 2020-05-04

STM32CubeMX學習--(3)串口通信

Cube配置USART配置在Connectivity中選中USART1MODE = AsynchronousHardware Flow Control = DisableParameter Settings中配置Baud Rate = 115200Word Length = 8bitParity = NoneStop Bits =1Data Direction = Receive and TransmitOver Sampling = 16 SamplesNVIC Setting勾選Enable,Preemption Priority =2生成代碼修改代碼生成代碼後,即可使用HAL_UART_Transmit_IT(&amp

發表於 2020-04-29

STM32CubeMX系列教程 5.0版本環境開發——2.Uart串行通信功能

;                         PS:在明白原理的情況下建議自己手寫一次模擬UART。明白了之後,代碼重複的事就由STM32晶片的硬體功能來實現就可以了,你只需要會看邏輯分析儀或者示波器分析數據便可。 所謂硬體功能 就是你把數據填充到寄存器,然後配置好相關參數,他會自動幫你發送出去。通俗點說,自己手寫整個協議代碼實現實現就像你自己把一個快件送到到別人那裡再回來,而硬體功能則是你把快件給快遞員,快遞員幫你送過去。  明顯 後者會幫你節省大量時間和精力。它是一個硬體組成,並且你也為此付費

發表於 2020-04-29

串口通信(用CubeMX學習STM32)

前言: STM32串口介紹串行通信是單片機與外部設備或其他計算機交換信息的一個方式, 數據一位一位的按順序傳送, 其優點是只需要一條傳輸線, 協議簡單, 但是缺點就是傳送速度較慢。串口是單片機上非常便捷的一個工具, 當寫程序需要調試的時候, 它可以很方便的提供調試方法, 只要在一些關鍵代碼執行的地方, 通過串口給串口調試助手發送相關信息, 就可以使我們很方便的查看代碼在這個位置的執行情況。下面看一下我所使用的單片機上串口的原理圖接線外部的發送端TXD就是單片機串口的接收端USART_RX,   外部接收端RXD就是單片機串口的發送端USART_TXTXD : Transmit(TX) Data(D)  Receive(RX

發表於 2020-04-29

【STM32CubeMX】 串口通信(USART) Printf重定向

STM32CubeMX: Version 4.26.1MDK-ARM: Version 5.24.2開發板: 中移onenet 麒麟座MINI板晶片: STM32F103CBT61.STM32CubeMX設置設置外部時鐘源設置Debug設置串口 使用USART1 PA9,PA10設置時鐘頻率設置USART1詳細參數生成MDK-ARM工程2.重定向Printf 及 Scanf主要用到兩個函數HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout

發表於 2020-04-29

相關焦點

  • 用SST單片機的PCA功能產生PWM脈衝
    利用PCA的脈衝寬度調製(PWM)模式可以產生一個8位PWM,它通過比PCA定時器的低位(CL)和比較寄存器的低位(CCAPnL)產生。當CLCCAPnL時輸出為低;當CL>=CCAPnL是輸出為高。要進入這個模式,可以對CCAPMn的PWM和ECOM位置位。在PWM 模式,輸出的頻率決定於PCA定時器的源。由於只有一對CH 和CL寄存器,所有模塊共享PCA定時器和頻率。
  • stm32庫函數學習篇通用定時器輸入捕獲功能
    實現功能:PA8隨意延時驅動led燈閃爍,並且將PA8用杜邦線連接到PA7口,PA7是通用定時器TIM3的2通道,在TIM3_CH2觸發中斷程序中取反連接到PD2口的led燈,指示中斷程序運行,並且每次進入中斷後改變觸發捕獲的極性。實現兩個led燈會交替閃爍。
  • STM32F4輸出PWM波形的配置總結
    單片機輸出pwm的原理涉及模塊:GPIO、TIM1主要寄存器:TIMx_CCR、TIMx_ARR、TIMx_CNT原理圖通用定時器可以利用GPIO引腳進行脈衝輸出,在配置為比較輸出、PWM輸出功能時,捕獲/比較寄存器TIMx_CCR被用作比較功能,下面把它簡稱為比較寄存器。
  • STM32 定時器的4通道計數器應用
    (CK_INT)頻率與數字濾波器(ETR,TIx)使用的採樣頻率之間的分頻比例。 72M/7200=10K分頻後的結果就是,定時器速度為10K.計數器為向上計數,8000溢出,所以溢出時間就是8000/10K=0.8秒.而捕獲的比較值則為:u16 CCR1_Val = 4000;u16 CCR2_Val = 2000;u16 CCR3_Val = 1000;u16 CCR4_Val = 500;也就是說,在定時器開始計數後,第一通道的中斷發生在4000/10k
  • stm32f407之高級定時器 死區互補PWM(操作寄存器)
    程序:/************************************    標題:死區互補PWM    軟體平臺:IAR for ARM6.21    硬體平臺:stm32f4-discovery    主頻:168M    描述:三對死區互補PWM、一路普通PWM
  • 基於STM32定時器的紅外遙控數據接收設計原理
    2、定時器計數和輸入捕獲 定時器就是按照一個特定的頻率對計數值進行加一或減一操作,當數值溢出時則產生一個標誌或中斷。 定時器的輸入捕獲就是可以測量輸入信號的脈衝寬度。 本次就是通過普通計數和輸入捕獲的結合來實現的。
  • STM32 高級定時器-PWM簡單使用
    高級定時器與通用定時器比較類似,下面是一個TIM1 的PWM 程序,TIM1是STM32唯一的高級定時器。共有4個通道有 死區有互補。空閒狀態下的非工作狀態 不管TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;//先不管TIM_OC1Init(TIM1,&TIM_OCInitStructure); //數初始化外設TIMx通道1這裡2.0庫為TIM_OCInit/* TIM1 counter enable開定時器
  • 脈衝寬度調製(PWM)器件的測試(圖)
    pwm器件是根據輸出反饋,調節脈衝方波的佔空比,以此來驅動功率器件、高頻變壓器、整流、濾波等電路,從而得到穩定的直流輸出電壓,pwm器件在開關電源中完成脈寬調製作用,大多數pwm器件還具有工作電壓的滯回、軟啟動、快速關閉、電流限制等輔助功能,只需外接少數阻容元件、分立器件和輸出高頻變壓器即可實現性能比較理想的開關電源。
  • 如何採用STM32中的控制定時器Tim1實現計數器功能
    STM32中的高級控制定時器(Tim1)是由一個16位的自動裝載計數器組成,它由一個可編程預分頻器驅動。 用途在於:測量輸入信號的脈衝寬度(輸入捕獲),或者產生輸出波形(輸出比較,PWM,嵌入死區時間的互補PWM等)。 使用定時器預分頻器和RCC時鐘控制預分頻器,可以實現脈衝寬度和波形周期從幾個微秒到幾個毫秒的調節。
  • STM32第七章-脈衝寬度調製
    捕獲/比較使能寄存器見名知意,當然是使能TIM3定時器的啊。使CC4E置位為1就可以了。捕獲/比較寄存器該寄存器總共有 4 個,對應 4 個通道 CH1~4。我們使用的是通道3。在輸出模式下,該寄存器的值與 CNT 的值比較,根據比較結果產生相應動作。利用這點,我們通過修改這個寄存器的值,就可以控制 PWM 的輸出脈寬了。
  • 用ULN2003驅動24BYJ48步進電機時,怎麼接stm32單片機比較好?
    stm32單片機是一種高性能、低成本、低功耗的單片機,可以說很多應用場合都會用到,特別是對於大型系統,像電源、充電樁、交互機、電機驅動、PLC、逆變器、印表機、掃描儀、警報系統、視頻電話、 HVAC 等。那麼對於如何用STM32驅動步進電機呢?
  • 用Arduino剖析PWM脈寬調製
    PWM的頻率 (PWM frequency)pwm的頻率決定了輸出的數位訊號on ,1 和 off,0 的切換速度。頻率越高,切換就越快。頻率的大小就是前面提到的調製周期T的倒數  : f = 1/T。1秒內,0.5秒開,0.5秒滅,佔空比是50%。那麼,1毫秒內,0.5毫秒開,0.5毫秒滅,佔空比也是50%,對於前者,頻率就是1HZ,而後者,是1毫秒,頻率就是1KHZ。一般pwm頻率都是因硬體設計而固定的,是由pwm發生器決定的。
  • 怎麼利用555定時器產生1hz脈衝的方波發生器
    555定時器做一個頻率為1HZ的秒脈衝發生器   原理就是直流電震蕩後升壓,比如說1個小功率電棍,利用6V-12V直流電源可產生一種高壓脈衝。電路中三極體Q1、Q2構成了一振蕩器,產生頻率為3Hz的直流脈衝電壓,並輸入變壓器比為6V:240V升壓器的初級線圈,在每個脈衝結束時,相應地在變壓器的次級線圈產生一高電壓。脈衝的重複頻率可通過選擇C2、R1值進行調整。
  • stm32單片機中使用GPIO口模擬PWM輸出解析
    按內核架構分為不同產品:   其中STM32F系列有:STM32F103「增強型」系列STM32F101「基本型」系列STM32F105、STM32F107「互聯型」系列   增強型系列時鐘頻率達到72MHz,是同類產品中性能最高的產品;基本型時鐘頻率為36MHz,以16位產品的價格得到比16位產品大幅提升的性能,是32位產品用戶的最佳選擇。
  • 一個定時器生成多路PWM波形的原理和方法
    ---基本定時學習 1.STM32的Timer簡介STM32中一共有11個定時器,其中2個高級控制定時器,4個普通定時器和2個基本定時器,以及2個看門狗定時器和1個系統嘀嗒定時器。
  • PWM原理
    PWM就是脈衝寬度調製,也就是佔空比可變的脈衝波形。該技術以該結論為理論基礎,對半導體開關器件的導通和關斷進行控制,使輸出端得到一系列幅值相等而寬度不相等的脈衝,用這些脈衝來代替正弦波或其他所需要的波形。按一定的規則對各脈衝的寬度進行調製,既可改變逆變電路輸出電壓的大小,也可改變輸出頻率。
  • pwm輸出波形的特點
    ,用這些脈衝來代替正弦波或所需要的波形。也就是在輸出波形的半個周期中產生多個脈衝,使各脈衝的等值電壓為正弦波形,所獲得的輸出平滑且低次諧波少。按一定的規則對各脈衝的寬度進行調製,即可改變逆變電路輸出電壓的大小,也可改變輸出頻率。   在PWM波形中,各脈衝的幅值是相等的,要改變等效輸出正弦波的幅值時,只要按同一比例係數改變各脈衝的寬度即可,因此在交-直-交變頻器中,PWM逆變電路輸出的脈衝電壓就是直流側電壓的幅值。
  • PWM是什麼
    也就是在輸出波形的半個周期中產生多個脈衝,使各脈衝的等值電壓為正弦波形,所獲得的輸出平滑且低次諧波少。按一定的規則對各脈衝的寬度進行調製,即可改變逆變電路輸出電壓的大小,也可改變輸出頻率。這些脈衝寬度相等,都等於 ∏/n ,但幅值不等,且脈衝頂部不是水平直線,而是曲線,各脈衝的幅值按正弦規律變化。如果把上述脈衝序列用同樣數量的等幅而不等寬的矩形脈衝序列代替,使矩形脈衝的中點和相應正弦等分的中點重合,且使矩形脈衝和相應正弦部分面積(即衝量)相等,就得到一組脈衝序列,這就是PWM波形。可以看出,各脈衝寬度是按正弦規律變化的。根據衝量相等效果相同的原理,PWM波形和正弦半波是等效的。
  • 單片機中各種周期的關係與定時器原理
    本文引用地址:http://www.eepw.com.cn/article/201812/395667.htm  時鐘周期:  時鐘周期也叫振蕩周期或晶振周期,即晶振的單位時間發出的脈衝數,一般有外部的振晶產生,比如12MHZ=12×10的6次方,即每秒發出12000000個脈衝信號,那麼發出一個脈衝的時間就是時鐘周期,也就是1/12微秒。通常也叫做系統時鐘周期。
  • 一種基於MSP430單片機的交流頻率檢測系統
    摘要:本文提出了一種交流信號過零檢測的電路,即捕獲交流信號的零點,並藉助MSP430單片機內部的16位定時器A(TimerA)的脈衝捕獲功能便能得到該交流信號的周期進而能得到它的頻率。關鍵字:過零檢測,脈衝捕獲,MSP430,單片機,16位定時器A 1 引言由於頻率信號具有抗幹擾性強、易於傳輸、測量準確度較高等優點,因此許多非頻率量的傳感信號都轉換為頻率量來進行測量和處理。因此頻率測量方法愈來愈引起關注和研究。