883zly 发表于 2008-8-20 16:16:09

315M再超生软件编解问题

我在用315M再超生接收模块时用视波器看到数据输出脚不停的输出方波(不是干扰信号),测试出是摸块输出的方波(不是接收到的用有信号)。然后在数据输出脚接了个39k电阻上拉,软件解码仁然跳出(只捕获到启示信号,然后就是大于启示信号的高电平跳出),解不出码来。请问各位高人,输出脚怎么处理掉方波,有经验的朋友希望告诉我方波频率。
小弟 实验事实证明软件编码正确。

avruser 发表于 2008-8-20 16:31:20

“超再生”./emotion/em077.gif

dxdq 发表于 2008-8-20 16:33:56

应该是供电电源的干扰导致的吧,我原来用开关电源供电时碰到过这种情况,改用模拟电源就好了

rainyss 发表于 2008-8-20 16:53:56

超再生本来就是这样的.去看看无线通信的书.先看我的帖子也行,看完再看书.
http://www.cdle.net/bbs/dispbbs.asp?boardid=11&Id=4052

简单的说下关键:无线通信与有线通信是完全不同的,无线通信在无信号时,接收方要假定为收到任意电平/信号.
解决办法:构造数据包,前面加前导码和起始码.前导码数目一般用100~400

miraclelife 发表于 2008-8-20 17:53:20

超再生 再超生? ^_^

marker 发表于 2008-8-20 19:23:08

先有超再生接收技术,后来才发展到现在在量使用的超外差式,不过超再式灵敏度最高,在遥控及其它领域还是有大量使用的。

lcw_swust 发表于 2008-8-20 20:40:27

应该是超再生接收方式产生的"超噪声",相当于调频收音机收不到台时的那种声音.用2262,2272做编解码就行了.

883zly 发表于 2008-8-22 12:09:16

.

883zly 发表于 2008-8-22 12:09:18

经过几天的测试,问题任然没有解决,我把我的编解码程序贴上来。看那位高人指导下。
编码用的51,12MHZ 解码用的AVR m8 1MHZ
编码程序。
#include <REGX51.H>
#include<intrins.h>

#define   uchar unsigned char
#define   uintunsigned int

#define          IR_WF         P1_3//数据发射端口

#define          IR            P1_0//指示灯
   

uchardata           btt=0;
uint   data       count=0;       //延时计数器
static    uint    endcount=0; //终止延时计数
ucharbdata      flag=0;      //红外发送标志
ucharbdata          IR_SendBuf={0x01,0xfe,0x57,0x58,};

uchar   bdata       timp=0;

delay_mm(uint ms)
{                                                        // 延时子程序
        uchar i;
        while(ms--)
        {
                for(i = 0; i< 250; i++)
                {
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_();
                }
        }
}

void SendIRdata(void)
{
int i;
ucharbdatairdata=0;
ucharbdata         tklme=0;
////////////////////////////////////////////////
for(tklme=50;tklme>0;tklme--)        //发送50次前导码
{
endcount=40;//发送1ms
count=0;
IR_WF=1;
TR0=1;
do{}while(count<=endcount);
   
//停止3ms
IR_WF=0;
TR0=0;
endcount=120;
count=0;
TR0=1;
do{}while(count<=endcount);

TR0=0;
endcount=0;
irdata=0;
}
//////////////////////////////////////
//发送1ms的起始码
       
endcount=40;
count=0;
IR_WF=1;
TR0=1;
do{}while(count<=endcount);
   
//不发送4ms
IR_WF=0;
TR0=0;
endcount=160;
count=0;
TR0=1;
do{}while(count<=endcount);

TR0=0;
endcount=0;
irdata=0;


//////////////////发送4字节数据///////////////////////
for(btt=0;btt<4;btt++)
{
irdata=IR_SendBuf;
for(i=0;i<8;i++)
{
    //先发送500us(即解码中0.5ms的低电平)
   endcount=20;
   count=0;
       IR_WF=1;
       TR0=1;
   do{}while(count<=endcount);

       TR0=0;
       endcount=0;
       count=0;
       
    //停止发送信号(即解码中的高电平)
   if(irdata-(irdata/2)*2)//判断二进制数个位为1还是0
   {
       endcount=60;//1为宽的高电平1500US
   }
    else
   {
   endcount=40;   //0为窄的高电平1000us
   }

        IR_WF=0;
        TR0=1;
    do{}while(count<endcount);
       
        TR0=0;
        count=0;
        endcount=0;
        irdata=irdata>>1;
};
}

//////////////////////////////////////////////
TR0=0;
count=0;
// endcount=100;
// IR_WF=1;
// TR0=1;
//do{}while(count<endcount);
//TR0=0;
endcount=0;
//count=0;
IR_WF=0;
}
//定时器0;25us中断一次
void timer0(void) interrupt 1 using2//25us
{
TH0=0xff;
TL0=0xf4;
count++;
}

