EFR32MG21(Series 2)定時器作為頻率信號發生器


EFR32MG21(Series 2)定時器作為頻率信號發生器

 

關鍵詞:

ZigBee, EmberZnet, TIMER, Frequency, 頻率,定時器,MG21, EFR32, ONE-SHOT, PWM

 

在我司項目研發中,偶然發現EFR32MG21(本文稱為MG21)這款ZigBee芯片的性能和配置都特別好,而我們項目剛好用到定時器來進行電機控制,燈光調色等,於是認真的去了解這個芯片定時器的功能,發現有30個多工作模式可以用,經過仔細了解,對於我們會使用到的工作方式作一個說明。也歡迎同行進行開發交流。由於這個定時器工作方式實在太多,我們僅僅會將用到的功能單獨成文。這里先介紹的是定時器作為信號發生器。

 

MG21的定時器功能特別強大和復雜,也可以用來給其他設備提供時鍾,為了降低設備對時鍾晶振和芯片的需要,也可以直接使用它給其他設備提供時鍾。一個稍為復雜的設備可能會用到多個時鍾,如果對時鍾的要求不是十分嚴格,則可參考本法。

 

頻率范圍

首先要說明的是時鍾的頻率是有限制的,而且不會十分的精准,我們在使用zigbee協議之后,MG21的高頻時鍾也就是38.4MHZ的晶振,本文的時鍾信號發生器也會是在這個時鍾基礎上進行分頻所得。

 

MG21定時器頻率計算公式為:

 

 

                                   [ ftimer = fclk / (2^(perscale+1) x (top + 1)) ]

 

       因此在不改變分頻數prescale的條件下,可以配置的頻率為 292.96Hz~19.2Mhz。每個定時器還可以通過對時鍾進行最高1024次分頻,從面得到頻率0.2861Hz的信號,這相當於一個周期的時間為3.495秒的信號。這里是用於時鍾信號,因此可以認為理論都是50%占空比的方波,但實際上會略有偏差,實測也有可能會是52%。

 

測試工具和方法

       經過理論上的計算之后,我們可以對開發板進行編碼測試,測試時可以使用示波器,也可以使用夢源制作的USB邏輯分析儀(型號DSLogic Plus)。用它可以進行測試信號,然后在電腦軟件上可以直接顯示出信號的數字波型。 它的最大采樣速率為400MHz,所以也滿足了這次的測量的要求。

 

為了能夠測試結果是否可行,我還們還要讓EFR32MG21輸出信號,使用一個開發板,在任何一個Zigbee工程當中,增加代碼讓他輸出信號到指定的引腳,(注意避開協議棧默認會占用的引腳),將邏輯分析儀的表筆接到開發板對應引腳上,即可開始測量。開發板可以選擇官方的SLWSTK6006A或者我們公司新一信息的NEWBIT-ZDK-2。以官方的為例,接線如下:

圖2  邏輯分析與ZigBee開發板的連接方法

 

 

測量的結果

       下載程序並測量信號,所目標設置為1M時,得到的圖3的波形。結果顯示是1.01MHz, 計算其誤差在1%。對寄存器進行修改,經過測試大致得到如下的規律:

 

表1

TOP值

0

1

10

100

65535

輸出頻率

19.05MHz

9.52Mhz

1.75Mhz

190.11KHz

292.93Hz

 

上表反映的測量的讀數,與理論值並沒有完全相符,但差別非常小,對於時鍾精准度要求不那么高的話,可以直接使用。

 

 

圖3 定時器輸出設置為1MHz的輸出波形

 

 

測試的代碼

       定時器的代碼不多,而且也不需要Simplicity studio v4進行配置,為方便大家的測試和使用,我們將所用的代碼開源於https://gitee.com/newbitcode/efr32mg_peri。部分代碼如下:

 

// timer configuration

void nb_timer_init(void)

{

 uint32_t timerFreq = 0;

  // Initialize the timer

  TIMER_Init_TypeDef timerInit = TIMER_INIT_DEFAULT;

  // Configure TIMER0 Compare/Capture for output compare

  TIMER_InitCC_TypeDef timerCCInit = TIMER_INITCC_DEFAULT;

 

  timerInit.prescale = timerPrescale1;

  timerInit.enable = false;

  timerCCInit.mode = timerCCModeCompare;

  timerCCInit.cmoa = timerOutputActionToggle;

 

  // configure, but do not start timer

  TIMER_Init(TIMER0, &timerInit);

 

  // Route Timer0 CC0 output to PC3

  GPIO->TIMERROUTE[0].ROUTEEN  = GPIO_TIMER_ROUTEEN_CC0PEN;

 

  GPIO->TIMERROUTE[0].CC0ROUTE = (TIMER0_GPIO_PORT << _GPIO_TIMER_CC0ROUTE_PORT_SHIFT)

                                                                                     | (TIMER0_GPIO_PIN << _GPIO_TIMER_CC0ROUTE_PIN_SHIFT);

 

  TIMER_InitCC(TIMER0, 0, &timerCCInit);

 

  // Set Top value

  // Note each overflow event constitutes 1/2 the signal period

  timerFreq = CMU_ClockFreqGet(cmuClock_TIMER0)/(timerInit.prescale + 1);

  int topValue =  timerFreq / (2*OUT_FREQ) - 1;

  TIMER_TopSet (TIMER0, topValue);

 

  /* Start the timer */

  TIMER_Enable(TIMER0, true);

}

 

有關Simplicity Studio軟件安裝請進頁面,搭建EFR32 ZigBee開發環境>>  

。在開發和測試的過程中,感謝世強元件的工程師給予的支持。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM