315M再超生软件编解问题
我在用315M再超生接收模块时用视波器看到数据输出脚不停的输出方波(不是干扰信号),测试出是摸块输出的方波(不是接收到的用有信号)。然后在数据输出脚接了个39k电阻上拉,软件解码仁然跳出(只捕获到启示信号,然后就是大于启示信号的高电平跳出),解不出码来。请问各位高人,输出脚怎么处理掉方波,有经验的朋友希望告诉我方波频率。小弟 实验事实证明软件编码正确。 “超再生”./emotion/em077.gif 应该是供电电源的干扰导致的吧,我原来用开关电源供电时碰到过这种情况,改用模拟电源就好了 超再生本来就是这样的.去看看无线通信的书.先看我的帖子也行,看完再看书.
http://www.cdle.net/bbs/dispbbs.asp?boardid=11&Id=4052
简单的说下关键:无线通信与有线通信是完全不同的,无线通信在无信号时,接收方要假定为收到任意电平/信号.
解决办法:构造数据包,前面加前导码和起始码.前导码数目一般用100~400 超再生 再超生? ^_^ 先有超再生接收技术,后来才发展到现在在量使用的超外差式,不过超再式灵敏度最高,在遥控及其它领域还是有大量使用的。 应该是超再生接收方式产生的"超噪声",相当于调频收音机收不到台时的那种声音.用2262,2272做编解码就行了. . 经过几天的测试,问题任然没有解决,我把我的编解码程序贴上来。看那位高人指导下。
编码用的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");
}
} 前几天也在搞这个,接收灵敏度是-103dbm的模块,在无信号的时候,确实会有很多方波。
(那种低功耗的模块,灵敏度低的,在无信号时,不会有方波)
我解决的方法是,发射端在发送编码的时候,
加上一个规定宽度的同步头,我自己定为3ms,
数据编码采用曼切斯特,数据校验用DOW(DS1990A) 还有就是,这种模块本身就传输的速率有要求的,要小于10Kps,
所以发射端传输的位周期要控制好,我的是位周期512uS 楼上的可以参考《无线电》杂志2008 第一期里的 《用单片机做的8通道无线遥控器》里面有详细的软件解决办法。 谢谢楼上的.我做好了全部贴上来 关注,LZ解决了吗?我现在也在弄这个,很头痛,QQ232416606,希望能交流交流 l 吐鲁番、海南岛、少林寺....再超生.... 不知LZ这个问题是否解决了,如果解决了,能否如你所说,贴出来给大家分享一下。先谢了。 这是小问题,你不了解无线通信的特性罢了.
1.发射要加引导头(01010101.....),而且要很长.
2.不允许长时间的0和1 mark,正好用得到,谢谢 这几天我也在搞这个,搞得头都大了
883zly 发表于 2008-8-22 12:09 static/image/common/back.gif
经过几天的测试,问题任然没有解决,我把我的编解码程序贴上来。看那位高人指导下。
编码用的51,12MHZ 解 ...
那个315的搞定了没? 共享下哦..
lswlc0502@qq.com
谢谢了 超再生的平时有方波出现,超外差的就会好很多,有用的信号就夹杂在其中,软件就是要从一堆比较乱的信号中找出你自己的信号。 楼主搞定了吗?分享一下看看 whimsy 发表于 2008-8-24 15:45 static/image/common/back.gif
前几天也在搞这个,接收灵敏度是-103dbm的模块,在无信号的时候,确实会有很多方波。
(那种低功耗的模块, ...
有具体一点资料吗 不知楼主把问题解决了没有
页:
[1]