void main(void)
{
ucharv=0;
delay_mm(100);
count = 0;
flag = 0;
IR_WF= 0;

TMOD = 0x01; //设定时器0为16位模式1
IE0=1;
ET0 = 1; //定时器0中断允许

TH0=0xff;
TL0=0xf4;

TR0 = 0;

EA = 1; //允许CPU中断

while(1)
{
IR= 0;
for(v=15;v>0;v--)
delay_mm(100);
IR_WF=0;//发送前端口低
IR= 1; //指示灯亮

SendIRdata();

for(v=15;v>0;v--)
delay_mm(100);
}
}
解码部分:
//包含所需头文件
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdint.h>
#include <avr/wdt.h>


#define FREQ         1
#define BIT(x)        (1<<(x))


#defineuchar   unsignedchar
#defineuint    unsignedint

ucharsttf=0;
ucharsreg=0;
ucharsfgh1=0;
ucharbitcnt=0;

uint   newFall=0;
uint   oldFall=0;
ucharfiasf=0;
uchardata0=0;
ucharuc_overcon=0;

unsigned long   vvvv=0;
unsigned int    ui_ringt=0;
unsigned int    ui_Falling=0;

unsigned char IR={0x11,0x22,0x33,0x44,0x55,};


void DelayMs(uint t)
{
uintp;
for(p=t;p>0;p--)
_delay_loop_2(FREQ * 250);
}

//定时器T1溢出中断服务程序
//#pragma interrupt_handler timer1_ovf_isr:9
//void timer1_ovf_isr(void)
SIGNAL(SIG_OVERFLOW1)
{
        uc_overcon++;
       
}

//定时器T1输入捕捉中断服务程序
//#pragma interrupt_handler timer1_capt_isr:6
//void timer1_capt_isr(void)
SIGNAL(SIG_INPUT_CAPTURE1)
{       

if(PINB&_BV(PB0))
{
ui_ringt=ICR1;
TCCR1B=0x00;
TCCR1B|=0X82;//设置成下降沿中断
uc_overcon=0;//益出计数器开始记数
}
else
{
ui_Falling=ICR1;
TCCR1B=0x00;
TCCR1B|=0xC2;//设置成上升沿中断
vvvv=(unsigned long)ui_Falling-(unsigned long)ui_ringt;//+(unsigned long)uc_overcon*0x10000/500;
ui_Falling=0;
ui_ringt=0;
uc_overcon=0;
}

/////////////////////header信号高电平4MS/////////////////////////
if((vvvv>3800) && (vvvv<4100))
{
bitcnt=0;       
data0=0;
vvvv=0;
fiasf=0;
}

if((vvvv>850) && (vvvv<1050)) // "0"信号高电平1MS
{
sttf=0;
vvvv=0;
bitcnt++;
data0=(data0>>1)+sttf;

}

if((vvvv>1400) && (vvvv<1600)) //“1”信号高电平1.5MS
{
   sttf=1;
   vvvv=0;
   bitcnt++;
   data0=((data0>>1)+sttf);
}

///////////////大于头信号时间退出/////////////////////////
if(vvvv>4200)
{   
        TCCR1A = 0x00;
    TCCR1B = 0x00;

    TCNT1H = 0x00;
    TCNT1L = 0x00;

    ICR1H= 0x00;
    ICR1L= 0x00;//输入捕捉匹配值
       
    TCCR1A = 0x00;
    TCCR1B = 0x81;//启动定时器
       
   
        bitcnt=0;
    vvvv=0;
    return;
}


if(bitcnt==7) //接收8位数据满
    {
        loop_until_bit_is_set(UCSRA,UDRE);
    UDR=data0;
        IR=data0;
        data0=0;
    }
       
else if(bitcnt==15) //接收16位满
    {
        loop_until_bit_is_set(UCSRA,UDRE);
    UDR=data0;
        IR=data0;
        data0=0;
    }
else if(bitcnt==23) //接收24位满
    {
        loop_until_bit_is_set(UCSRA,UDRE);
    UDR=data0;
        IR=data0;
        data0=0;
    }
       
else if(bitcnt==31) //接收32位满
    {
        loop_until_bit_is_set(UCSRA,UDRE);
    UDR=data0;
        IR=data0;
        data0=0;
    sreg = SREG;
    cli(); //禁止所有中断
        TCCR1A = 0x00;
    TCCR1B = 0x00;

    TCNT1H = 0x00;
    TCNT1L = 0x00;

    ICR1H= 0x00;
    ICR1L= 0x00;//输入捕捉匹配值
       
    TCCR1A = 0x00;
    TCCR1B = 0x81;//启动定时器
       
        SREG=sreg;
    bitcnt=0;
    }
else if(bitcnt>=32) //接收8位满
    {
        loop_until_bit_is_set(UCSRA,UDRE);
    UDR=data0;
        sreg = SREG;
    cli(); //禁止所有中断
        TCCR1A = 0x00;
    TCCR1B = 0x00;

    TCNT1H = 0x00;
    TCNT1L = 0x00;

    ICR1H= 0x00;
    ICR1L= 0x00;//输入捕捉匹配值
       
    TCCR1A = 0x00;
    TCCR1B = 0x81;//启动定时器
        SREG=sreg;
    vvvv=0;
        data0=0;
    bitcnt=0;
        }


}


