EV1527解码,我也贡献一个,抗干扰,自适应.....
EV1527解码,我也贡献一个,抗干扰,自适应, 经测试比买的解码成功率高,具体多少没计算,通过示波器看到;/*
中断处理函数 、每次中断查询一下电平;
手册16个CLK(一个数据位)的时间是
最大4.24ms(4240us)/16= 265us; 最小230us/16=14us; 分频时间是4us;
;
同步头高电平至少4个时钟;识别同步头分2步
第一步高电平时间大于等于40us,小于265*4*1.2 = 1060*1.2=1270us;
第二步 低电平时间是高电平时间的31倍,留20%余量26倍-36倍之间;
计算电平时间 (高电平时间 + 低电平时间) / 32 ;
数据宽时间要在这个数值的 正负20% 之间
*/
INTERRUPT_HANDLER(EXTI_PORTA_IRQHandler, 3)
{
static U16 data_h_time;//
static U16 data_l_time;//
static U16bit_time_min;
static U16bit_time_max;
static U8decode_KEY;
static U32 decode_ID;
U16 temp;
static U8ev1527_rx_last;
U16 ev1527_new_time;
disableInterrupts();
ev1527_new_time= (uint16_t)TIM2->CNTRH << 8;
ev1527_new_time |= (uint16_t)(TIM2->CNTRL);
if(EV1527_RX)//接收编码高电平
{
if(ev1527_rx_last==0) //上次是低电平,有跳变
{
EV1527_COUNT_CLEAR;
if(ev1527_decode_state>sync_h)
{
str_ev1527_data.l_data = ev1527_new_time;
str_ev1527_data.l_data_write = (str_ev1527_data.l_data_write + 1) % EV1527_DATA_TIME_NUM;
switch(ev1527_decode_state)
{
casesync_l:{
temp = str_ev1527_data.l_data / str_ev1527_data.h_data;
if((temp >= SYNC_RATIO_MIN) && (temp <= SYNC_RATIO_MAX))
{
temp = str_ev1527_data.l_data + str_ev1527_data.h_data;
str_ev1527_data.h_data_read = (str_ev1527_data.h_data_read + 1) % EV1527_DATA_TIME_NUM;
str_ev1527_data.l_data_read = (str_ev1527_data.l_data_read + 1) % EV1527_DATA_TIME_NUM;
bit_time_min = temp / 9;
bit_time_max = temp / 7;
decode_ID = 0;
decode_KEY = 0;
data_h_time = 0;
data_l_time = 0;
ev1527_decode_state = chipid_0l;
}
else
{
ev1527_decode_state = sync_h;
}
}break;
casechipid_0l:
casechipid_1l:
casechipid_2l:
casechipid_3l:
casechipid_4l:
casechipid_5l:
casechipid_6l:
casechipid_7l:
casechipid_8l:
casechipid_9l:
casechipid_10l:
casechipid_11l:
casechipid_12l:
casechipid_13l:
casechipid_14l:
casechipid_15l:
casechipid_16l:
casechipid_17l:
casechipid_18l:
casechipid_19l:
{
data_h_time += str_ev1527_data.h_data;
data_l_time += str_ev1527_data.l_data;
str_ev1527_data.l_data_read = (str_ev1527_data.l_data_read + 1) % EV1527_DATA_TIME_NUM;
str_ev1527_data.h_data_read = (str_ev1527_data.h_data_read + 1) % EV1527_DATA_TIME_NUM;
temp = data_h_time + data_l_time;
if(temp >= bit_time_min)
{
if(temp <= bit_time_max)
{
if(data_h_time > data_l_time)
{
decode_ID |= 0x01;
}
decode_ID <<= 1;
ev1527_decode_state++;
data_h_time = 0;
data_l_time = 0;
}
else
{
ev1527_decode_state = sync_h;
}
}
}break;
casedata_0l:
casedata_1l:
casedata_2l:
casedata_3l:
{
data_h_time += str_ev1527_data.h_data;
data_l_time += str_ev1527_data.l_data;
str_ev1527_data.l_data_read = (str_ev1527_data.l_data_read + 1) % EV1527_DATA_TIME_NUM;
str_ev1527_data.h_data_read = (str_ev1527_data.h_data_read + 1) % EV1527_DATA_TIME_NUM;
temp = data_h_time + data_l_time;
if(temp >= bit_time_min)
{
if(temp <= bit_time_max)
{
if(data_h_time > data_l_time)
{
decode_KEY |= 0x08;
}
if(ev1527_decode_state == data_3l)
{
ev1527_chip_ID = decode_ID;
ev1527_chip_key= decode_KEY;
ev1527_new_sms = 1;
LED_ON(LED_01);
ev1527_decode_state = sync_h;
}
else
{
decode_KEY >>= 1;
ev1527_decode_state++;
}
data_h_time = 0;
data_l_time = 0;
}
else
{
ev1527_decode_state = sync_h;
}
}
}break;
}
}
}
ev1527_rx_last = 1;
}
else //接收编码低电平
{
if(ev1527_rx_last) //上次是高电平,有跳变
{
EV1527_COUNT_CLEAR;
if(ev1527_decode_state == sync_h)
{
if((ev1527_new_time >= SYNC_H_TIME_MIN) && (ev1527_new_time <= SYNC_H_TIME_MAX))
{
str_ev1527_data.l_data_read = str_ev1527_data.l_data_write=0;
str_ev1527_data.h_data_read = str_ev1527_data.h_data_write=0;
str_ev1527_data.h_data = ev1527_new_time;
str_ev1527_data.h_data_write = (str_ev1527_data.h_data_write + 1) % EV1527_DATA_TIME_NUM;
ev1527_decode_state= sync_l;
}
}
else
{
str_ev1527_data.h_data = ev1527_new_time;
str_ev1527_data.h_data_write = (str_ev1527_data.h_data_write + 1) % EV1527_DATA_TIME_NUM;
}
}
ev1527_rx_last = 0;
}
enableInterrupts();
} 网上公布的代码我下了几个测试了,这些代码基本都是通过延时读高电平宽度的;我测试 这些解码思路的解码成功率比我对比测试的买的解码芯片成功率低一些,后来还是自己写一个,就是这个 版本,经测试解码成功率比购买的解码芯片成功率高;购买的解码芯片我估计也是用通过延时读高电平宽度的方法解码的,因为我换了一个RC振荡电阻后,就不能解码了,做不到自适应频率; 楼主的写代码风格很好,支持! 时序要求严格么?中断是否不能被打断? 哈哈 看了一下,几乎和我写的一样。楼主好样的{:lol:}{:lol:}{:lol:} 网上流传的不也是定时器中断去查询io电平吗 - -!
我找着网上的改了改,效果还不错。 定时中断来查阅IO的也不错,很好用 huarana 发表于 2017-5-16 11:19
网上流传的不也是定时器中断去查询io电平吗 - -!
我找着网上的改了改,效果还不错。...
这个是通过测量中断时间来计算的,测出导码的时间,再去测量每位比特的时间,期间过滤掉时间不符合每位比特跳变的波,从理论来见只有跳变时正负10%的时间窗口的干扰可以进入影响结果;
网上的定时器查电平的方法,好像都是固定时间查询的,对自适应频率支持不好;
我改写了定时器查电平的的程序,通过测导码的时间,计算查询时间,结果不如意,没有买的芯片解码效果好,后来用这种方法测出的效果比买的芯片解码效果好;
chinaboy25 发表于 2017-5-16 15:16
这个是通过测量中断时间来计算的,测出导码的时间,再去测量每位比特的时间,期间过滤掉时间不符合每位比 ...
我不知道你是怎么测试得出解码效果的。
你的收发器是什么?
我是用的凌承芯的收发小模块 。 其实解码原理都一样,都是判断高低电平的时间。根据发送的编码特点,我采用了200us的中断作为基准。
我的讨论在这个帖子里https://www.amobbs.com/thread-4367286-1-1.html huarana 发表于 2017-5-16 15:40
我不知道你是怎么测试得出解码效果的。
你的收发器是什么?
你这个我写之前看了下,没有自适应频率,没有抗干扰,所以没用你的,自己重写; huarana 发表于 2017-5-16 15:40
我不知道你是怎么测试得出解码效果的。
你的收发器是什么?
测解码效果,把接收模块的选频的匹配电感取下,这样处理后,接收的信号会出现杂波,如果没有杂波,基本每次都解码都能成功,抗干扰效果 测不出来;然后看示波器一路接模块信号输出一路接解码输出,信号输出分2路一路到对比的解码模块,解码模块输出也接示波器;最后对比2路解码输出如果解码不成功输出的波形会有缺失,比较这两个缺的谁的少,说明解码成功率高; 杂波都会有的- -! 而且还不少。 有没有完整的????? retome 发表于 2017-7-21 07:30
有没有完整的?????
开解码IO口的,高变低,和低变高电平中断,ev1527_chip_ID ;ev1527_chip_key; ev1527_new_sms;这三个是解码后输出; chinaboy25 发表于 2017-7-21 08:31
开解码IO口的,高变低,和低变高电平中断,ev1527_chip_ID ;ev1527_chip_key; ev1527_new_sms;这三个是 ...
看你那段代码,看得不是很明白。有很多变量不知道在哪里定义的 retome 发表于 2017-7-23 12:38
看你那段代码,看得不是很明白。有很多变量不知道在哪里定义的
确实有几个变量,我把整个模块上传吧;
retome 发表于 2017-7-23 12:38
看你那段代码,看得不是很明白。有很多变量不知道在哪里定义的
整个工程还要些东西不便公开,就只上传模块了 chinaboy25 发表于 2017-7-23 12:47
整个工程还要些东西不便公开,就只上传模块了
太感谢啦!!!!楼主高品质!!!多多指教!中国缺乏你这样的高手,大胸怀!!! 不错,参考一下{:lol:} 请问一下,这2个值是怎么算出来的。
#define SYNC_H_TIME_MIN 56
#define SYNC_H_TIME_MAX 530 chinaboy25 发表于 2017-7-23 12:47
整个工程还要些东西不便公开,就只上传模块了
厉害!! bit_time_min = temp / 9; bit_time_max = temp / 7;如何算的???为什么要除以9,7?? JJKwong 发表于 2017-7-27 16:32
请问一下,这2个值是怎么算出来的。
#define SYNC_H_TIME_MIN 56
#define SYNC_H_TIME_MAX 530 ...
/*
中断处理函数 、每次中断查询一下电平;
手册16个CLK(一个数据位)的时间是
最大4.24ms(4240us)/16= 265us; 最小230us/16=14us; 分频时间是4us;
;
同步头高电平至少4个时钟;识别同步头分2步
第一步高电平时间大于等于40us,小于265*4*1.2 = 1060*1.2=1270us;
第二步 低电平时间是高电平时间的31倍,留20%余量26倍-36倍之间;
计算电平时间 (高电平时间 + 低电平时间) / 32 ;
数据宽时间要在这个数值的 正负20% 之间
*/
#define SYNC_H_TIME_MIN 56
#define SYNC_H_TIME_MAX 530
这个数要与计数器时间匹配后与上面的时间的倍数关系 EV527商城有售 感谢分享EV1527解码 本帖最后由 chinaboy25 于 2017-7-28 20:14 编辑
retome 发表于 2017-7-27 21:29
厉害!! bit_time_min = temp / 9; bit_time_max = temp / 7;如何算的???为什么要除以9,7?? ...
凭记忆好像是高低电平是8倍时间的关系,取7-9倍之间,,或者是同步头是高低电平时间的8倍 chinaboy25 发表于 2017-7-28 20:03
凭记忆好像是高低电平是8倍时间的关系,取7-9倍之间,,或者是同步头是高低电平时间的8倍 ...
非常感谢分享!! 时间比例法确实可以。 chinaboy25 发表于 2017-7-28 08:59
/*
中断处理函数 、每次中断查询一下电平;
手册16个CLK(一个数据位)的时间是
怎么区分长按遥控键和短按遥控器。 解码思路很好,支持{:smile:} 需要,下载,谢了 我把这个移植到51上面,没有成功,,你的定时器分频时间是4us,,51没法分频那就是1us(12M晶振),所以后面ev1527_new_time>>2,,但还是不成功.
另外:你的是不是遥控器最少要发4位才能解码成功?如果短按一下,是不是不行? 15813191501 发表于 2017-10-5 00:06
我把这个移植到51上面,没有成功,,你的定时器分频时间是4us,,51没法分频那就是1us(12M晶振),所以后面ev152 ...
短按和长按是软件应用层处理,在硬件上层没不同, 试了下 也没成功 没有按键按下的时候也频繁进中断
本帖最后由 LBQ691477940 于 2017-10-31 13:05 编辑
chinaboy25 发表于 2017-7-28 08:59
/*
中断处理函数 、每次中断查询一下电平;
手册16个CLK(一个数据位)的时间是
第一步高电平时间大于等于40us???#define SYNC_H_TIME_MIN56 应该是#define SYNC_H_TIME_MIN 10 才是吧 ?T2计数是 1/16M 4uS
好像楼主的程序也没有进行二次校验
好几十行的语句没几个注释这种风格不好.过几天自己回看都不知咋回事了{:lol:} 本帖最后由 chinaboy25 于 2017-11-1 08:44 编辑
LBQ691477940 发表于 2017-10-31 13:02
第一步高电平时间大于等于40us???#define SYNC_H_TIME_MIN56 应该是#define SYNC_H_TIME_MIN 10 才是 ...
注释的时候是4us,后面改了分频 2us ,让时间精度高一点,对性能无影响,那个 SYNC_H_TIME_MAX530 就是 1060us/2us 得来的;
二次校验是指什么,是指延时电压读取吗?防抖动吗?
已经通过时间累加,然后判断电平时间来校验数据合法, 15813191501 发表于 2017-10-5 00:06
我把这个移植到51上面,没有成功,,你的定时器分频时间是4us,,51没法分频那就是1us(12M晶振),所以后面ev152 ...
这得看你用哪款 51了要有上下沿都能外部中断才行吧{:lol:} 本帖最后由 LBQ691477940 于 2017-11-5 00:48 编辑
chinaboy25 发表于 2017-11-1 08:39
注释的时候是4us,后面改了分频 2us ,让时间精度高一点,对性能无影响,那个 SYNC_H_TIME_MAX530 就是 ...
你给的函数也是TIM2_TimeBaseInit(TIM2_PRESCALER_64, 0xFFFF);64分频的{:tongue:}
没看清你这接收多少帧数据才算成功呢?很多都是接收完二帧数据并二次的数据对比是否一样如果一样才当解码成功 LBQ691477940 发表于 2017-11-5 00:27
你给的函数也是TIM2_TimeBaseInit(TIM2_PRESCALER_64, 0xFFFF);64分频的
没看清你这接收多少 ...
64分频要看主频来的;
这个在应用里面实现,实现长按端按,甚至双击, chinaboy25 发表于 2017-11-6 08:55
64分频要看主频来的;
这个在应用里面实现,实现长按端按,甚至双击,
哦
长按及双击有无例程分享下谢谢 chinaboy25 发表于 2017-11-1 08:39
注释的时候是4us,后面改了分频 2us ,让时间精度高一点,对性能无影响,那个 SYNC_H_TIME_MAX530 就是 ...
注释的时候是4us,后面改了分频 2us ,让时间精度高一点,对性能无影响,那个 SYNC_H_TIME_MAX530 就是 1060us/2us 得来的;
按照这样的计算, SYNC_H_TIME_MIN 最小230us/16=14us; 分频时间是2us; 应该是14*4/2=28,
而代码中是#define SYNC_H_TIME_MIN56 搞不明白, hanweng2012 发表于 2017-11-12 09:26
注释的时候是4us,后面改了分频 2us ,让时间精度高一点,对性能无影响,那个 SYNC_H_TIME_MAX530 就是 ...
最小的没改,230/4 = 57.5 楼主这个是学习型的么 chinaboy25 发表于 2017-11-12 13:44
最小的没改,230/4 = 57.5
有点不明白了。Timer2的定时间隔是在2US和4US不停切换?
而不是初始化就设定好的? hanweng2012 发表于 2018-5-26 08:15
有点不明白了。Timer2的定时间隔是在2US和4US不停切换?
而不是初始化就设定好的? ...
这个取值只是判断的范围,假设同步头是100us,我判断同步头的其中一个条件可以是80-120,也可是80-110,也可以90-120,随意的,主要是没去研究取多少合适,看效果来吧, 无线传输难免有信噪比差的时候。通过单片机的智能判决确实可以使硬件解码器不能识别的信号获得解码,延长了通讯距离。这个我几年前做过,大量用过。 chinaboy25 发表于 2018-5-26 11:35
这个取值只是判断的范围,假设同步头是100us,我判断同步头的其中一个条件可以是80-120,也可是80-110, ...
多谢楼主的耐心解答,看的大体明白了。
还有一个
EV1527_DATA_TIME_NUM,为什么这个参数越大,效果越好?或者说这个参数的选择依据是??? 谢谢分享 hanweng2012 发表于 2018-5-27 08:56
多谢楼主的耐心解答,看的大体明白了。
还有一个
EV1527_DATA_TIME_NUM,为什么这个参数越大,效果越好? ...
过滤干扰的个数,太大了浪费内存和CPU 谢谢分享,学习了。 EV1527 mark一下,谢谢楼主 最近EV1527软解出现个别匹配不上的问题,感谢楼主提供的新思路 楼主,这个代码是基于哪个无线接收芯片的呀SYN? 我移植到了STM32上,不知道为什么,解不出来。我用的H3V4F接收模块,这家伙没信号的时候那干扰,简直了,示波器上没法看。 ahe 发表于 2019-1-12 20:03
我移植到了STM32上,不知道为什么,解不出来。我用的H3V4F接收模块,这家伙没信号的时候那干扰,简直了,示 ...
这个很占中断的,解码后,单片机的资源只适合做简单逻辑控制;适合替代解码芯片+单片机简单逻辑控制的方案;在没收到信号是无线模块一般是输出很多杂波,几乎几十us就进一次中断
chinaboy25 发表于 2019-1-13 13:42
这个很占中断的,解码后,单片机的资源只适合做简单逻辑控制;适合替代解码芯片+单片机简单逻辑控制的方 ...
是这样。是否所有的接收模块都是这个特点? EV1527解码 Mark
EV1527解码 MarK 学习了,谢谢分享 个人觉得最好不要用网上别人经常用的方式——定时中断后,去读IO的电平,来判断是1还是0。这个情况下,杂波是有可能也会触发解码成功(即便数据头把关比较严格)。我曾经用这种解码方式测试:只要解码成功,且接收的码等于我设定的值,就让一个LED亮起来,最后这个模块连续上电1天多,就撞到设定的值了。总的来说这种解码方式确实成功率很高,但由于灵敏度太高,有可能会误判。 EV1527同步脉冲是4个CLK的低电平和124CLK的高电平,里面写着一个CLK=8个SOC CLOCK。那一个SOC CLOCK究竟是多少呢?搞不明白?我的无线频率是433Mhz。 纪泽江 发表于 2019-6-12 16:57
EV1527同步脉冲是4个CLK的低电平和124CLK的高电平,里面写着一个CLK=8个SOC CLOCK。那一个SOC CLOCK究竟是 ...
高低电平时间各算一个时间窗 感谢楼主还在更新。看了很多遍,最后有一个地方看不懂:
-----------------------
casechipid_18l:
casechipid_19l: //21
{
data_h_time += str_ev1527_data.h_data;
data_l_time += str_ev1527_data.l_data;
str_ev1527_data.l_data_read = ( str_ev1527_data.l_data_read + 1 ) % EV1527_DATA_TIME_NUM;
str_ev1527_data.h_data_read = ( str_ev1527_data.h_data_read + 1 ) % EV1527_DATA_TIME_NUM;
temp = data_h_time + data_l_time;
if ( temp >= bit_time_min )
{
if ( temp <= bit_time_max )
{
if ( data_h_time > data_l_time )
{
decode_ID |= 0x01; //识别为1,否则维持原来的0
}
decode_ID <<= 1;
ev1527_decode_state++;
data_h_time = 0;
data_l_time = 0;
}
else
{
ev1527_decode_state = sync_h;
}
}
break;
}
--------------------
data_h_time += 这句不懂
#define EV1527_DATA_TIME_NUM4 //时间个数,个数越多抗干扰次数越多 ,原理不懂
能否帮忙解释一下? data_h_time += 这句大概明白了。
当一个正常位周期插入了一个干扰,导致 bit_time < bit_time_min时,可忽略这个周期,相当于滤波。
#define EV1527_DATA_TIME_NUM4 //时间个数,个数越多抗干扰次数越多 ,原理还是不懂。
不理解 EV1527_DATA_TIME_NUM 在哪个阶段起作用 mark一下 看看思路 感谢楼主{:biggrin:} 感谢楼主,下载下来研究研究,有可能会用到 楼主,你好,接收部分的原理图可以传上来参考下吗? 很详细,学习了 楼主项目工程是不是做的自学习拷贝遥控器? 感谢楼主,移植到STM32成功,。 huangweida 发表于 2021-11-11 18:16
感谢楼主,移植到STM32成功,。
(引用自70楼)
能发出来 学习一下吗{:lol:}
页:
[1]