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
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
相关阅读 更多 +