|
本帖最后由 erteron 于 2010-5-29 04:09 编辑
rGPBDAT = 0x1e0; //蜂鸣器不响,LED灭
rSRCPND = rSRCPND | (0x1<<14);
rINTPND = rINTPND | (0x1<<14);
rINTMSK = ~(0x1<<14); //打开定时器4中断(这是人家写的,不知道为撒是定时器四~我认为应该是定时器0才对`~
rTCFG0 &= 0xFF00FF;
rTCFG0 |= 0xf900; // prescaler等于249
rTCFG1 &= ~0xF0000;
rTCFG1 |= 0x20000; //divider等于8,则设置定时器4的时钟频率为25kHz
rTCNTB0 =0xff; //让定时器4每隔200us秒中断一次(这里原先是125000,但是觉得不对改了,乱改的,不知道咋产生一个 200us的中断)
rTCON &= ~0x1F;
rTCON |= 0xf;//死区无效,自动装载,电平反转,手动更新,定时器开启
rTCON &= ~0x2; //手动更新位清零,PWM开始工作
pISR_TIMER4 = (U32)Timer4_ISR;
Lcd_ClearScr( (0xff<<11) | (0xf<<5) | (0x1f) ) ;
while(1)
{
Uart_Printf("rTCNTB0=%d RTCPMB0=%d\n",rTCNTB0,rTCMPB0);
time++;
rTCNTB0 =0xff;//重新赋值
if(time>25)//每20ms 调整一下占空比
{
time=0;
if(ledDirection==0&&ii<=99)
{
rTCMPB0=rTCNTB0*((float)ii/100);
ii++;
if(ii>99)
{
ii=100;
ledDirection=1;
}
}
if(ledDirection==1&&ii>=0)
{
//rTCMPB0=rTCNTB0*(ii/100);
ii--;
if(ii<0)
{
ii=0;
ledDirection=0;
}
}
ledcounter=ii;
}
if(ledcounter>0)
{
rGPBDAT=~0x1e0;
ledcounter--;
}
else
{
rGPBDAT=0x1e0;
}
}
看了两天的pwm ,还是没有弄的特别明白,只是知道 控制占空比,实现变化~~但是我是一个地道的初学者,基础很差~~呵呵请大侠帮忙下 ,谢谢·~
这是程序的一部分,主要目的是让led 按100级亮度从小到大在到小亮~~但是这个我不会设置定时器每200us 中断一次,中间while是自己写的,但是改了好几次,也不知道咋弄~~虽然这个是按100级亮度亮了,但是 是闪烁的,那位大侠可以改改,放上来大家学习下~~我也受教了~~ |
|