|
static int ii=0;
int ledDirection=0;//控制led由灭向亮再到灭
int time=0;
rGPBDAT = 0x1e0; //蜂鸣器不响,LED灭
rSRCPND = rSRCPND | (0x1<<14);
rINTPND = rINTPND | (0x1<<14);
rINTMSK = ~(0x1<<14); //打开定时器4中断(这是人家写的,不知道为撒是定时器四~我认为应该是定时器0才对`~
rTCFG0 &= 0xFF00FF;
rTCFG0 |= 0x0000; // prescaler等于0,0.04us
rTCFG1 &= ~0xF0000;
rTCFG1 |= 0x200; //divider等于8,则设置定时器4的时钟频率为25MHz
rTCNTB0 =5000; (这里自己大概算了下,好像是这个数)
rTCMPB0=0; (开始时占空比为0)
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 =0x5000;//重新赋值(不知道这里需不需要重设下)
if(time>100)//每20ms 调整一下占空比
{
time=0;
if(ledDirection==0&&ii<=99)
{
ii++;
if(ii>99)
{
ii=100;
ledDirection=1;
}
}
if(ledDirection==1&&ii>=0)
{
if(ii<0)
{
ii=0;
ledDirection=0;
}
}
rTCMPB0=ii;
}
if(rTCMPB0>0)
{
rGPBDAT=~0x1e0;
rTCMPB0--;
}
else
{
rGPBDAT=0x1e0;
}
}
看了两天的pwm ,还是没有弄的特别明白,只是知道 控制占空比,实现变化~~但是我是一个地道的初学者,基础很差~~呵呵请大侠帮忙下 ,谢谢·~
这是程序的一部分,主要目的是让led 按100级亮度从小到大在到小亮~~但是这个我不会设置定时器每200us 中断一次,中间while是自己写的,但是改了好几次,也不知道咋弄~~虽然这个是按100级亮度亮了,但是 是闪烁的,那位大侠可以改改,放上来大家学习下~~我也受教了~~
(我自己在修改程序时~~不知道那弄错了~~结果整个板子漏电~~打死我了~~整个手臂,请大侠们救救俺,不然要不是俺挂了,就是板子报废~~) |
|