主题 : 请大侠们看看这个pwm的程序 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 22203
精华: 0
发帖: 14
金钱: 70 两
威望: 14 点
贡献值: 0 点
综合积分: 28 分
注册时间: 2010-05-28
最后登录: 2011-06-15
楼主  发表于: 2010-05-29 03:41

 请大侠们看看这个pwm的程序

                  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秒中断一次(这里不是200us中断一次,人家设置2500,自己觉得不对,乱设的~~不知道咋设置~)
    //下面都是自己 按一个51单片机的程序改的 但是改的不成功,由于中断舍得不好,有闪烁
     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级亮度亮了,但是 是闪烁的,那位大侠可以改改,放上来大家学习下~~我也受教了~~