CC2541timer1的PWM输出问题一起探讨,前所未有,谢谢

2019-07-24 14:57发布

大家好,我写了基于CC2541的timer1的PWM波形输出代码,测试的时候用示波器发现了P0_3和P0_5输出波形有奇怪现象
我的相关代码在页尾贴出,真诚希望大家可以下载,测试一下,帮助小弟一起讨论,揭开这个面纱!

timer1 的channel 1 和 channel 3 是配置成PWM输出,timer1的工作模式是modulo 模式。 我设计的周期是25HZ
现象一:
      当CC1 = 5000和CC3 = 5000, P0_3(channel 1) 和P0_5(channel 3) 都是20ms高电平,是正常的
      当CC1 = 8000和CC3 = 5000,P0_5(channel 3)是20ms的高电平PWM,是正常的。但是P0_3(channel 1)很奇怪,刚开始输出正常的PWM波形(时间大约100s多一点),然后输出持续高电平(时间大约100s多一点),然后输出是正常PWM的波形(时间大约100s多一点),就这样周而复始……
      当CC1 = 5000和CC3 = 2500,P0_3(channel 1)是20ms的高电平PWM,是正常的。但是P0_5(channel 3)同样的现象,刚开始输出正常的PWM波形(时间大约100s多一点),然后输出持续低电平(时间大约100s多一点),然后输出是正常PWM的波形(时间大约100s多一点),周而复始

现象二:
      当CC1 = 0和CC3 = 0, P0_3和P0_5 会输出一个脉冲(大约10ms),周期大约300s多一点。

我真心的希望大家可以帮助我,测试一下,讨论! 在此先说声谢谢了!
  1. void timer1_init(void)
  2. {
  3.         uint16 pertiod = 0;
  4.        
  5.         halIntState_t intState;
  6.        
  7.         HAL_ENTER_CRITICAL_SECTION(intState); //close interrupt
  8.        
  9.         /*IO configuration, use in compare output
  10.           channel 1 -> P0_3, channel 3 -> P0_5 */
  11.         P0SEL |= (BV(3)|BV(5));
  12.         P0DIR |= (BV(3)|BV(5));
  13.        
  14.         /*USART0 / USART1 IO location -> Alternative 2 location*/
  15.         PERCFG |= 0x03;
  16.        
  17.         /*Set the prescaler divider value
  18.           DIV[1:0]=11  f= 32MHZ / 128=0.25MHZ */
  19.         T1CTL |= 0x0C;
  20.        
  21.         /*timer1 channel 0 register configuration*/
  22.         T1CCTL0 |= 0x04; //select compare mode
  23.         T1CCTL0 |= 0x40; //enable interrupt request
  24.        
  25.         /*timer1 channel 1 register configuration, */
  26.         T1CCTL1 |= 0x04; //select compare mode
  27.         T1CCTL1 |= 0x30; //CMP[2:0]=110, set when equal T1CC0,clear when equal T1CC1
  28.         T1CCTL1 &= ~0x40; //disable interrupt request
  29.        
  30.         /*timer1 channel 3 register configuration, */
  31.         T1CCTL3 |= 0x04; //select compare mode
  32.         T1CCTL3 |= 0x30; //CMP[2:0]=110, set when equal T1CC0,clear when equal T1CC3
  33.         T1CCTL3 &= ~0x40; //disable interrupt request

  34.         /*enable T1 interrupt*/
  35.         IEN1 |= 0x02;
  36.        
  37.         /*close timer1 overflow interrupt*/
  38.         TIMIF &= ~0x40;
  39.        
  40.         /*close timer1 channel 2&4 interrupt*/
  41.         T1CCTL2 &= ~0x40;
  42.         T1CCTL4 &= ~0x40;
  43.        
  44.         /*set timer1 period T1CC0
  45.           //0x2710 = 10000; T=10000*4(us); f = 25HZ
  46.           */
  47.         period = 0x2710;
  48.         T1CC0H = (uint8)((period&0xFF00)>>8);
  49.         T1CC0L = (uint8)((period&0x00FF));
  50.        
  51.         /*clear timer1 counter*/
  52.         T1CNT = 0x00;
  53.        
  54.         /*set timer1 mode,and start timer1*/
  55.         T1CTL |= 0x02;
  56.        
  57.         HAL_EXIT_CRITICAL_SECTION(intState);  //open interrupt
  58.        
  59. }


  60. void change_pwm_value(uint8 channel, uint16 value)
  61. {
  62.         switch(channel)
  63.         {
  64.                 case 1:
  65.                         {
  66.                                 T1CC1H = (uint8)((value&0xFF00)>>8);
  67.                                 T1CC1L = (uint8)((value&0x00FF));
  68.                         }
  69.                         break;
  70.                 case 3:
  71.                         {
  72.                                 T1CC3H = (uint8)((value&0xFF00)>>8);
  73.                                 T1CC3L = (uint8)((value&0x00FF));
  74.                         }
  75.                         break;
  76.                 default:
  77.                         break;
  78.         }
  79. }



  80. static void simpleBLEPeripheral_HandleKeys( uint8 shift, uint8 keys )
  81. {
  82.         VOID shift;  // Intentionally unreferenced parameter
  83.        
  84.           if( keys & HAL_KEY_SW_1)
  85.         {
  86.                 change_pwm_value(1, 5000);
  87.                 change_pwm_value(3, 5000);
  88.         }
  89.        
  90.         if( keys & HAL_KEY_SW_2)
  91.         {
  92.                 change_pwm_value(1, 8000);
  93.                 change_pwm_value(3, 5000);
  94.         }
  95.        
  96.         if( keys & HAL_KEY_SW_3)
  97.         {
  98.                 change_pwm_value(1, 5000);
  99.                 change_pwm_value(3, 2500);
  100.         }
  101. }
  102.                
复制代码

2.jpg

1.jpg

3.jpg


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。