红外线遥控双向可控硅调光问题请教
红外线遥控双向可控硅调光,过零检测频繁的10ms需要触发一次,如果中间丢失一个触发脉冲就会闪,多丢几个就不亮,单片机都给10ms占用了,如果红外线遥控(解码需要最少15ms)的程序就没法调光了,有什么方法可以解决这个问题啊,我用51没找到好的解决方法,请大家指点! 10 ms 交给定时器中断处理 是给中断处理了,就是因为中断一直在处理这个10ms,耽误了其它程序运行,比如:主程序运行时接收一个信息码需要15ms,中断一直在检测10ms过零检测信号,这主程序就不能完成接收信号了,问题就是怎么处理这两个时间,或者有更好的方法错开这两个时间不会互相影响, 接收 到导前码就关外部 输入中断 (也就少了一次) 收完了在打开行不之后作数据处理 外部中断就在哪等过零信号
要不就这样 成功检测出3次后 取平均值控制给定时器每 10ms或多少ms 处理一下 SCR
一但收到红外信号就 从新检测或多少次开关 SCR后从新检测
在不~~~~ 双 MCU ~~ 哈哈 第一个方法尝试过,平时是直使用外中断一直做过零检测,检测多后延时固定的5ms,在用20us(or 200us)触发triac,当收到信号就关中断,处理接收信号,码长13ms,完了再开中断,结果是灯闪得很厉害.
第二个方法还要定时器每10ms或多少ms 处理一下双向可控硅,这个还是使用中断资源,可能不行.
难道真得双U? 你发生一次中断才 用去多少 us
之后制定时器 次数 标记清 0
定时器 次数变量记时(主程序作解码工作)
定时器 IF(次数变量 > 导通延时)
{
打开SCR
}
这不是有点象 双线程了 http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_593387KMQWJJ.JPG
(原文件名:rrrrr.JPG) 这样就优生保证 红外解码了又兼顾 SCR 的触发最多也就 丢 1 次为主 在多多丢2次 丢3次以上是哪个用摇控器的家伙人品问题
或者对定时器的数值进行控制 又或者设定时器为 2 方式 加工多一个标识符进去
反正在能力范围内解决问题! 谢谢楼上的详细解答,辛苦了.我再看看,理解能力有限,仔细分析一下再试一试. 解码和中断都在定时器中解决。
我一般是定义一个0.140ms的定时中断,通过计数法解码红外。
调光的延时也在这个中断中计算。就没有问题了。也不会丢码,也不影响调光! 单片机用几m晶振 gallle 能否说说具体是怎么计算的,在同一个中断中解决两个问题还真是不会分配.. 坐地上学习! 单片机用几12MHZ晶振 我做的调整是这样的,一个中断0专门检测过零信号。在里边通过当前的输出给出一个延时时间(用0.14ms的倍数)我要求的精度不高。
每次加减的时候,时间长度加减1。
定时中断0.14ms一次,设定2个变量做红外解码。一个变量做调光时间调整。
以下所有变量都是全局或静态变量。
中断0程序
IF ‘时间长度’>‘最大时间长度’,‘时间长度’=‘最大时间长度’
IF ‘时间长度’=0
{
调用‘关闭可控硅函数’}
‘延时时间’=0
ELSE {
调用‘打开可控硅函数’
‘延时时间’=0
}
中断0程序结束
定时中断函数(0.14ms)
IF‘延时时间’>=‘时间长度’
{
调用‘关闭可控硅函数’
}
ELSE ‘延时时间’+1
‘红外本地时基’取反
IF‘红外本地时基’//用0.28ms解码
{
IF‘本次状态’=0,‘上次状态’=0
ELSE ‘上次状态’=1
‘状态计数’+1
}
//通过‘状态计数’可以算出 高电平的次数,通过解码状态变量知道当前在解哪部分码 头码?用户码?还是什么的时间定一个范围,不要用精准的数。
例如解头码时9ms,计数28~36之间 36=10ms/0.28ms28=8ms/0.28ms
检测标准间隔4.5MS 12-20 20=5.5ms/0.28ms 12=3.5ms/0.28ms 调用‘关闭可控硅函数’~~~~~ 你作的是很高深的东西还是~~~~很怪怪的 谢大家的指点,终于有点眉目了,我是用汇编做的,但思路应该可以借鉴楼上两位的方法,再次感谢. 回复【14楼】gallle
我做的调整是这样的,一个中断0专门检测过零信号。在里边通过当前的输出给出一个延时时间(用0.14ms的倍数)我要求的精度不高。
每次加减的时候,时间长度加减1。
定时中断0.14ms一次,设定2个变量做红外解码。一个变量做调光时间调整。
以下所有变量都是全局或静态变量。
中断0程序
if ‘时间长度’>‘最大时间长度’,‘时间长度’=‘最大时间长度’
if ‘时间长度’=0
{
调用‘关闭可控硅函数’}
‘延时时间’=0
else {
调用‘打开可控硅函数’
‘延时时间’=0
}
中断0程序结束
定时中断函数(0.14ms)
if‘延时时间’>=‘时间长度’
{
调用‘关闭可控硅函数’
}
else ‘延时时间’+1
‘红外本地时基’取反
if‘红外本地时基’//用0.28ms解码
{ ......
-----------------------------------------------------------------------
再次麻烦大家看看我的调试过程,看哪里有问题.
参考上面的方法自己理解是:在定时器中断中同时做解码与调光处理.
思路;按时基法做解码,在时间推算到10ms时去处理调光程序,返回继续解码(理论上是只用50us时间,可能多一点,不会影响解码).
900us 起始码 (大约27个时基
450us 结果码 (大约13个时基
0 = 330us + 330us (
1 = 330us + 660 (大约1000us) (
过零检测 10ms (大约303个时基
时基=33us ,解码高电平与低电平识别500us (大约15个时基
用R4计数时基满255就清0,解码开始打开timer 0 ,方式2 .INC R4,当解码程序解码时,时间到10ms就去处理过零检测信号(时基法跟踪时间),返回后继续解码,当没有解码信号时一直等待处理过零检测信号
问题:
当解码到区分高低电平时,0 = 330 低 + 330 高,识别500us时间后剩余160us(大约5个时基) ,
但如果是高电平时,1 = 330 低 + 660 高,识别500us时间后剩余160us(大约13个时基) ,
但编码中"0","1"时间长度不同,这样R4中的时基标志就没法跟踪了,一时没有想到如何下一步,如何处理? 想到另一个办法,就是将编码分成两部分,中间加入过零检测处理程序,这个程序给足时间10ms ,就当它是一个10ms的延时程序,解码测试已经ok.等明天加入过零检测程序再看看又没问题。 终于给搞好了,其实就是解码方法的问题。再次感谢楼上大侠们的指点。 楼主这个系统抗干扰如何啊,常见调光台灯经常莫名的闪亮几下,做成很容易,关键是做好。./emotion/em003.gif 对,这个问题比较好,待观察 楼上,我做的也是偶尔灯闪,麻烦死了,唉烦人,做了一百台,问题比较多,刚开始做样机的时候没发现这个问题的 刚才终于搞定偶尔闪闪的问题,每个人做得东西可能不一样,结果也会不同。说说我的问题:
现象:在调光时偶尔闪烁。
资源分配如下:
INT0 做过零检测,
T0 做 1-9ms 可变定时器用来调光(级数200)
T1做红外线解码时标
原来会闪烁时是因为T1做 双向可控硅触发用,也同时做红外线解码时标,虽然在程序中有判断如果T0触发就优先,红外线启动就等50us线触发双向可控硅,(时标50us),但仍然会偶尔闪烁。
改为T0时间到后直接在T0哪里延时20-50us就触发双向可控硅就可以了。现在连续测试一天没发现问题。
判断是否闪烁的方法:
1.旁边放一个白炽灯做参考,如果哪个参考的白炽灯有闪烁时可以排除交流电不稳的因素。
2.用示波器观察过零检测 同步信号是否正常,触发双向可控硅的信号是否正常。
楼是是怎么做的,能否讲讲大家交流一下? 我的,好像是过零有干扰,用的是几个三极管和光耦搭起来的过零电路,本来最早是用电阻分压加整流桥和光耦做的(这种不会闪烁,就是电阻温度有点高烫手),还有就是有个麻烦的地方,无法自动适应外部电源频率的大变动,比如50/60自适应,调光在某些段而且(在比较亮的情况下)会闪烁而且还是在办公室这边的插座不管是哪一个都不会闪到了走廊上边的插座就会偶尔有闪烁,烦死,我的总共15级,级数比较少,呵呵,无线加双路调光恩无线信号加在两个过零信号的的中间解码。我用的是PIC的单片机,单片机做可控硅调光加无线解码,定时器全部用完了,具体和楼上差不多的,也是用电平中断的方式检测过零的,因为无线解码要用边缘中断,然后用定时器做延时处理 最近想出来的方法调压实现"脱机"自成一个模块(还只是纸上YY 还未拿实物测试)
不想打代码~~~~ 自己看
http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_599762X4A513.jpg
(原文件名:scr.jpg)
思路是 由T1作 定时自动处理主线程每 15秒或5秒 从新检测一次过零信号 修正 T1 的过零值 (附带 可以 软修正 过零触发延时的问题)
还有一份~~~很粗糙的.... 已经实验过可用的 但~~~主线程一直的关注度无零信号 多任务不理想
sbit key1=P3^3; //过零
sbit key2=P3^5; // 可制硅触发
sbit key3=P3^7; //指示灯
//void delay(uint z);
uint ccc,a1,aa,a,m;
aaa=0;
while(1)
{
//=====================
if(aaa==0)
{
if(key1==0)
{
key2=0;
aaa=1;
}
}
//=====================
if(aaa==1)
{
if(key1==1)
{
key2=0;
aaa=0;
}
}
key2=1;
}//w1
}//ma 回复【24楼】lang6027
-----------------------------------------------------------------------
自动适应频率还没搞,能否检测到过零信号后判断是50HZ还是60HZ再切换定时器时间常数啊? 用计数器解码 实际就是计数器解码,但出现多线程时会复用计数器,这样会出现问题。 很好,我以后做这个玩意得要借鉴一下了,感谢各位的无私交流和高深的技术。 楼主能不能把你的思路解释的详细点 还是不能完全理解
Mark一下。
页:
[1]