原创 基于CAN总线的低成本远程通信的智能节点设计

2009-4-29 22:36 4205 2 2 分类: 通信
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

在传统的工业控制领域中,大部分的通信采用RS232RS485来实现,但RS232总线采用负逻辑电平方式,有着通信距离近,抗干扰性能差等缺点;而RS485总线虽然采用差分方式传输,但其通讯速度慢,组网一般采用主从方式,在实时的多主网络里面很受限制。而CAN的结构简单,在传输时,只有两根线与外部连接,且内部含有错误探测和管理模块;通信方式上,可以多主方式工作,网络上任意一个节点均可以在任一时刻主动向其他节点发送信息,可以点对点,点对多点以及全局广播方式收发数据,采用非破坏性总线总裁技术,当两个节点同时向总线上发送数据时,优先级低的节点主动停止发送,优先级高的节点可以不受影响的继续传输,可大大节省了总线仲裁冲突时间,在网络负载很重的情况下,也不会出现网络瘫痪。最远的通信距离可以到<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />10km,最大传输速率可达到1Mb/s


本文介绍了一种采用CAN总线方式低成本远程通信节点的设计,具有设计电路结构简单,通信速度快,可靠性高,通信距离远等优点,特别适合严重干扰的工业恶劣环境下工作。


 

一、硬件电路设计


系统采用AT90CAN32芯片作为主控制器,AT90CAN32芯片具有32KBf lash2KB RAM1K EEPROM810ADC1UART1CAN1SPI216位定时器、28位定时器、8路外部中断输入,看门狗电路等丰富的资源,最高的处理速度可以到16MIPS,采用AT90CAN32芯片作为主控制器设计的CAN总线节点,可以节约大量的外部扩展电路,简化设计,并且可靠性大大提高。


由于AT90CAN32芯片内置了CAN控制器,利用其内部集成的CAN控制器构成CAN总线收发网络,所以设计的CAN通讯的电路被大大简化,图1CAN通信的结构框图。


58b8813b-3304-4d48-adbf-1a4e94713711.GIF



<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />在这个结构图中,采用AT90CAN32内部集成的CAN控制器,采用了高速光耦6N137来隔离通信网络中的干扰, SJA1050芯片作为CAN总线的收发器,图2CAN通信部分的电路图。

  点击看大图


 



2  CAN总线通信接口电路图


在图2的电路中,为了增强CAN总线节点的抗干扰能力,AT90CAN32芯片的CANTXCANRX引脚不是直接连在SJA1050芯片的TXDRXD上,而是在它们之间通过高速光耦6N137隔离后再与SJA1050相连,这样就很好的实现了总线上各CAN节点之间的电气隔离。特别说明的是,电路中MCU系统的电源必须与CAN通信电源各自独立,这样可以有效的抑制来自网络中干扰信号影响单片机,否则,光耦在电路中就会失去作用。电源可采用小功率的开关电源模块,这样虽然增加了电路中的接口电路的复杂性,但提高了整个节点的稳定性和可靠性。


<?xml:namespace prefix = w ns = "urn:schemas-microsoft-com:office:word" />在每个芯片的电源入口附近可加一个0.01uF0.1uF的瓷片电容退藕。在CAN收发器的入口处,总线终端电阻R5可解决CAN网络中线路中阻抗的匹配问题。加入TVS,可以有效的抑制来自网络上的静电等干扰,保护通信及收发器的正常。磁珠L1,L2可以吸收网络上的高频信号,电阻R6R7在网络中起到限流保护作用,保护SJA1050芯片免受过流的冲击。


 点击看大图


3  提高EMI性能的CAN总线接口电路


在复杂的现场环境中,为提高CAN总线在通信过程中的高可靠性,可考虑如图3所示的电路方式进行设计。在电路中加入PTC热敏电阻,可有效的抑制电路中的电流过大而造成对CAN总线的影响,在CANLCANH两根总线的输入端与地之间分别接入了一个放电管,当整个CAN网络或部分CAN网络被裸露于户外的时候,加入放电管尤为重要。当输入端与地之间出现瞬变干扰时,通过放电管的放电可起到一定的保护最用,最有效的避免雷电对CAN网络总线的破坏。雷击浪涌波由于持续时间短,脉冲幅度高,能量大,会给CAN网络的正常运行造成极大的威胁。


 

二、CAN网络节点的软件设计


为实现CAN总线上数据的收发功能,CAN总线的智能节点电路设计的软件部分主要包括以下三个部分的子程序:CAN控制器的初始化子程序,发送中断程序,接收中断程序。如果要应用于在复杂的通信系统中,还需要加入一些总线错误处理程序,接收滤波处理,总线关闭处理,波特率设置与自动检测等等。


由于AT90CAN32芯片内置了CAN控制器,初始化的任务主要包括设定波特率,接收屏蔽寄存器,CAN邮箱的配置等等。在初始化过程结束之后,AT90CAN32芯片内部的CAN总线控制器就可以进行正常的CAN通信,但在程序中还需要完成CAN通信的接收中断和发送中断程序。下面给出GCC环境下的C语言编写的初始化程序:


void CanInit(void)


{


         unsigned char i,j;


         CANGCON |= 0x01;                                                   //reset CAN interface


         for( i = 0;i < 15;i++)                                                    //reset all Mobs


         {


                  CANPAGE = (i << 4);                                      //select Mob


                  CANCDMOB = 0;                                            //disable Mob


                  CANSTMOB = 0;                                             //clear status


                  CANIDT1 = 0;                                                  //clear ID


                  CANIDT2 = 0;


            CANIDT3 = 0;


            CANIDT4 = 0;


                   CANIDM1 = 0;                                                //clear mask


                  CANIDM2 = 0;


                   CANIDM3 = 0;


                   CANIDM4 = 0;


                   for(j = 0;j < 8;j++)


                   {


                            CANMSG = 0;                                        //clear data


                   }


         }


        CANBT1 = 0X06;                                                      //bit timing


         CANBT2 = 0X04;


         CANBT3 = 0X13;


         CANGCON = 0x02;                                                   //start can interface


         CANPAGE = (0 << 4);                                              //configure Mob[0] to receive


         CANIDT1 = 0xCD;                                                    //设置邮箱0为接收邮箱,标识符为0669H


         CANIDT2 = 0X20;


         CANIDT3 = 0X00;


         CANIDT4 = 0X00;


         CANIDM1 = 0X00;                      


         CANIDM2 = 0X00;


         CANIDM3 = 0X00;


         CANIDM4 = 0X00;


         CANCDMOB = (1 << CONMOB1);                       //enable reception bit7:6= [1:0]


         CANGIE = (1 << ENIT) | (1 << ENRX);                  //enable interrupt


         CANIE1 = 0;


         CANIE2 = (1 << 0);                                                   //enable Mob0 interrupt


         CANSIT1 = 0;


         CANSIT2 = 0;


         while(!(CANGSTA & (1 << ENFG)));                     //wait until module ready


}


    本文通过给出具体的CAN总线网络的实际接口电路,结合AT90CAN32芯片的丰富资源,用户可以扩展很多工业测控现场的应用,例如温度,湿度,压力,流量等模拟变量的检测,数据可通过CAN网络发送给远程的上位机。并可扩展LCD显示和按键等人机接口电路,以便用户操作。同时,这种智能型CAN总线接口的设计由于低成本,高可靠性,在扩展的CAN接口的网络分支中也能够得到很好的应用,系统通信非常可靠稳定。应用该接口电路而设计的测控在很多工业环境下得到了广泛的应用。


 
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
2
关闭 站长推荐上一条 /3 下一条