文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>2440test中蜂鸣器部分的分析

2440test中蜂鸣器部分的分析

时间:2009-05-08  来源:Etual

BUZZER_PWM_Test()
1,蜂鸣器是接在 GPB0 / TOUT0
这个引脚是复用的,对应的是 TIMER0 的输出脚
2,设置输出频率 void Buzzer_Freq_Set( U32 freq )
{
 rGPBCON &= ~3;   //set GPB0 as tout0, pwm output
 rGPBCON |= 2;
  
 rTCFG0 &= ~0xff;
 rTCFG0 |= 15;   //prescaler = 15+1
 rTCFG1 &= ~0xf;
 rTCFG1 |= 2;   //mux = 1/8
 rTCNTB0 = (PCLK>>7)/freq;
 rTCMPB0 = rTCNTB0>>1; // 50%
 rTCON &= ~0x1f;
 rTCON |= 0xb;   //disable deadzone, auto-reload, inv-off, update TCNTB0&TCMPB0, start timer 0
 rTCON &= ~2;   //clear manual update bit
}
freq = 1000 HZ,蜂鸣器的驱动大概在 2K~4Khz左右
首先设定 GPB0 为 TOUT0 功能,引脚输出
然后设置 TCFG0 和 TCFG1 的分频值, 参看 P322
其中 TCFG0 设置prescale0 ,这个事 timer0 和 1 使用的
分频比为 15
在 TCFG1 中设置 timer0 的分频比为 1/8
设置 TCNTB0 ,也就是自动恢复的值,这里设置为 PCLK>>7/freq
也就是 50 000 000 >>7 /1000 = 390.625
TCMPB0 设置为 1/2 TCNTB0 也就是说占空比 50%
最后设置 TCON ,其中 bit 0~4 是控制 timer0 的
TCON设置为,自动装载,不翻转,手动更新,开启timer0
注意,第一次启动的时候必须手动更新一次。
timer的溢出频率 = PCLK /{prescale+1}/{divider value}
例如这里就是 50000000/(15+1)/8 = 625000 = 625Khz
这个事 timer0的计数也就是说,每 1/625 ms 的时间里面对timer0
里面的计数器减一,直到0为止,因为之前的 TCNTB0 设置为 390
那么可以算出这个方波输出的方波频率为 625K / 390 = 1.6K hz
这里跟预想的并不怎么匹配..... 3,后面的程序就没什么了。
读串口,看是 + - 按键然后就重新设置频率就完工了。
Etual
2009-5-7
 
相关阅读 更多 +
排行榜 更多 +
味子夫

味子夫

购物比价 下载
恩猫

恩猫

购物比价 下载
街头纷争

街头纷争

动作格斗 下载