int main( void )
{   
    DelayMs(100);
    cli(); //禁止所有中断
        MCUCR= 0x00;
        MCUCSR = 0x80;//禁止JTAG
        GICR   = 0x00;
       
        TCCR1B=0x00;
       
        PORTB=0B00000000;                      //PB0(ICP)上拉使能
    DDRB =0B00000000;                      //定义输入
       
        PORTC =0B00000000;                           //定义输入
        DDRC=0B00000000;                           //PC4上拉使能
       
        PORTD =0B00000100;
        DDRD=0B00000010;                           
       
        TCCR1B|=0xC2;//上升沿,1/8分频
       
        TIMSK|=0X24;//定时器,和扑获中断
       
       
    UCSRB = 0x00;//禁止中断
        UCSRA = 0x00;
        UCSRC = _BV(URSEL) | 0x36;
        UBRRL = 0x05;
        UBRRH = 0x00;
    UCSRB = _BV(TXEN);//接收使能、发送使能、(调试用)
        sei();//开全局中断
       
while(1)
{
asm("nop");
}
}

whimsy 发表于 2008-8-24 15:45:09

前几天也在搞这个,接收灵敏度是-103dbm的模块,在无信号的时候,确实会有很多方波。
(那种低功耗的模块,灵敏度低的,在无信号时,不会有方波)

我解决的方法是,发射端在发送编码的时候,
加上一个规定宽度的同步头,我自己定为3ms,
数据编码采用曼切斯特,数据校验用DOW(DS1990A)

whimsy 发表于 2008-8-24 15:47:59

还有就是,这种模块本身就传输的速率有要求的,要小于10Kps,
所以发射端传输的位周期要控制好,我的是位周期512uS

wrang_hn 发表于 2008-8-24 17:55:22

楼上的可以参考《无线电》杂志2008 第一期里的 《用单片机做的8通道无线遥控器》里面有详细的软件解决办法。

883zly 发表于 2008-8-25 14:42:37

谢谢楼上的.我做好了全部贴上来

frogrider 发表于 2008-9-2 22:22:44

关注,LZ解决了吗?我现在也在弄这个,很头痛,QQ232416606,希望能交流交流

baogmwiqpl 发表于 2008-9-3 08:13:53

l

rowdy 发表于 2008-9-3 11:08:40

吐鲁番、海南岛、少林寺....再超生....

tom919 发表于 2010-9-29 00:11:23

不知LZ这个问题是否解决了,如果解决了,能否如你所说,贴出来给大家分享一下。先谢了。

rainyss 发表于 2010-9-29 00:52:47

这是小问题,你不了解无线通信的特性罢了.

1.发射要加引导头(01010101.....),而且要很长.
2.不允许长时间的0和1

l4969 发表于 2011-10-22 11:09:49

mark,正好用得到,谢谢

xqn2012 发表于 2012-4-19 10:34:33

这几天我也在搞这个,搞得头都大了

sweet_136 发表于 2013-3-15 08:50:14

883zly 发表于 2008-8-22 12:09 static/image/common/back.gif
经过几天的测试,问题任然没有解决,我把我的编解码程序贴上来。看那位高人指导下。
编码用的51,12MHZ 解 ...

那个315的搞定了没? 共享下哦..

lswlc0502@qq.com

谢谢了

yu2008 发表于 2013-3-15 08:55:43

超再生的平时有方波出现,超外差的就会好很多,有用的信号就夹杂在其中,软件就是要从一堆比较乱的信号中找出你自己的信号。

wazhiyi 发表于 2013-8-1 18:58:45

楼主搞定了吗?分享一下看看

wazhiyi 发表于 2013-8-6 21:16:32

whimsy 发表于 2008-8-24 15:45 static/image/common/back.gif
前几天也在搞这个,接收灵敏度是-103dbm的模块,在无信号的时候,确实会有很多方波。
(那种低功耗的模块, ...

有具体一点资料吗

JZcrystalwlh888 发表于 2014-10-19 19:51:06

不知楼主把问题解决了没有
页: [1]
查看完整版本: 315M再超生软件编解问题