This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

有关PWM输出问题

Other Parts Discussed in Thread: CC2541

问题说明:我是使用蓝牙接受数据来控制定时器1的1到3通道输出不同的PWM波形,结果发现输出的波形图是乱的,通过测试发现OSAL的timerupdate有影响,关闭这个函数之后,输出的PWM正常了,但是PWM输出的宽度就会变得时长时短的来回变化,这是什么原因?有什么解决办法吗?

协议栈:1.4

芯片:CC2541

  • 问题说明:我是使用蓝牙接受数据来控制定时器1的1到3通道输出不同的PWM波形,结果发现输出的波形图是乱的,通过测试发现OSAL的POWER_SAVING有影响,关闭这个之后,输出的PWM正常了,但是PWM输出的宽度就会变得时长时短的来回变化,这是什么原因?有什么解决办法吗?

    协议栈:1.4

    芯片:CC2541

  • 若是可以的话,能否给出具体的配置代码,谢谢
  • 據我所知CC2541 的PWM不能在POWER_SAVING的狀況下使用
  • 是的,关闭这个POWER_SAVING之后,情况也是一样的,输出PWM波形依然会有周期和宽度的波动,但我需要的是精确的PWM
  • 你說的周期和宽度的波动有多大呢?
  • void PWM_init(void)
    {
    P2SEL &= ~(1<<4); //定时器1优先

    //设置pwm端口为输出
    P1DIR|= BV(0)|BV(1); //CH_0 and CH_1
    P0DIR|= BV(6)|BV(7); //CH_3 and CH_4
    //设置pwm端口为外设端口,非gpio
    P1SEL|= BV(0)|BV(1);
    P0SEL|= BV(6)|BV(7);

    PERCFG |= 0x44; // Move USART1&2 to alternate2 location so that T1 is visible
    // Initialize Timer 1
    T1CTL = 0xE;//0x2; // Div = 1, CLR, MODE = Suspended
    T1CCTL1 = 0x24;
    T1CCTL2 = 0x24;
    //T1CNTL = 0; // Reset timer to 0;
    T1CCTL0 = 0x0;
    T1CC0L = (uint8)(PWM_PERIOD );
    T1CC0H = (uint8)(PWM_PERIOD >> 8);
    //EA=1;
    //IEN1 |= 0x02; // Enable T1 cpu interrupt
    T1CNTL = 0; // Reset timer to 0;
    pwmPulse();
    T1CNTL = 0;
    }
    void pwmPulse()
    {
    T1CC1L = (uint8)(RcChannelData[0] );
    T1CC1H = (uint8)(RcChannelData[0] >> 8);
    T1CC2L = (uint8)(RcChannelData[1] );
    T1CC2H = (uint8)(RcChannelData[1] >> 8);

    }
    并在主函数里设置了32MHz
    CLKCONCMD &= ~0x40;
  • 想输出周期20ms,宽度1.5ms的PWM,但是在蓝牙例程中输出的结果却是显示有误差。

    以为是在蓝牙期间有内外振荡器的切换,但经过测试之后显示并没有这样。

    也经过去掉蓝牙,只留PWM,输出结果就是正确的。

    如果不去掉蓝牙,不经过蓝牙设置PWM,手动开启,也会出现误差,但我需要精确的PWM
  • 谢谢您的反馈!之前有客户遇到了和您基本相同的问题,最终解决办法是将

    HCI_EXT_ClkDivOnHaltCmd( HCI_EXT_ENABLE_CLK_DIVIDE_ON_HALT );

    注释掉或者改成disable状态 HCI_EXT_DISABLE_CLK_DIVIDE_ON_HALT