微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI蓝牙设计交流 > CC2540定时器1输出PWM信号不精准。

CC2540定时器1输出PWM信号不精准。

时间:10-02 整理:3721RD 点击:

SimpleBLEPeripheral基础上更改。

128分频,定时器1使用调制模式,T1CC0 = 0X00FF,通道1-3比较输出PWM脉冲。隔一段时间PWM波形里多了大概0.4mS.


void PWM_init()
{
//设置pwm端口为输出
P0DIR|= BV(3)|BV(4)|BV(5);
//设置pwm端口为外设端口,非gpio
P0SEL|= BV(3)|BV(4)|BV(5);
//由于uart等会占用我们当前使用的pwm端口,因此需要将uart等重映射到别的端口去。
PERCFG |= 0x33; // Move USART1&2 to alternate2 location so that T1 is visible


T1CTL = 0x0e; // Div = 128, CLR, MODE = module
T1CCTL1 = 0x1c; // IM = 0; CMP = Clear output on compare; Mode = Compare
T1CCTL2 = 0x1c; // IM = 0; CMP = Clear output on compare; Mode = Compare
T1CCTL3 = 0x1c; // IM = 0, CMP = Clear output on compare; Mode = Compare
T1CNTL = 0; // Reset timer to 0;
T1CNTH = 0; // Reset timer to 0;

//必须设置,否则定时器不工作
T1CCTL0 = 0x4C; // IM = 1, CMP = Clear output on compare; Mode = Compare
T1CC0H = 0x07; // Ticks = 375 (2.4ms)
T1CC0L = 0XF8; // Ticks = 375 (2.4ms)

T1CC1H = 0x03; // Ticks = 375 (1,5ms initial duty cycle)
T1CC1L = 0Xc0;
T1CC2H = 0x03; // Ticks = 375 (1,5ms initial duty cycle)
T1CC2L = 0Xc0;
T1CC3H = 0x03; // Ticks = 375 (1,5ms initial duty cycle)
T1CC3L = 0Xc0;

EA=1;
IEN1 |= 0x02; // Enable T1 cpu interrupt
}

Hi Wanglin,

有没有试过关闭低功耗模式?

我关闭所有中断,只留定时器1中断后PWM信号就稳定了。只是收发数据功能没了。

关闭低功耗在哪里关闭?我先找找看

void osal_pwrmgr_init( void )//是不是这个?always on
{
pwrmgr_attribute.pwrmgr_device = PWRMGR_ALWAYS_ON; // Default to no power conservation.
pwrmgr_attribute.pwrmgr_task_state = 0; // Cleared. All set to conserve
}


//EA=1;
IEN1 = 0x06; // Enable T1&T2 cpu interrupt
IEN0 = 0x80;
SLEEPCMD = 0x84;

好像蓝牙系统使用了time2,打开定时器2中断后,收发就正常了.但是PWM信号不稳定。

关闭time2就稳定了(不能收发)。

Hi,yan,能告诉我哪里可以关闭低功耗吗?我将SleepCTL.mode =00,好像没有效果唉

求答复,谢谢

Hi wanglin,

你不需要改其他地方代码, 只要在编译选项里面把POWER_SAVING 去掉就行.

xPOWER_SAVING 已经去除但是还是不行,点灯依然有闪烁!。只有关闭time2中断才没有这个多余的时间,但是与此同时,BLE数据功能也没有了。

如下代码也试过效果,也不能解决问题。。。。

// Minimum connection interval (units of 1.25ms, 80=100ms) if automatic parameter update request is enabled
#define DEFAULT_DESIRED_MIN_CONN_INTERVAL 800

// Maximum connection interval (units of 1.25ms, 800=1000ms) if automatic parameter update request is enabled
#define DEFAULT_DESIRED_MAX_CONN_INTERVAL 800

Hi,Yan,

求问如何设定time1和timer2的中断优先级?我想把timer1的中断优先级提高,那就没有timer2中断来抢时间了,这么干应该可以吧?

Hi Wanglin,

请参考以下datasheet的 49页 2.5.3 Interrupt priority.

CC254x的IO口是可以设置中断优先级的. 参看以下那几个表格, 根据group来设置.

Hi,yan:

我将timer1的优先级调至3,其余在2以下,也一样不能解决问题。

是不是PWM模块(或者是timer1)根本就不是一个硬件模块?按照道理,只要不去变更硬件配置,PWM可以独立工作的啊。实在不能理解。抓狂中了

单独跑PWM,一点问题都没有~!BLE到底如何黑了TIMER1的时间呢?SOS

请问下我把你的这段PWM程序放在SimpleBLEPeripheral里蓝牙就连接不上了,我查了下是我把PWM定时中断1开启了就连接不上了,这是为什么啊?救急。。谢谢你了

可能你的代码是需要按键广播的。是不是按键被屏蔽了?查一下广播部分的代码喽

你好,请问PWM跳动的问题解决了吗?能否介绍下,398230338@qq.com,谢谢

我也碰到类似问题,按照你说的把POWER—SAVING去掉了,还是有一些改变的,在最亮的时候没有出现不定时的闪烁(没去掉之前是有的),但是当调节占空比亮度很低的时候或者在中间段,还是出现了不定时的闪烁,尤其在低亮度的时候观察的很明显,不定时闪烁几下!

能不能用notification发送数据,把发送数据和timer1的PWM在2个分离的时间片段里工作?

我碰到和你类似的问题已经解决了,主要出现了两个问题:1:需要把POWER_SAVING关闭或者在INIT函数里加osal_pwrmgr_device(PWRMGR_ALWAYS_ON);2:必须关闭CLK自动分频,HCI_EXT_ClkDivOnHaltCmd( HCI_EXT_DISABLE_CLK_divIDE_ON_HALT );!

Hi Yang,

    你这个问题解决了吗?我也遇到了同样的问题,可盲无头绪。不知问题到底出在哪。

务必要仔细看浏览一遍帖子,你头顶上就是解决方法!

Hi rtos,

我是在问Yang Zhi1 在这个帖子里所问的问题,而不是楼主的那个事。我在Yang Zhi1的回复那边点的回复,没想到TI 的这个论坛太简单,不支持嵌套回复。结果显示好像我在问楼主的问题了。

如果你有啥建议,欢迎指点。

hi,Wanglin Li,你的这个问题解决了吗,我也遇到类似问题都很长时间了,还没有解决,可以一起讨论一下吗,qq245415949,谢谢

 Filename:       simpleBLEPeripheral.c

HCI_EXT_ClkDivOnHaltCmd( HCI_EXT_ENABLE_CLK_divIDE_ON_HALT );

删除这段代码就OK了。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top