2.过程思路
看了两天文档才慢慢看懂,有点满了
现在接着前一天的思路,可以通过代码来控制pwm的占空比。我这里采用的是TP0定时器
初步控制pwm的占空比
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内由最高降到最低
现在需要设定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后占空比就会达到最亮
通过按键控制PWM输出变化
原本的思路是在按键扫描函数中设置FTP0IF = 1,然后可以执行
这一段代码来对PWM的调节。但是结果并不像想象中那个样子,现象为灯的颜色不变,长按或者短按按键均无反应。
猜想1:是不是按键扫描函数的中断执行的太慢了,导致PWM的值不能及时地累加,导致现象不明显,目前未排除
猜想2:TP0的定时器中断一直打断TIMER定时器的中断,对应中断函数无法执行。不过发现其他按键依旧可以顺利执行,排除这个可能。
暂且不管上面,想到个方法采用了在按键扫描中对FTPOIE这个TP0定时器的中断溢出标志位进行改变,相当于控制定时器的开启和关闭。如果点按的话由于事件过短定时器的开启和关闭就一瞬间,对亮度没什么影响。
3.开发中遇到的卡点
现在的问题是灯会呼吸一次,并不是渐灭或者渐亮的状态,应该是逻辑还有问题。