Main函数之BUZZER
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Main函数之BUZZER_PWM_Test分析
void BUZZER_PWM_Test( void )
{
U16 freq =800;// lci 1000 ;-----预设的蜂鸣频率
Uart_Printf( "\nBUZZER TEST ( PWM Control )\n" );
Uart_Printf( "Press +/- to increase/reduce the frequency of BUZZER !\n" ) ;
Uart_Printf( "Press 'ESC' key to Exit this program !\n\n" );
Buzzer_Freq_Set( freq ) ; -------改变蜂鸣的频率
while( 1 )
{
U8 key = Uart_Getch(); -------获取secureCRT上输入的字符
if( key == '+' )
{
if( freq < 2000 ) //lci 20000 ------上限是2000
freq += 10 ;
Buzzer_Freq_Set( freq ) ; --------当freq改变后,改变TCNTB0、TCMBP 的值
}
if( key == '-' )
{
if( freq > 11 )
freq -= 10 ;
Buzzer_Freq_Set( freq ) ;
}
Uart_Printf( "\tFreq = %d\n", freq ) ;
if( key == ESC_KEY ) ------退出测试
{
Buzzer_Stop() ; -------停止蜂鸣
return ;
}
}
}
void Buzzer_Freq_Set( U32 freq )分析:结合英文的datasheet看
void Buzzer_Freq_Set( U32 freq )
{
rGPBCON &= ~3; //看datasheet知:set GPB0 as tout0, pwm output rGPBCON |= 2; //GPB0=10,因为GPBO是多功能引脚
rTCFG0 &= ~0xff;
rTCFG0 |= 15; //prescaler = 15+1
rTCFG1 &= ~0xf;
rTCFG1 |= 2; //mux = 1/8
rTCNTB0 = (PCLK>>7)/freq; -----因为freq改变了,所以TCNTB0也跟着改变了
rTCMPB0 = rTCNTB0>>1; // 50%
rTCON &= ~0x1f; ------先将TCON[0:4]清零,待赋值
rTCON |= 0xb; //相应的引脚置0或置1决定了功能:disable deadzone, auto-reload, inv-off, update TCNTB0&TCMPB0, start timer 0。
其实,inv-off的设置,还是有点学问。这里无论是开还是关,效果是一样的。因为占空比为1/2。但如果不是1/2,见datasheetP319,由图可知,当inverter-on 时,先高后低,当inverter-off时,先低后高。当为高时,驱动蜂鸣器。rTCON &= ~2; //clear manual update bit。注意看datasheet上的note,就知道为什么要手动关闭
关于定时器0的设置可以参看datasheet上面的,有一段讲到,定时器设置的顺序。P316。
1、首先,给TCMPB、TCNTB赋值。(因为启动时,没有值,必须手动设置)
2、TCON[1]update位置1(因为置1后,才将TCMPB、TCNTB的值,送到TCNT、TCMP)。反相器随便。
3、TCON[0]start位置1,开启定时器,并将update清0(更新TCNTB、TCMPB必须先清0)。
}