CC2541使用TIM3產生PWM波形不連續問題填坑指南

關於CC2541 TIM3產生輸出比較波形

  1. 定時器基礎配置
  2. 通道配置
  3. 比較值配置
    TIM3的PWM配置輸出比較簡單,構成一個簡單的PWM發生器,最好選擇輸出比較模式(101)或(110),通過調整T3CCn來實現通道的佔空比。
  //Init TIM3 base
  T3CTL |= 0xE0;//div = 128
  T3CTL &= ~0x08;             // Disable Timer 3 overflow interrupts
  T3CTL &= ~0x03;             // Timer 3 mode = 0 - Free-running
  T3CTL |= 0x04;//clr
  
  // EN connected at P1_3
  // We will use Timer 3 Channel 0 at alternate location 1
  // Channel 0 will Set output on compare, clear on 0xFF(101) and counter will
  // count in free-running mode to T3CC0.
  P1SEL |= 0x08;              // Peripheral function on P1_3
  
  T3CCTL0 &= ~0x40;           // Disable channel 0 interrupts
  T3CCTL0 |= 0x04;            // Ch1 mode = compare
  T3CCTL0 |= 0x28;            // Ch1 output compare mode = 101: Set output on compare, clear on 0xFF

  T3CC0 = 128; 				  //duty = 50 %
  T3CTL |= 0x10;			  //start

填坑

使用示波器測試發現產生的PWM波形會存在不連續現象,具體表現爲顯示背光忽明忽暗且毫無規律可循。

  1. 關閉IAR預處理器裏的POWER_SAVING,一旦CC2541進入低功耗模式,主時鐘就會關閉,而TIM3的時鐘源一般都被配置成了主時鐘(32M)。是否可以切換到32K時鐘以保留低功耗功能,這沒有測試過,而且其中設計到不同時鐘切換時的時基轉換問題,有興趣的可以嘗試一下。在我的項目中,對功耗並不敏感,所以我就乾脆關閉了。
  2. 在SimpleBLEPeripheral_Init這個函數裏有這樣一個函數
    HCI_EXT_ClkDivOnHaltCmd( HCI_EXT_ENABLE_CLK_DIVIDE_ON_HALT );
    具體幹嘛用的不太清楚,看註釋應該是配合低功耗一起使用的,把它註釋掉就能解決PWM不連續的問題了,單獨只關閉POWER_SAVING是沒有效果的,還是會產生不連續的現象。

總結

總的來說魔改過的C51內核還是不如ARM 的Cortex-m核來的清爽,但仔細調一調問題也不大,等下一代產品升級我肯定換成NRF52832的方案,呵。

11月27日 與田裏

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章