CC2541上连接无源蜂鸣器的频率问题大家是怎么解决的?我用 Timer1 PWM方式和中断方式均可设定频率,但是声音不稳定,明显感觉到频率在急剧下降,蜂鸣器正常一下迅速到几乎只有轻微的哒哒响。
找了好久发现如果编译时去掉 POWER_SAVING 宏就很正常,不去掉在定时期间系统频率时刻在变化,Timer1没有一个稳定的输入时钟,输出的波形频率与设定值偏差巨大,同时,我用中断方式在中断例程里进行计数来决定结束时间,设定蜂鸣器响1秒,实际上要响90秒,频率降了90倍!而这些在去掉 POWER_SAVING 宏后就不会发生。
去掉POWER_SAVING 宏显然很不现实,改用 CLEAR_SLEEP_MODE(); 和 pwrmgr_attribute.pwrmgr_device = PWRMGR_ALWAYS_ON; 禁止睡眠,但响声仍然是“哒哒哒….嘀 哒哒哒….嘀 …”,显然,哒哒哒是系统时钟切换到了16MHZ,“嘀”时蓝牙启动了广播,系统时钟切换回32MHZ了,晕!
这大概也是以前有些人问为什么设定频率100HZ实测只有50HZ的原因了。
2541 Timer 不能输出稳定的波形吗?随系统时钟频率的切换而输出各种各样的波形?大家是如何解决频率设定的问题的?如何获得稳定的频率?
Frank J:
贴出实验用代码:
void Buzz(){ //1. P0DIR |= 0x08; //set P0.3 as output
P0SEL |= 0x08; //set P0.3 as peripheral
//2. PERCFG = (PERCFG & ~0x40) | 0x03; P2DIR |= 0xC0; //Give priority to Timer 1
//3. T1CTL = 0x00; //stop time 1 if it is running //4. T1CC0L = 0xC8; // 1480 T1CC0H = 0x05; T1CC1L = 0xE4; // 740 T1CC1H = 0x02;
T1CCTL1 = 0x34;//
T1CNTL = 0; // Reset timer to 0; T1CNTH = 0; // Reset timer to 0; T1CTL = 0x06; // Div = 8, Modulo}
Barbara Wu:
回复 Frank J:
试试注释掉代码里面的如下函数
HCI_EXT_ClkDivOnHaltCmd( HCI_EXT_ENABLE_CLK_DIVIDE_ON_HALT );
Frank J:
回复 Barbara Wu:
用的是SimpleBLEBroadcaster做的实验,项目里没有发现有调用 HCI_EXT_ClkDivOnHaltCmd () 函数的地方
cedar_xuesong:
回复 Frank J:
在SimpleBLEBroadcaster_Init添加
HCI_EXT_ClkDivOnHaltCmd( HCI_EXT_DISABLE_CLK_DIVIDE_ON_HALT );
这行代码试试
Frank J:
回复 cedar_xuesong:
cedar_xuesong 你好!
谢谢,试过了,没有看到效果,协议栈在这个问题上似乎欠考虑,pdf上说Timer1的系统时钟源是32MHZ,或16MHZ的OSC,实际上Timer的输入时钟源甚至可以是32.768KHZ的睡眠时钟,且应该在定时过程中随意变换,一次定时过程中没有一个唯一的输入时钟源,用led灯去做实验,亮灭的情况更清楚地看到这一点
不知道你们在做这些事情的时候是用了什么方法。