首页资源分类应用技术射频与通信技术 > em4095中文资料

em4095中文资料

已有 445110个资源

下载专区

上传者其他资源

    文档信息举报收藏

    标    签:em4095

    分    享:

    文档简介

    em4095中文资料

    文档预览

    EM4095中文资料 所有资料来自网络,网络真是个神奇的东西,感谢那些无私的同行啊。 目录: 1. 框图 2. 原理图 3. 输出波形 4. 解码程序 EM4095的框图: 原理分析; EM4095的引脚SHD和MOD用来操作设备。当SHD为高电平的时候,EM4095为睡眠模式,电流消耗最小。在上电的时候,SHD输入必须是高电平,用来使能正确的初始化操作。当SHD为低电平的时候,回路允许发射射频场,并且开始对天线上的振幅调制信号进行解调。 引脚MOD是用来对125KHz射频信号进行调制的。事实上,当你1)在该引脚上施加高电平时,你将把天线驱动阻塞,并关掉电磁场;2)在该引脚上施加低电平,将使片上VCO进入自由运行模式,天线上将出现没有经过调制的125KHz的载波。EM4095用作只读模式,引脚MOD没有使用,推荐将它连接至VSS。 锁相环由环滤波、电压控制振荡器和相比较模块组成。通过使用外部电容分压,DEMOD_IN引脚上得到天线上的真实的高电压。这个信号的相和驱动天线驱动器的信号的相进行比较。所以锁相环可以将载波频率锁定在天线的谐振频率上。根据天线种类的不同,系统的谐振频率可以在100kHz到150kHz之间的范围内。当谐振频率在这一范围内的时候,它就会被锁相环锁定。 接收模块解调的输入信号是天线上的电压信号。DEMOD_IN引脚也同来做接收链路的输入信号。DEMOD_IN输入信号的级别应该低于VDD-0.5V,高于VSS+0.5V。通过外部电容分压可以调节输入信号的级别。分压器增加的电容必须通过相对较小的谐振电容来补偿。振幅调制解调策略是基于“振幅调制同步解调”技术的。接收链路由采样和保持、直流偏置取消、带通滤波和比较器组成。DEMOD_IN上的直流电压信号通过内部电阻设置在AGND引脚上。AM信号被采样,采样通过VCO时钟进行同步,所有的信号直流成分被CDEC电容移除。进一步的滤波把剩下的载波信号、二阶高通滤波器和CDC2带来的高频和低频噪声进一步移除。经过放大和滤波的接收信号传输到异步比较器,比较器的输出被缓存至DEMOD_OUT。 RDY/CLK这个信号为外部微处理器提供ANT1上信号的同步时钟以及EM4095内部状态的信息。ANT1上的同步时钟表示PLL被锁定并且接收链路操作点被设置。当SHD为高电平时,RDY/CLK引脚被强制为低电平。当SHD上的电平由高转低时,PLL为锁定状态,接收链路工作。经过时间Tset后,PLL被锁定,接收链路操作点已经建立。这时候,传送到ANT1上的信号同时也传送至RDY/CLK,提示微处理器可以开始观察DEMOD_OUT上的信号和于此同时的时钟信号。当MOD为高电平时,ANT驱动器关闭,但此时RDY/CLK引脚上的时钟信号仍然在继续。当SHD引脚上的电平从高到低之后,经过时间Tset后,RDY/CLK引脚上的信号被100kΩ的下拉电阻拉低。这样做的原因是为了标签的AM调制低于100%情况下RDY/CLK的扩展功能。在这种情况下它被用来做为辅助驱动器。该辅助驱动器在调制时使线圈上保持较低的振幅。 DVDD和DVSS脚应该分别和VDD以及VSS连接。应该注意到,通过管脚DVDD和DVSS流过的驱动器电流造成的电压降不会引起VDD和VSS上的电压降。在DVSS和DVDD脚之间应该加一个100nF的电容,并使其尽量靠近芯片。这将防止由于天线驱动器引起的电源尖峰。对管脚VSS和VDD进行隔离也是有用的。隔离电容不包含在EM4095的计算表中。所有和管脚DC2/AGND/DMOD_IN相关的电容都应该连接到相同的VSS线上。这条线应该直接和芯片上的管脚VSS相连。该线不能在连接其它元件或者成为为DVSS供电的线路的一部分。因为ANT驱动器使用VDD和VSS提供的电源的级别来为天线驱动,所有电源的所有变化和噪声都将毫无保留的直接影响天线谐振回路。任何将引起天线高压以mV级波动的电源波动都将导致系统性能下降甚至发生故障。特别要注意20kHz的滤波器低频噪声,因为响应器的信号就在这个频率水平上。 AGND管脚上的电容值可以从220nF上升到1uF。电容越大将越明显的减小接收噪声。AGND的电压可以通过外部电容和内部的2kΩ的电阻进行滤波。 EM4095不限制ANT驱动器发出的电流值。这两个输出上的最大绝对值是300mA。对天线谐振回路的设计应该使最大的尖峰电流不超过250mA。如果天线的品质因数很高,这个值就可能超过,则必须通过串联电阻加以限制。 增加Cdc2电容值,将增加接收带宽,进而增加斜坡信号的接收增益。Cdc2的推荐范围是6.8nF到22nF。Cdec为33nF到220nF。电容值越高,开始上升时间越长。 FCAP引脚上的偏置电压。这个偏置电压补偿了外部天线驱动器引起的相位偏移。这样的相位偏移会导致锁相环在不是天线回路串联谐振频率的频率上工作。为了读头回路的正常操作,这个偏置电压需要根据天线的品质因数和输出部分的滞后来进行调节。在使用高品质因数天线回路并且增强器是必须而且重要的应用产品中,会出现这样的对相位偏移的补偿。所以,这些回路比其它电路对在错误的频率上工作更加敏感。尽管使用了外部解调器,天线信号仍然要进入EM4095。因为它要做为锁相环的参考信号。要使用一个电容分压来减小来自天线的高电压。电阻分压会加重由于输入电容带来的相移效应。 在EM4095 BOOSTER CIRCUIT中,一个高压NMOS三极管隔离了调制时候的放电路径。所以操作点收到了保护。控制NMOS门的信号必须与MOD信号同步设为低电平,只有在天线上的振幅在调制之后恢复后该信号才可以置高电平。对于高品质因数的天线,天线上的电压较高,读取灵敏性被电容分压器的解调灵敏性限制。通过使用外部检测回路可以提高读取灵敏性。输入取自天线的高压端,直接送入CDEC_IN引脚。可是,PLL锁定仍需要电容分压器。 EM4095只读模式的原理图: 输出的波形:(U2270B跟EM4095输出的波形是差不多的) 下面这个是EM4095读取EM4100卡得到的数据头 解码程序见某位大大的博客,小弟感激涕零: http://jekup.blog.163.com/blog/static/523960320084185938816/ 程序冗长见附录。 工作电压:5V ·ARM微控制器:LM3S101 ·基站的模拟量前端IC:EM4095 ·只读应答器IC:EM4100 电路采用EM4095 BOOSTER CIRCUIT,增加线圈的Q值,使电流工作在1A以上,可使感应距离达到20CM以上。同等的线圈面积,感应距离可达到没有驱动放大的2倍左右。目前仍有个问题有待解决,当电流过大时,时间久了,线圈发烫,感应变的不稳定。 主体的程序如下: /*函数引用*/ void GPIOSetIn(unsigned long ulPortBase, unsigned long ulPortBit); // GPIO口设置为输入 void GPIOSetOut(unsigned long ulPortBase, unsigned long ulPortBit); // GPIO口设置为输出 void GPIOTrigUp(unsigned long ulPortBase, unsigned long ulPortBit); // GPIO口设置为上升沿触发 void GPIOTrigDown(unsigned long ulPortBase, unsigned long ulPortBit); // GPIO口设置为下降沿触发 unsigned long GPIOReadRis(unsigned long ulPortBase, unsigned long ulPortBit); // 读GPIO口的原始中断状态 void GPIOClrIcr(unsigned long ulPortBase, unsigned long ulPortBit); // 清除GPIO口的中断状态 void GPIOImEnable(unsigned long ulPortBase, unsigned long ulPortBit); // 使能GPIO口的中断 void GPIOImDisable(unsigned long ulPortBase, unsigned long ulPortBit); // 禁止GPIO口的中断 void OutOnBUZZER(void); // BUZZER输出为低电平,启动蜂鸣器 void OutOffBUZZER(void); // BUZZER输出为高电平,关闭蜂鸣器 void OutOnLED1(void); // LED1输出为低电平,点亮LED1 void OutOffLED1(void); // LED1输出为高电平,熄灭LED1 void OutOnUSHD(void); // USHD输出为低电平,启动EM4095时钟 void OutOffUSHD(void); // USHD输出为高电平,关闭4095时钟 void OutOnUMOD(void); // UMOD输出为低电平,启动天线驱动 void OutOffUMOD(void); // UMOD输出为高电平,关闭天线驱动 void OutOnUHOLD(void); // UHOLD输出为高电平,启动三极管放电 void OutOffUHOLD(void); // UHOLD输出为低电平,关闭三极管放电 void delay(unsigned long d); // 延时数量为d个指令周期 /*宏定义*/ #define HWREG(x) (*((volatile unsigned long *)(x))) // 以字的方式访问寄存器或内存地址 #define GPIO_PIN_0 0x00000001 // GPIO PIN0脚位 #define GPIO_PIN_1 0x00000002 // GPIO PIN1脚位 #define GPIO_PIN_2 0x00000004 // GPIO PIN2脚位 #define GPIO_PIN_3 0x00000008 // GPIO PIN3脚位 #define GPIO_PIN_4 0x00000010 // GPIO PIN4脚位 #define GPIO_PIN_5 0x00000020 // GPIO PIN5脚位 #define GPIO_PIN_6 0x00000040 // GPIO PIN6脚位 #define GPIO_PIN_7 0x00000080 // GPIO PIN7脚位 #define KEY1 GPIO_PIN_1 // 定义PB1为KEY1 #define BUZZER GPIO_PIN_2 // 定义PB2为Buzzer #define LED1 GPIO_PIN_4 // 定义PB4为LED1 #define UOUT GPIO_PIN_0 // 定义PA0为uOut #define UCLK GPIO_PIN_1 // 定义PA1为uClk #define USHD GPIO_PIN_2 // 定义PA2为uShd #define UMOD GPIO_PIN_3 // 定义PA3为uMod #define UHOLD GPIO_PIN_4 // 定义PA4为uHold #define RFRATE 0x40 // 射频振荡周期的64分频T #define RFT10 (RFRATE/2 - 15) // 0.5T的负偏差值 #define RFT11 (RFRATE/2 + 15) // 0.5T的正偏差值 #define RFT20 (RFRATE - 15) // T的负偏差值 #define RFT21 (RFRATE + 15) // T的正偏差值 #define RFT30 (RFRATE*3/2 - 15) // 1.5T的负偏差值 #define RFT31 (RFRATE*3/2 + 15) // 1.5T的正偏差值 #define RFT40 (RFRATE*2 - 15) // 2T的负偏差值 #define RFT41 (RFRATE*2 + 15) // 2T的正偏差值 /*全局变量定义*/ unsigned long ulUCLKCount; // UCLK计数变量 unsigned long ulUCLKCountTemp; // UCLK临时存放计数变量 unsigned long ulDataCount = 0; // ID卡的接收数据计数变量 unsigned long ulDataNum[55]; // EM4100 ID卡的55位(去除九位初始位)接收数据 unsigned long ulDataFlag = 0; // EM4100 ID卡的55位(去除九位初始位)数据接收完成标志 unsigned long ulCorrFlag = 0; // 判断ID卡初始九个1的计数 unsigned long ulErrFlag = 0; // 判断ID卡初始九个1的接收错误标志 /************************************************************************ * 名称:main() * 功能:主程序 * 入口参数:无 * 出口参数:无 * 修改时间:08.4.16 * 修改人:jekup ************************************************************************/ int main(void) { unsigned long i; PLLSet(); // 执行配置PLL GPIORunClockEnable(SYSCTL_RCGC2_BIT_PORTA); // 使能GPIO PA口 GPIORunClockEnable(SYSCTL_RCGC2_BIT_PORTB); // 使能GPIO PB口 NVICEnable(NVIC_EN0_BIT_PORTA); // 使能GPIO PA口中断(中断号为0) GPIOSetIn(GPIO_PORTA_BASE,UOUT); // 设置UOUT为输入 GPIOSetIn(GPIO_PORTA_BASE,UCLK); // 设置UCLK为输入 GPIOSetOut(GPIO_PORTA_BASE,USHD); // 设置USHD为输出 GPIOSetOut(GPIO_PORTA_BASE,UMOD); // 设置UMOD为输出 GPIOSetOut(GPIO_PORTA_BASE,UHOLD); // 设置UHOLD为输出 GPIOSetOut(GPIO_PORTB_BASE,BUZZER); // 设置BUZZER为输出 GPIOSetOut(GPIO_PORTB_BASE,LED1); // 设置LED1为输出 GPIOSetIn(GPIO_PORTB_BASE,KEY1); // 设置KEY1为输入 OutOnUSHD(); // 启动EM4095 OutOnUMOD(); // 启动天线驱动 OutOnUHOLD(); // 启动三极管放电 GPIOTrigUp(GPIO_PORTA_BASE,UCLK); // 设置UCLK为上升沿触发 while(1) { GPIOTrigDown(GPIO_PORTA_BASE,UOUT); // 设置UOUT为下降沿触发 if (GPIOReadRis(GPIO_PORTA_BASE,UOUT)) // 判断UOUT是否有下降沿 { GPIOClrIcr(GPIO_PORTA_BASE,UOUT); // 清除UOUT中断 ulUCLKCount = 0; // UCLK开始计数 GPIOIeEnable(GPIO_PORTA_BASE,UCLK); // 使能UCLK中断 GPIOTrigUp(GPIO_PORTA_BASE,UOUT); // 设置UOUT为上升沿触发 /*初始九个1判断*/ for (i=0; i<9; i++) { while(1) { if (GPIOReadRis(GPIO_PORTA_BASE,UOUT)) // 判断UOUT是否有上升沿 { GPIOClrIcr(GPIO_PORTA_BASE,UOUT); // 清除UOUT中断 ulUCLKCountTemp = ulUCLKCount; // UCLK存放在临时数组里 ulUCLKCount = 0; // UCLK重新计数 if ((ulUCLKCountTemp > RFT20) && (ulUCLKCountTemp < RFT21)) // 判断UCLK计数是否在T的偏差范围之内 { ulCorrFlag++; // ID卡初始九个1的计数加1 } else { ulErrFlag = 1; // 置位ID卡初始九个1的接收错误标志 } break; } // end of if (GPIOReadRis(GPIO_PORTA_BASE,UOUT)) } // end of while(1) if (ulErrFlag) // 判断ID卡初始九个1的接收是否有错误 { ulErrFlag = 0; // 清零ID卡初始九个1的接收错误标志 ulCorrFlag = 0; // 清零ID卡初始九个1的计数 GPIOIeDisable(GPIO_PORTA_BASE,UCLK); // 屏蔽UCLK中断 break; } } // end of for (i=0; i<9; i++) if (ulCorrFlag == 9) // 判断ID卡是否接收到初始九个1 { ulCorrFlag = 0; // 清零ID卡初始九个1的计数 while (1) { if (GPIOReadRis(GPIO_PORTA_BASE,UOUT)) // 判断UOUT是否有上升沿 { GPIOClrIcr(GPIO_PORTA_BASE,UOUT); // 清除UOUT中断 ulUCLKCountTemp = ulUCLKCount; // UCLK存放在临时数组里 ulUCLKCount = 0; // UCLK重新计数 /*判断UCLK计数是否在T的偏差范围之内*/ if ((ulUCLKCountTemp > RFT20) && (ulUCLKCountTemp < RFT21)) { ulDataNum[ulDataCount++] = 1; // 接收数据为1 if (ulDataCount == 55) // 判断是否已接收到64位数据 { GPIOIeDisable(GPIO_PORTA_BASE,UCLK); // 屏蔽UCLK中断 ulDataCount = 0; // 数据计数从第10位开始 ulDataFlag = 1; // 置位数据接收完成标志 break; } // end of if (ulDataCount == 64) } // end of if ((ulUCLKCountTemp > RFT20) && (ulUCLKCountTemp < RFT21)) /*判断UCLK计数是否在2T的偏差范围之内*/ else if ((ulUCLKCountTemp > RFT40) && (ulUCLKCountTemp < RFT41)) { ulDataNum[ulDataCount++] = 0; // 接收数据为0 if (ulDataCount == 55) // 判断是否已接收到64位数据 { GPIOIeDisable(GPIO_PORTA_BASE,UCLK); // 屏蔽UCLK中断 ulDataCount = 0; // 数据计数从第10位开始 ulDataFlag = 1; // 置位数据接收完成标志 break; } // end of if (ulDataCount == 64) ulDataNum[ulDataCount++] = 1; // 接收数据为1 if (ulDataCount == 55) // 判断是否已接收到64位数据 { GPIOIeDisable(GPIO_PORTA_BASE,UCLK); // 屏蔽UCLK中断 ulDataCount = 0; // 数据计数从第10位开始 ulDataFlag = 1; // 置位数据接收完成标志 break; } // end of if (ulDataCount == 64) } // end of if ((ulUCLKCountTemp > RFT20) && (ulUCLKCountTemp < RFT21)) /*判断UCLK计数是否在1.5T的偏差范围之内*/ else if ((ulUCLKCountTemp > RFT30) && (ulUCLKCountTemp < RFT31)) { ulDataNum[ulDataCount++] = 0; // 接收数据为0 if (ulDataCount == 55) // 判断是否已接收到64位数据 { GPIOIeDisable(GPIO_PORTA_BASE,UCLK); // 屏蔽UCLK中断 ulDataCount = 0; // 数据计数从第10位开始 // 置位数据接收完成标志 break; } // end of if (ulDataCount == 64) while (1) { if (GPIOReadRis(GPIO_PORTA_BASE,UOUT)) // 判断UOUT是否有上升沿 { GPIOClrIcr(GPIO_PORTA_BASE,UOUT); // 清除UOUT中断 ulUCLKCountTemp = ulUCLKCount; // UCLK存放在临时数组里 ulUCLKCount = 0; // UCLK重新计数 /*判断UCLK计数是否在1.5T的偏差范围之内*/ if ((ulUCLKCountTemp > RFT30) && (ulUCLKCountTemp < RFT31)) { ulDataNum[ulDataCount++] = 0; // 接收数据为0 if (ulDataCount == 55) // 判断是否已接收到64位数据 { ulDataCount = 0; // 数据计数从第10位开始 ulDataFlag = 1; // 置位数据接收完成标志 GPIOIeDisable(GPIO_PORTA_BASE,UCLK); // 屏蔽UCLK中断 break; } // end of if (ulDataCount == 64) ulDataNum[ulDataCount++] = 1; if (ulDataCount == 55) // 判断是否已接收到64位数据 { GPIOIeDisable(GPIO_PORTA_BASE,UCLK); // 屏蔽UCLK中断 ulDataCount = 0; // 数据计数从第10位开始 ulDataFlag = 1; // 置位数据接收完成标志 break; } // end of if (ulDataCount == 64) break; } // end of if ((ulUCLKCountTemp > RFT30) && (ulUCLKCountTemp < RFT31)) /*判断UCLK计数是否在T的偏差范围之内*/ if ((ulUCLKCountTemp > RFT20) && (ulUCLKCountTemp < RFT21)) { ulDataNum[ulDataCount++] = 0; // 接收数据为0 if (ulDataCount == 55) // 判断是否已接收到64位数据 { ulDataCount = 0; // 数据计数从第10位开始 ulDataFlag = 1; // 置位数据接收完成标志 GPIOIeDisable(GPIO_PORTA_BASE,UCLK); // 屏蔽UCLK中断 break; } // end of if (ulDataCount == 64) } } // end of if (GPIOReadRis(GPIO_PORTA_BASE,UOUT)) } // end of while (1) if (ulDataFlag) { break; } // end of if (ulDataFlag) } // end of if ((ulUCLKCountTemp > RFT20) && (ulUCLKCountTemp < RFT21)) else { ulDataCount = 0; // 数据计数从第10位开始 GPIOIeDisable(GPIO_PORTA_BASE,UCLK); // 屏蔽UCLK中断 break; } // end of else } // end of if (GPIOReadRis(GPIO_PORTA_BASE,UOUT)) } // end of while (1) if (ulDataFlag) // 判断64位数据是否已接收完成 { ulDataFlag = 0; OutOnLED1(); delay(1000000); OutOffLED1(); } // end of if (ulDataFlag) } // end of if (ulCorrFlag == 9) } // end of if (GPIOReadRis(GPIO_PORTA_BASE,UOUT)) } // end of while(1) } // end of int main(void) /************************************************************************ * 名称:GPIO_Port_A_ISR() * 功能:GPIOA口中断 * 入口参数:无 * 出口参数:无 * 修改时间:08.4.9 * 修改人:jekup ************************************************************************/ void GPIO_Port_A_ISR(void) { GPIOClrIcr(GPIO_PORTA_BASE,UCLK); // 清除UCLK中断 ulUCLKCount++; // UCLK计数 }

    Top_arrow
    回到顶部
    EEWORLD下载中心所有资源均来自网友分享,如有侵权,请发送举报邮件到客服邮箱bbs_service@eeworld.com.cn 或通过站内短信息或QQ:273568022联系管理员 高进,我们会尽快处理。