K60的FTM的PWM 輸入捕獲 正交解碼

2021-08-14 11:03:39 字數 2646 閱讀 2469

ftm是乙個神奇的模組,他能輸出pwm,能輸入捕獲,能輸出比較還能正交解碼。英文全稱是flextimer module,你可以理解為高階定時器模組、易用定時器模組等等。不僅僅在kinetis 32位處理器中,ftm是個常用的模組,在飛思卡爾的8位處理器中,他也是個常用的模組,只不過名字叫tpm。ftm會用了,飛思卡爾的其他微控制器的ftm、tpm你就都會用了。在oskinetis韌體庫中,我們可以用ftm模組來實現pwm、輸入捕獲和正交解碼等常用功能,借用庫函式實現功能不難,難的是理解這些功能怎麼用、什麼原理才是最重要的,下面我們一一介紹這3個功能。當然看完本文你就能用暫存器編寫ftm的各個功能嗎,呵呵,不可能的!否則要那1000多頁的技術文件幹什麼用,但是我希望本文能起到拋磚引玉的功能,在你會用庫函式的基礎上,對他的內部機制有乙個了解。

要想搞清楚ftm模組,首先我們要介紹幾個重要的暫存器給大家,他們就像小夥伴一樣,好好利用可以幫大忙呢。

ftmx_cnt(計數器暫存器),他負責喊號(計數)。

ftmx_sc(狀態和控制暫存器),他負責……暫存器名字面意思,具體說就是決定cnt小朋友的喊號的快慢(計數頻率,包括時鐘源的選擇和分頻係數)。他還負責其他一些雜事,比如計數溢位、中斷使能等等。

ftmx_mod(模數暫存器),他負責記住乙個數字,當cnt小朋友喊道這個數字的時候,他就提醒相關人員幹一些事情,比如產生溢位中斷標誌,比如讓cnt重新開始喊號。

ftmx_cntin(計數器初始值暫存器),他告訴cnt小朋友哪哪個數開始喊。

其中x代表不同的ftm模組的標號,比如mk60d系列微控制器,有3個ftm模組,x就為0~2。

**pwm的週期=(mod–cntin + 1) x 計數器週期

pwm的占空比=(cnv − cntin) / pwm的週期**

怎麼樣,上面的公式結果都是由我們認識的小朋友決定的吧。下面我來解說下這個工作流程,首先公式中的計數器週期是sc小朋友決定的,前面說了他負責喊號的快慢,因為他負責決定採用哪個頻率為輸入頻率,這些頻率候選有系統時鐘、固定頻率時鐘以及外部時鐘,他還負責這些輸入頻率的分頻係數,總之sc小朋友決定了計數器週期,也就是cnt小朋友喊號的快慢。然後cnt小朋友從cntin小朋友那裡知道了要喊的第乙個數,他按照sc決定的快慢一直喊道mod告訴他的數,喊完這些數,乙個pwm週期也就產生了!

那麼pwm的脈寬是怎麼決定的呢,首先假定cnt在喊第乙個數的時候,pwm通道輸出高電平,當cnt喊到cnv小朋友告訴他的號的時候,pwm輸出通道就會變為低電平,直到cnt繼續喊道mod的時候乙個pwm週期結束,當重新開始喊cntin的號的時候,pwm的輸出通道又變為了高電平,這樣持續下去,就產生了pwm波形!

你以為乙個ftmx模組只能輸出一路pwm就錯了,我們剛才說了cnv根據x的不同,有n個通道可以輸出pwm,如果是x=0,那麼ftm0就有8個cnv,c0v到c7v這8個小朋友,因此ftm0可以輸出8路不同占空比的pwm,但是由於負責喊號的cnt以及他的其他小夥伴在ftm0中僅僅各有1人,因此ftm0只能輸出一種頻率的pwm。

如果上面的描述讓你和你的小夥伴都驚呆了,那麼就看看上面這幅圖,從技術文件中的figure 39-181截出來的。紅圈後面的波形就行pwm輸出通道輸出的波形。深綠色的圈代表cnt從cntin開始計數,此時輸出高電平。當計數到cnv的時候,淺綠色圈處,產生channel(n)match通道匹配事件,變為低電平。當整個計數週期完成,即藍圈的範圍,cnt計數到mod時,乙個波形輸出完成。

前面講了ftm中的幾個小夥伴的故事,目的是為了讓大家了解pwm的工作流程,下面我們來具體看看例程中,是如何利用庫函式來生成pwm的。首先看例程「lpld_servocontrol」,這是乙個控制舵機轉動的例程,我們知道舵機的控制pwm頻率一般是50hz,其他的舵機有可能不同,因此我們的初始化函式初始化pwm頻率為50,定位pwm_init()函式,看其**:

ftm_init_struct.ftm_ftmx = ftm0; //使能ftm0通道

02

ftm_init_struct.ftm_mode = ftm_mode_pwm; //使能pwm模式

03

ftm_init_struct.ftm_pwmfreq = 50; //pwm頻率50hz

04

lpld_ftm_init(ftm_init_struct);

05

lpld_ftm_pwm_enable(ftm0, //使用ftm0

06

ftm_ch0, //使能ch0通道

07

angle_to_period(0), //初始化角度0度

08

ptc1, //使用ch0通道的ptc1引腳

09

align_left //脈寬左對齊

10

);

初始化完成後的**如下所示:

delay(1000);

//初始化延時後改變角度為45度

lpld_ftm_pwm_changeduty(ftm0, ftm_ch0, angle_to_period(45));

學習筆記 強大的K60及其核心外設

即日起,將更新k60各模組的個人學習筆記。加粗部分為本人在智慧型車製作時感受到的重要之處,僅供參考。1 k60 k系列具有可拓展性 整合性 連線性 通訊 人機互動 hmi 和安全等特性,特別是整合了多路快速的16位模數轉換 adc 數模轉換 dac 和可程式設計增益運放 pga 等功能強大 高效率的...

k60 的DHT11時序寫法注意

第一次發帖,不怎麼會,承認了。就僅僅是記錄一下心得 下面是時序圖 初始化時序圖 2.讀取資料時序圖 下面看一下我的 void dht11writestart void 開始標誌 u8 dht11readbyte void else 否表示0 return temp char a 5 int temp...

簡述逐飛 K60 定時器程式的使用

程式使用 k60 逐飛科技庫 pit init ms pit1,1 設定定時器時間為 1ms定時器時間過長,會造成程式執行後出現的效果非常遲鈍。定時器時間過短,可能會使定時器裡的程式執行時間不夠,從而造成溢位。所以在時間方面需要細心拿捏。設定定時器的優先順序 set irq priority pit...