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日 与田里

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