看了两天文档才慢慢看懂,有点满了
现在接着前一天的思路,可以通过代码来控制pwm的占空比。我这里采用的是TP0定时器
- void LED_PWM_OPEN(void)
- {
- //占空比 PWM1-Y-PB2
- PWM1DH = 0X0F;
- PWM1DL = 0X00;
-
- //占空比 PWM01-W-PB1
- PWM0DTH = 0X01;
- PWM0DTL = 0X00;
-
- //占空比 PWM0-BLUE-PB0
- //PWM0DH = 0XFF;
- //PWM0DL = 0X00;
-
- //周期
- PWM0PH = 0X00;
- PWM0PL = 0X00;
-
- //PB0输出
- PWMPSCON = 0x04;//--11 1111 :PB0-OUT
-
- //pwm0c
- PWM0C = 0xc2;//PWM0C_Buf; //11-- 0011 :Fosc/2
-
- //PWM0EN
- PWM0EN = 0x9d;//PWM0EN_Buf; //1-01 1101 :TP0-EN;8BIT;PWM0X-EN;独立模式;PWM-EN
-
-
- FTP0IF = 0;//TP0 溢出中断标志位,TP0 溢出时被置位,软件清除
- FTP0IE = 1;//TP0 溢出中断使能位(1=使能,0=失能)
- FTP0EN = 1;//启动 TP0 定时器
- FGIE = 1;//开全局中断
-
- }
然后在中断函数中调用
- void interrupt myIsr(void)
- {
-
-
- if (FTP0IF)
- {
- FTP0IF = 0;
- }
- //----User Code End----
- }
思路简略得写在注释了,以后总结再详细一点。
现在需要设定PWM的值可以在3s内由最高降到最低,那么通过设置这个定时器每1ms中断一次,占空比每1ms减少0.03%。达到每1s占空比减少30%就可以达到效果


这里PWM0PH和PWM0PL的值在定时器初始化均设至为0,所以
PWM0X的占空比等于=占空比设定的值*PWMX0工作时钟源周期
=占空比设定的值*1/PWMX0工作时钟源频率
这里通过寄存器手册可以得知占空比可以设定的最大值为0XFFF,

这个寄存器可以设定的最大值为4095,定时器的频率设置为Fosc/2,也就是1950HZ/2=975HZ

也就是一秒钟中断957次,此时把重装载值设定为1170,与4095之间的差值为975X3。在定时器内对PWM0DL和PWM0DH的值进行调整,那么在3s后占空比就会达到最亮
原本的思路是在按键扫描函数中设置FTP0IF = 1,然后可以执行


这一段代码来对PWM的调节。但是结果并不像想象中那个样子,现象为灯的颜色不变,长按或者短按按键均无反应。
猜想1:是不是按键扫描函数的中断执行的太慢了,导致PWM的值不能及时地累加,导致现象不明显,目前未排除
猜想2:TP0的定时器中断一直打断TIMER定时器的中断,对应中断函数无法执行。不过发现其他按键依旧可以顺利执行,排除这个可能。
暂且不管上面,想到个方法采用了在按键扫描中对FTPOIE这个TP0定时器的中断溢出标志位进行改变,相当于控制定时器的开启和关闭。如果点按的话由于事件过短定时器的开启和关闭就一瞬间,对亮度没什么影响。

现在的问题是灯会呼吸一次,并不是渐灭或者渐亮的状态,应该是逻辑还有问题。
这个芯片的Fcpu和Fosc多大