我用的AO3400控制一個固態繼電器來實現PWM漸變
有個問題,是漸亮的時候在后端會增量明顯,想要黑色線條效果,最終確實紅色線條效果.
我感覺是是LED在問題,越到后,需求電流就越小,然后電壓升高.亮度變化更快.
有什么解決辦法呢?
無標題.png (6.2 KB, 下載次數: 37)
下載附件
2022-5-12 15:52 上傳
單片機源程序如下:
#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;//輸出低電位
}
}
|