STM32定時器輸出比較模式中的疑惑【轉】
OCx與OCxREF和CCxP之間的關係
初學STM32,我這個地方卡了很久,現在終於有些明白了,現在把我的理解寫下與大家共享,如果有不對的地方,還請指出。
OCxREF就是一個參考訊號,並且約定:
OCxREF=1,稱OCxREF有效。反之,OCxREF=0,稱OCxREF無效;
‘1’電平(高電平)稱為OCxREF的有效電平,‘0’ 電平(低電平)稱為OCxREF的無效電平。
——依據參考手冊:The
output stage generates an intermediate waveform which is then used for reference:OCxRef (active high). The polarity acts at the end of the chain.
(翻譯)輸出階段產生一箇中間波形OCxRef(高有效)作為參考。輸出訊號的極性體現在訊號鏈的末端。
現在解釋幾個名詞之間的關係:
然後來理解輸出比較的幾個模式(PWM模式是輸出比較模式的特例)
檢視TIMx_CCMR1暫存器的OC1M域,有如下定義(摘自最新版的參考手冊)
翻譯如下:
000:凍結——輸出比較暫存器TIMx_CCR1中的內容與計數器TIMx_CNT中的內容之間的比較對輸出無影響。(此模式用於時基的生成)
001:當匹配時,設定通道1為有效電平。當計數器TIMx_CNT中的內容與捕捉/比較暫存器1(TIMx_CCR1)中的內容相匹配時,強行拉高OC1REF 訊號。
010
011:翻轉——當TIMx_CNT= TIMx_CCR1時,OC1REF訊號取反。
100:強制無效電平——強行拉低OC1REF 訊號。
101:強制有效電平——強行拉高OC1REF 訊號。
110:PWM模式1——向上計數模式中,只要TIMx_CNT< TIMx_CCR1,通道1有效,反之無效。向下計數模式中,只要TIMx_CNT> TIMx_CCR1,通道1無效(OC1REF=0),反之有效(OC1REF=1)。
110:PWM
我用紅色標出了提到有效、無效的地方。不難發現,有效與無效分別對應OC1REF=1和OC1REF=0。這正是我們先前約定的結果。
到此,不同模式下輸出比較的結果對OC1REF訊號的影響已經很清楚了,但是最終的輸出訊號是OC1,並不是OC1REF。而且前面有一句話(輸出訊號的極性體現在訊號鏈的末端)還未做解釋。
到底OC1REF與OC1之間有何祕密呢?我們來看下面這個圖:
顯然,我們只關心紅色圈內的訊號與方框內的暫存器位以及訊號在它們之間是如何傳播的。
oc1ref從輸出模式控制器(Output mode controller)開始,分為兩路,上面一路至主模式控制器(To the master mode controller),這裡我們不關心它的去向,我們關心的是下面一路,下面一路在進入雙路開關之前又被分成了兩路——一路是原訊號,一路是原訊號的非。顯然TIMx_CCER中的CC1P位用來控制這個開關,CC1E位控制著整條訊號鏈的通斷。
當CC1P=0時(CC1E=1):
很顯然,OC1與OC1REF的關係只受CC1P的影響(CC1E=1)
然而參考手冊上對CC1P位是這麼描述的:
CC1P=0時:OC1高電平有效
CC1P=1時:OC1低電平有效
根據本文開篇的名詞解釋,可以這麼理解:
CC1P=0時:OC1有效電平是高電平
CC1P=1時:OC1有效電平是低電平
這時就迷惑了,這個高電平有效和低電平有效是啥意思呢?
我們從頭分析(整個過程CC1E=1,OC1的輸出是允許的):
①假定OC1REF有效(OC1REF=1),那麼從OC1REF到OC1的整條訊號鏈上的訊號都是有效訊號,我們稱OC1輸出了有效訊號。
那這個有效訊號是高電平還是低電平呢?
這就是由CC1P決定的:
②假定OC1REF無效(OC1REF=0),那麼從OC1REF到OC1的整條訊號鏈上的訊號都是無效訊號,我們稱OC1輸出了無效訊號。
無效訊號的高電平和低電平也是由CC1P決定:
用一張表來總結上述過程:
OC1REF |
CC1P |
功能 |
OC1 |
描述 |
0 |
0 |
OC1高電平有效 |
0(低電平) |
無效 |
1 |
OC1低電平有效 |
1(高電平) |
無效 |
|
1 |
0 |
OC1高電平有效 |
1(高電平) |
有效 |
1 |
OC1低電平有效 |
0(低電平) |
有效 |
顯然,OC1REF決定了OC1輸出電平是否有效,而CC1P決定了有效電平的極性。
我們抽出上表的後四列:
CC1P |
功能 |
OC1 |
描述 |
0 |
OC1高電平有效 |
0(低電平) |
無效 |
1 |
OC1低電平有效 |
1(高電平) |
無效 |
0 |
OC1高電平有效 |
1(高電平) |
有效 |
1 |
OC1低電平有效 |
0(低電平) |
有效 |
CC1P |
功能 |
OC1 |
描述 |
0 |
OC1高電平有效 |
0(低電平) |
無效 |
OC1高電平有效 |
1(高電平) |
有效 |
|
1 |
OC1低電平有效 |
0(低電平) |
有效 |
OC1低電平有效 |
1(高電平) |
無效 |
我們將表按1、2列合併現在很清楚了,從上表中可以清楚地看到CC1P對OC1有效極性的控制。即,OC1的極性只有與CC1P指定的有效極性一致,OC1才能是有效的(綠色部分)。這樣就解釋了“輸出訊號的極性體現在訊號鏈的末端”這句話。
然而這條鏈還未結束,還有個CC1E呢。當然,它就是一個OC1輸出使能位而已。
但細心的你可能會發現,參考手冊上對CC1E位有這樣的描述:
OCx = OCxREF + Polarity
這個式子告訴我們OCx與OCxREF和Polarity(極性,即CCxP位)的關係。
我們上面提到了它們的關係,是分了兩種情況(CC1P=0和CC1P=1)表示的,這個式子幫我們將上面關係歸納成了一個。這個式子怎麼得來的?
回憶一下數字電路里面的半加器(就是不進位的加法),真值表如下:
OCxREF |
Polarity |
OCx |
0(無效) |
0(高有效) |
0(無效) |
0(無效) |
1(低有效) |
1(無效) |
1(有效) |
0(高有效) |
1(有效) |
1(有效) |
1(低有效) |
0(有效) |
相關推薦
STM32定時器輸出比較模式中的疑惑【轉】
OCx與OCxREF和CCxP之間的關係 初學STM32,我這個地方卡了很久,現在終於有些明白了,現在把我的理解寫下與大家共享,如果有不對的地方,還請指出。 OCxREF就是一個參考訊號,並且約定: OCxREF=1,稱OCxREF有效。反之,OCxREF=0,稱O
STM32 定時器輸出比較模式和PWM輸出模式的區別
搞了好幾天的定時器輸出方波, 剛開始還行, 後來怎麼弄都不行.. 我就鬱悶了… 經過漫長的示波器觀察和摸索, 才發現普通的比較輸出模式和pwm模式的 暫存器的作用不一樣. 比較輸出模式 這個模式的特點是4個通道的輸出週期頻率是一樣的.. 頻率週期由
STM32定時器輸出PWM頻率和步進電機控制速度計算
內部 定時 .cn 但是 nbsp 返回 定時器 開發 r12 1、STM32F4系列定時器輸出PWM頻率計算 第一步,了解定時器的時鐘多少: 我們知道AHP總線是168Mhz的頻率,而APB1和APB2都是掛在AHP總線上的。 (1)高級定時器timer1, time
STM32 定時器 輸出40KHZ PWM方波
大家好,本人小白一個,利用課餘時間學習STM32,如有不對之處,還請各位大佬指點,只有認識到錯誤,才會有進步嘛。 言歸正傳,最近做了一個DIY超聲波的小專案,想利用STM32定時器直接輸出40KHZ的方波,不過卻遇到了一些小的疑惑。 由定時器頻率計算公式可知,在72MHZ
STM32定時器輸出帶有死區時間的PWM波形
要求得到下列波形,死區時間為1us,CH1,CH2,CH3之間的相位差為3us,頻率為50KHz main.c /********************************************* 標題:定時器輸出帶有死區時間的PWM波形 軟體
c++迭代器(iterator)詳解【轉】
(轉自:https://www.cnblogs.com/hdk1993/p/4419779.html) 1. 迭代器(iterator)是一中檢查容器內元素並遍歷元素的資料型別。 (1) 每種容器型別都定義了自己的迭代器型別,如vector: vector<int>::it
node.js定時任務:node-schedule的使用【轉】
來自:http://www.cnblogs.com/ajun/p/3548259.html 安裝 npm install node-schedule 使用方法 1:確定時間 例如:2014年2月14日,15:40執行 var schedule =
STM32定時器溢位模式計時設定
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
STM32 定時器2 CH1 CH2 PWM輸出 產生呼吸燈效果
PWM一般用來驅動電機(控制速度),控制LED亮度,驅動開關電源電路等等,本例項通過改變PWM佔空比的方式來驅動LED燈,形成呼吸燈的效果。用這種方式來學習STM32 TIM2輸出PWM的配置。 以STM32F103C8T6為例,從其資料手冊中可以看到,P
STM32定時器----主從模式觸發PWM移相
參考如下部落格:http://blog.csdn.net/Wind4study/article/details/44860521但本文中使用的是:觸發模式,而非:門模式程式碼如下:void TIM3_PWMShiftInit(void) { TIM_TimeB
STM32定時器單脈衝輸出
使用stm32cubemx配置外設,程式碼使用HAL stm32f1 v1.3.1庫。 用的是stm32l152c開發板,時鐘頻率32MHZ。 這裡,沒有配置中斷。 上圖的意思是,TI2收到1給正脈衝,觸發TIM1開始計數,經過 tDelay後,OC1輸出低,經
小熊STM32學習總結:STM32的定時器--輸入捕捉模式
除錯STM32的定時器好幾天了,也算是對STM32的定時器有了點清楚的認識了。我需要測量4路訊號的頻率然後通過DMA將訊號的頻率傳輸到儲存器區域,手冊說的很明白每個定時器有4個獨立通道。然後我就想能不能將這4路訊號都連線到一個定時器的4個通道上去。理論上應該是行的通的。剛開始俺使用的是TIM2的1 2 3
STM32定時器----通用定時器輸出帶死區互補PWM
功能:利用一個普通定時器,輸出2路互補的、頻率可調、佔空比可調、死區可調的PWM 原理:如下圖,計數模式為中心對齊模式 可以看出,CH3高電平區間是以計數器計到4為中心,向兩邊延伸的。 而CH4,因為輸出極性相反,是以0為中心向兩邊延伸的。 CCR3變小,佔空比上升 CC
stm32-定時器中斷
cmd open 兩個 typedef clock 數據手冊 濾波 重裝 fin 由於現在是在學用庫函數操作,我的目標是知道用到的每個函數的作用,需要的時候可以加以更改使用,所以關鍵是要怎麽知道stm32各函數的作用 雖然從名字上也能知道個大概,但是細節還是要查stm3
【轉】編寫高質量代碼改善C#程序的157個建議——建議30:使用LINQ取代集合中的比較器和叠代器
main tor 命名空間 span line 繼承 new each 類型 建議30:使用LINQ取代集合中的比較器和叠代器 LINQ提供了類似於SQL的語法來實現遍歷、篩選與投影集合的功能。 static void Main(string[] ar
定時器與在console中打印內容
IT char brush console asd true alert 內容 什麽 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8">
STM32-定時器
時間之河奔騰不息,子在川上曰:“逝者如斯夫,不捨晝夜。” 我們使用各種方法來估量時間,具體到STM32,當然是少不了定時器! 本文關於定時器的內容,分為下面幾部分: 1,定時器功能的實現(TIM1); 2,定時間隔的計算公式; 3,依賴的庫檔案; 4,另一個定時器的實現(TIM14);
STM32 定時器 定時時間的計算
假設 系統時鐘是72Mhz,TIM1 是由PCLK2 (72MHz)得到,TIM2-7是由 PCLK1 得到 關鍵是設定 時鐘預分頻數,自動重灌載暫存器週期的值 /*每1秒發生一次更新事件(進入中斷服務程式)。RCC_Configuration()的SystemInit(
STM32定時器對映及其通道
TIMx,通道x,無對映,部分對映,完全對映 TIM1_CH1, PA8, PE9, TIM1_CH2, PA9, PE11 TIM1_CH3, PA10, PE13 TIM1_CH4, PA11, PE14 TIM2_CH1, PA
stm32定時器之Output Compare
stm32f103vb發出邏輯訊號給MOC3020,控制BTA16可控矽的通斷。 在檢測到過零訊號時,延時x毫秒,輸出1;延時y毫秒,關閉輸出。 實現相位控制調速感應電機(小功率)。 在stm32 discovery開發板上,使用藍燈和綠燈模擬。 採用定時器的OC,比