天嵌 ARM开发社区

 找回密码
 注册
查看: 1605|回复: 1

请高手看下这个pwm的程序

[复制链接]
erteron 发表于 2010-5-29 04:07:17 | 显示全部楼层 |阅读模式
本帖最后由 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级亮度亮了,但是 是闪烁的,那位大侠可以改改,放上来大家学习下~~我也受教了~~
 楼主| erteron 发表于 2010-5-29 22:51:39 | 显示全部楼层
没人问津 ~~诶 ~~失败呀~~~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-6-1 07:34 , Processed in 1.078125 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表