我用的AO3400控制一个固态继电器来实现PWM渐变
有个问题,是渐亮的时候在后端会增量明显,想要黑色线条效果,最终确实红色线条效果.
我感觉是是LED在问题,越到后,需求电流就越小,然后电压升高.亮度变化更快.
有什么解决办法呢?
单片机源程序如下:
#include "reg51.h"
sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
sfr P1M1 = 0x91;
sfr P1M0 = 0x92;
sfr P2M1 = 0x95;
sfr P2M0 = 0x96;
sfr P3M1 = 0xb1;
sfr P3M0 = 0xb2;
sfr AUXR = 0x8e;//辅助寄存器
sbit P14 = P1^4; //PWM输出脚
unsigned int HIGHDUTY,LOWDUTY,q;//高低时间存放寄存器
unsigned char num;//记录分辩个数
bit flag;
void Delayms(unsigned int ms)//1mS@11.0592MHz
{unsigned char i, j;
while(ms--)
{
i = 11;
j = 190;
do
{
while (--j);
} while (--i);}
}
void main()
{ P37=0;
P0M0 = 0x00;
P0M1 = 0x00;
P1M0 = 0x00;
P1M1 = 0x00;
P2M0 = 0x00;
P2M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
AUXR = 0x80; //定时器0为1T模式
TMOD &= 0xf0; //设置定时器0为模式0(16位自动重装载)
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
EA = 1;
HIGHDUTY=54477+(11058/255)*num;
LOWDUTY=54477+(11058/255)*(256-num);
while (1)
{
if(q==1){
num++;
}else{
num--;
}
//HIGHDUTY=60006+(5529/255)*num;
//LOWDUTY=60006+(5529/255)*(255-num);
HIGHDUTY=(65535/255)*num;
LOWDUTY=(65535/255)*(255-num);
if(num==255){q=0;}
if(num==0){q=1;}
Delayms(5);
}
}
void tm0() interrupt 1//定时器0中断服务程序
{
flag = !flag;
if (flag)//反转标志去执行高低电平的时间
{
TL0 = HIGHDUTY; //设置定时初值
TH0 = HIGHDUTY>>8;//设置定时初值
P14=1;//输出高电位
}
else
{
TL0 = LOWDUTY; //设置定时初值
TH0 = LOWDUTY>>8; //设置定时初值
P14=0;//输出低电位
}
}
|