实验7 PWM 控制蜂鸣器实验



大多数负载(无论是电感性负载还是电容性负载)需要的调制频率高于10Hz。通常调制频率为1kHz 到200kHz 之间。从模拟信号转向PWM 可以极大地延长通信距离。在接收端,通过适当的RC 或LC 网络可以滤除调制高频方波并将信号还原为模拟形式。

PWM 脉冲频率由TCNTBn 决定。PWM 脉冲宽度值则由TCMPBn 的值来决定。

基于双缓冲器的特性,下一个PWM 周期的TCMPBn 值可以通过ISR 或其它手段,在当前PWM 周期中的任何一点写入。

 

定时器输入时钟频率=PCLK/{预分频}/{分割值}
{预分频值}=1~255;
{分割值} =2,4,8,16,32

 

7.1 Timer1 频率设定程序

void Buzzer_Freq_Set( U32 freq )
{
//set GPB1 as TOUT1, pwm output
rGPBCON = rGPBCON &~(3<<2)|(1<<3);
rTCFG0 = rTCFG0 &~(0xff)|(15);//TCFG0――时钟配置寄存器0,低8位00001101,预分频值15 
//Timer0和timer1共用一个8bit的prescaler
rTCFG1 = rTCFG1 &~(0xf<<4)|(1<<5);//TCFG1――时钟配置寄存器1,timer1:1/4,timer2:no care
rTCNTB1 = (PCLK>>7)/freq;//TCNTB1――timer1 计数缓存寄存器.看门狗定时器使用,当时钟计数减为0(超时)时,它将产生一个128 个时钟周期(PCLK)的复位信号。
rTCMPB1 = rTCNTB1>>1; // 50%,TCMPB1――timer1 比较缓存寄存器
//disable deadzone, auto-reload, inv-off, update TCNTB1&TCMPB1, start timer 1
rTCON = rTCON &~(0xf<<8)|(0xb<<8);//TCON――时钟控制寄存器,8-11位1011,启动timer1,取决TCNTB1,TCMPB1,自启动,非取反
rTCON &= ~(1<<9); //clear manual update bit
}



7.2 关闭timer1 中断

37个寄存器 是R1-R16.(当然,里面有很多是分几个模式的,所以总共有37个),类似于单片机的R0-R7。

GPXCON,GPXDAT等等是另外的寄存器,应该叫,特殊功能寄存器,类似于单片机的P0,P1,TCON,等等。

GPXCON:是X管脚的控制寄存器,控制它们的模式,比如输出模式,输入模式……

GPXDAT:是X管脚的数据寄存器,存储它们的数据,比如:在输出模式中,想在X管脚输出什么数据,就在这个寄存器里写入什么数据,在输入模式中,这个寄存器中存储的就是外部输入的数据。

 

void Buzzer_Stop( void )
{
rGPBCON &= ~12; //set GPB1 as output,设置GPBCON寄存器选择相应I/O口
rGPBCON |= 4;
rGPBDAT &= ~1;
}

 

 7.3 测试主函数

 

void xmain(void)
{
ChangeClockDivider(3,1);//1:3:6
ChangeMPllValue(127,2,1); //405MHZ
Port_Init();
Isr_Init();
Uart_Init(0, 115200);
Uart_Select(0);
Uart_Printf("the main is running\n");
BUZZER_PWM_Test();
}


 

7.4 timer1 测试程序

 


void BUZZER_PWM_Test( void )
{
U16 freq = 2000 ;
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();
if( key == '+' )
{
if( freq < 20000 )
freq += 100 ;
Buzzer_Freq_Set( freq ) ;
}
if( key == '-' )
{
if( freq > 100 )
freq -= 100 ;
Buzzer_Freq_Set( freq ) ;
}
Uart_Printf( "\tFreq = %d\n", freq ) ;
if( key == ESC_KEY )
{
Buzzer_Stop() ;
return ;
}
}
}


 

 

 

 

 


 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值