|
|
楼主 |
发表于 2016-10-5 23:46:11
|
显示全部楼层
本帖最后由 白小淘 于 2016-10-5 23:55 编辑
带有电压检测的全功能程序。
这个程序用了新的模式检测算法,节省了大约2ms左右的时间,然后加入的电压检测没有我想象中的耗时,所以,程序的模式切换延时在20ms内
程序从低压状态恢复正常状态的延时会大些,最大在460ms左右,但是这个……正常情况下电压是越来越低的吧……
一共2个模式,没有用3需要可以加上去,加上没有其他影响,1种模式呼吸,一种模式关闭。
任何状态下,电压低于10.8V灯开始单闪,低于10.5V开始常亮。
设计的理想状态下电压检测的误差在50mV以内,由于电阻误差的存在,实际误差会在100-200mV左右,这是使用的普通电阻,换高精会好得多。
检测电压的值,设计的是用实际电压除以0.05376得到的,下面的程序我校正过,所以除的0.0527。
int ZQ=4;
int mode;
int val=0;
void setup()
{
DDRB = 0x0E;
DDRD = 0xF8;
}
void loop()
{
mode=pulseIn(2,1);
mode=mode/600;
val=analogRead(0);
if(val<200) {m1(0); m2(0); m4(0); m3(1); return;} //电压低于10.5,开启模式3,关闭其他
if(val<=205) {m1(0); m3(0); m4(0); m2(1); return;} //电压低于10.8,开启模式2,关闭其他
if(ZQ!=mode)
{
ZQ=mode;
if(ZQ==1) {m3(0); m2(0); m4(0); m1(1);} //这里没有了第2段,可控的模式只写了1,3两种,需要的可以加上去,没有影响
if(ZQ==3) {m1(0); m2(0); m3(0); m4(1);}
}
}
void m1(int i)
{
if(i!=1) return;
for(int t=0; t<=255; t=t+5)
{
analogWrite(3,t);
analogWrite(5,t);
analogWrite(6,t);
analogWrite(9,t);
analogWrite(10,t);
analogWrite(11,t);
delay(8);
}
int x=0; while(x <= 36){loop(); x++;} //主循环运行一遍大约需要11ms,重复运行36遍,相当于延时396ms
for(int t=255; t>=0; t=t-5)
{
analogWrite(3,t);
analogWrite(5,t);
analogWrite(6,t);
analogWrite(9,t);
analogWrite(10,t);
analogWrite(11,t);
delay(8);
}
x=0; while(x <= 36){loop(); x++;}
m1(1);
}
void m2(int i) //模式2为单闪
{
if(i!=1) return;
PIND = 0xF8;
PINB = 0x0E;
ZQ=4;
delay(450);
loop();
m2(1);
}
void m3(int i) //模式3为常亮所有通道
{
if(i!=1) return;
PORTB = 0x0E;
PORTD = 0xF8;
ZQ=4;
delay(8);
loop();
m3(1);
}
void m4(int i) //模式4为关闭所有通道
{
if(i!=1) return;
PORTB = 0xF1; PORTD = 0x07;
loop();
m4(1);
}
|
评分
-
查看全部评分
| |