前导位:数据包包括4个以上的前导位,每个位都为“1”
struct WireTime VoitTime = {0x00,0x00,0x00,0x00}; struct WireCode VoitCode = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0000}; unsigned char xdata VoitCodeBuf[Len] = {0x00}; void Tim3_Irt(void) interrupt T3_VECTOR { VoitTime.BitStu = 0x00; if(WIREIO != VoitTime.PinOldStu) { if((VoitTime.Tclk >= TIM250MSDOWN)&&(VoitTime.Tclk <= TIM250MSUP)) {//'1'½ÓÊÕ£¬1ÓÉÁ¬ÐøÁ½´Î×é³É if(VoitTime.LastClkStu) { VoitTime.LastClkStu = 0x00; VoitTime.BitStu = 0x0C; //λ1 } else VoitTime.LastClkStu = 0x01; } else if((VoitTime.Tclk >= TIM500MSDOWN)&&(VoitTime.Tclk <= TIM500MSUP)) {//'0'½ÓÊÕ,Èç¹û'1'½ÓÊÕµ½Ò»°ë¾ÍÊÕµ½0£¬ÄÇô¾ÍÐèÒªÆÁ±Îµô´íÎó'1' if(VoitTime.LastClkStu)VoitTime.LastClkStu = 0x00; VoitTime.BitStu = 0x03; //λ0 } else { VoitTime.BitStu = 0x0E; } VoitTime.Tclk = 0x00; VoitTime.PinOldStu = WIREIO; } else { if(VoitTime.Tclk < 10)VoitTime.Tclk ++; } switch(VoitTime.BitStu) { case 0x00://ûÓÐÊÕµ½Êý¾Ý break; case 0x0E://½ÓÊÕ´íÎó memset(&VoitTime,0x00,sizeof(VoitTime)); memset(&VoitCode,0x00,sizeof(VoitCode)); break; case 0x0C://×Ö½Ú'1' if(VoitCode.CodeStep == 0x00) {//Òýµ¼Âë VoitCode.BitCnt ++; } else { VoitCode.BitCnt ++; //Êý¾ÝλÔö¼Ó'1' VoitCode.ByteData = (VoitCode.ByteData >> 1) | 0x8000; if(VoitCode.BitCnt == 11) {//Êý¾Ý½ÓÊÕÍê±Ï VoitCodeBuf[VoitCode.DataReceLen ++] = (unsigned char)((VoitCode.ByteData & 0x3FFF) >> 6); if(VoitCode.DataReceLen == 0x02) { if(VoitCodeBuf[1] <= 0x1F) VoitCode.DataSetLen = (VoitCodeBuf[1] >> 5) + 1; else if(VoitCodeBuf[1] <= 0x7F)VoitCode.DataSetLen = (VoitCodeBuf[1] >> 4); else if(VoitCodeBuf[1] <= 0xDF)VoitCode.DataSetLen = (VoitCodeBuf[1] >> 3) - 8; else VoitCode.DataSetLen = (VoitCodeBuf[1] >> 2) - 36; VoitCode.DataSetLen += 0x03; //Êý¾Ý볤¶È + Ò»¸öÒýµ¼Î»£¬Ò»¸öЧÑé룬һ¸öÊý¾Ý°üÍ· } else if((VoitCode.DataReceLen == VoitCode.DataSetLen)&&(VoitCode.DataSetLen != 0x00)) { Usart_SendArry(VoitCodeBuf,VoitCode.DataSetLen); memset(VoitCodeBuf,0x00,VoitCode.DataSetLen); memset(&VoitTime,0x00,sizeof(VoitTime)); memset(&VoitCode,0x00,sizeof(VoitCode)); } VoitCode.BitCnt = 0x00; } } break; case 0x03://×Ö½Ú'0' if((VoitCode.CodeStep == 0x00)&&(VoitCode.BitCnt >= 4)) {//Òýµ¼Âë VoitCodeBuf[VoitCode.DataReceLen ++] = VoitCode.BitCnt; VoitCode.BitCnt = 0x01; //Òýµ¼Âë¼ÆÊýÇå³ý£¬²¢½«Æðʼλ¼ÆÈë×Ö½ÚÊý¾Ý VoitCode.CodeStep = 0x01; //Òýµ¼Âë½áÊø } else { VoitCode.ByteData >>= 1; //¶ÁÈëÊý¾Ýλ VoitCode.BitCnt ++; //Êý¾ÝλÔö¼Ó'1' } break; } PINTF0 &=~ 0x02; }
官网地址:http://www.shengshiwireless.com
联系方式:
技术咨询及售前:张生 13536600262
售后:吕生 13246203996
公司地址:广东省佛山市乐从物联天下产业园B座429室
现在常用的都是电压+电流解码出数据,然后检测电压,检测电流,检测温度。(MCU被我去掉了,不要限制了大家的想象,这个图是我自己画的,建议大家去网上找找其他人的电路资料,因为毕竟是量产的,比我这个靠谱很多。而且这个图主要的目的是说明,也是参考网上的电路,希望不存在版权啥啥的问题)
电流检测和电流解码(低成本的话,就用一个358做着一些方面就好了。解码,电流检测都已经实现了,也可以进行异物检测了):
电流检测电路就是一个低通同向放大器,低通是为了滤除电路中高频的部分,主要就是那个100K以上的PWM,同时会保留低频的部分(2K的数据部分)电路中的H桥下面(Ic)有一个0.02的电阻这个用于将电流信号转换成电压,如果是1A的电流,则是0.02V,所以要通过运放来进行放大,这个可以根据自己的需求来重新设计。
如果是现在说的5W,15W,10W,电流不一样,可以设计一个电路完全包含的。计算方式就是同相放大器的计算方式。不会的小伙伴可以百度下,或者下面提问拉。
电流检测结束以后就是电流的解码(我上面图里面没有)这里由两个低通滤波器组成的比较器。这个电路我尝试用文字解释一下。听不懂就自己搞个仿真,用参数直接仿真一下就好。这两个滤波器的截至频率不一样,导致一个滤波效果好,交流波形会区域平缓,可以近视看作一条直线,另一个效果不好,会上下波动,也就是我手绘的那个效果
然后嘛,就是进行比较拉啦啦啦啦啦。会结果就是输出一个方波,然后单片机进行数据的解码。解码的内容见上一个文章。
电压检测和电压解码
电压检测是不需要运放的,只需要一个无源高通滤波器+一个无源低通滤波器中间再来一个二极管就可以进行电流检测(如果检测5V,12V,24V什么的比较高的电压,可以用电阻分个压),参数的设计保证2K和100K以上的频率的这两个的滤波。这里提一下LC线圈那边会产生一个和PWM同样频率的正弦波。
电压解码和电流解码一样,都是滤波器的组合。这里就不多说了!
好了,暂时就先这样,后面还有三部分的内容,一个是计算公式和程序。二个是解码,电流,电压这三个参数在系统中的作用。三是实现远距离无线充的理论基础。敬请期待。。。。。。。