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開發環境>>
。在開發和測試的過程中,感謝世強元件的工程師給予的支持。
總結
以上是生活随笔為你收集整理的EFR32MG21(Series 2)定时器作为频率信号发生器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 财联社-产品展示
- 下一篇: 一定要记住的14个JVM内存配置参数