基于MS16F3211芯片的触摸控制灯的状态变化和亮度控制(11.17,PWM控制与状态切换)

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.开发中遇到的卡点

现在的问题是灯会呼吸一次,并不是渐灭或者渐亮的状态,应该是逻辑还有问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值