本文介绍一种新型的基于LIN总线网络的步进电机驱动方案是以瑞萨电子公司(Renesas)的16位单片机R8C/23实现LIN主节点,以On Semiconductor的微步电机驱动芯片AMIS-30623为LIN从节点,构建的一种极其简单而又可靠的LIN总线网络,用以驱动步进电机,实现对汽车车身网络控制,如汽车前照灯转向控制(AFS), 汽车采暖通风调节(HVAC)等。
从目前来看,在汽车内网络应用中,CAN(Controller Area Network)总线是最被普遍应用的网络标准,其高性能和可靠性已被认同,并已经被广泛地应用于除汽车电子外的其他领域,如工业自动化、船舶、医疗设备、工业设备等领域。但是,相比较来说,对于一些传输速率不是很高,成本要求比较敏感的应用场合,LIN(Local Interconnect Network)总线更加能够满足要求。本文将以汽车前照灯转向控制为例,介绍LIN网络在其中的具体应用。包括硬件R8C/23与AMIS-30623的硬件接口电路和具体的软件描述。
R8C/23单片机是瑞萨电子R8C Tiny产品家族的成员,它采用CISC结构,内部总线宽度16位,最高运行频率达20MHz,具有内置可在线编程FLASH、EMI 性能出色、硬件看门狗、引脚功能丰富等多种优点。R8C/23单片机内置了CAN 控制器和LIN模块,可在车载温度范围内使用。
R8C/23单片机的主要性能特点如下:
地址空间:1M字节
存储空间:可编程ROM为最大为48K字节,数据闪存为1K字节×2,RAM为2.5K字节
端口:输入/输出为41个,输入3个
定时器:4个
串行接口:2个。1个通道(UART0)——时钟同步串行I/O、时钟异步串行I/O,1个通道(UART1)——时钟异步串行I/O
时钟同步串行接口:1通道(I2C,带片选时钟同步串行I/O)
LIN模块:1通道,硬件LIN
CAN模块:1通道(CAN2.0B,16 slot)
A/D转换器:10位×12通道
看门狗定时器
中断:14个内部中断,6个外部中断,4个软件中断,7个中断优先级
时钟产生电路:外部和内部时钟源可以选择
在本方案中使用的是R8C/23 CAN/LIN 演示板,如图2所示。
R8C/23 CAN/LIN演示板是瑞萨电子开发的面向CAN/LIN应用的开发工具。演示板除了提供必要的硬件资源之外,还提供了4个样例程序- CAN应用、LIN主机应用、LIN从机应用以及LCD显示驱动程序,可以助您快速熟悉、掌握瑞萨单片机以及瑞萨单片机在CAN、LIN总线方面的应用方法。
AMIS-30623是On Semiconductor半导体公司推出具有LIN通讯接口、无传感器失步和堵转检测、诊断保护功能的步进电机驱动单芯片集成电路,可以用于汽车以及工业控制中,增强可靠性、减少元器件数量、减少线路板空间并降低成本以及缩短开发时间。该产品的目标用途包括前灯调平和旋转、汽车采暖、通风和空调(HVAC)设计、监视摄像机控制、专业照明设备、工业XYZ台和制造机器人等。
AMIS-30623的工作温度在-40ºC至125ºC之间,可提供最高至800mA的可编程峰值电流,简捷的编程指令以实现对步进电机的所有运动控制。芯片上位置控制器可根据不同的电机类型、定位范围和参数(例如速度、加速和减速)进行设置。该产品具备保持电流的特性,低于100μA的断电电流确保了在备用模式下消耗最小功率。
AMIS-30623的主要性能如下:
无需传感器的失步检测
可编程驱动电流峰值可到800mA
固定频率的PWM电流控制
快速和慢速衰减模式自动选择
1/2, 1/4, 1/8和1/16四种微步模式
位置控制
兼容14V/24V
速度、加速度可配置
LIN接口(LIN rev.1.3,通讯速率19.2Kbps)
可现场编程的节点地址
动态分配ID
详尽的诊断和状态信息
过流保护、降压保护、开路检测、高温报警
LIN总线短路到地或电源保护
支持LIN总线唤醒
其典型应用电路:
R8C/23 CAN/LIN演示板与AMIS-30623驱动板的连接如图5所示。
从上图中可以看出,整个系统只需接入+12V和GND,系统即可工作,连线非常简单。图中的步进电机使用的是2相步进电机KH39FM2-851,来自日本伺服有限公司(JAPAN SERVO CO., LTD.)。
用R8C/23实现LIN主节点的硬件原理如图6所示。本例中LIN收发器采用的是NXP-TJA1020。
规格 | 额定功率(70摄氏度) | 重量(g)(1000pcs) |
---|---|---|
0201 | 1/32W | 0.14 |
0402 | 1/16W | 0.54 |
0603 | 1/16W | 1.83 |
0805 | 1/10W | 4.71 |
1206 | 1/8W | 9.02 |
1210 | 1/5W | 10 |
2010 | 1/4W | 23.61 |
2512 | 1/2W | 38.06 |
遇到了一个单片机上电不工作的问题,仔细检查过电源、地、复位电路后,原因锁定到时钟电路上。
单片机外接晶体振荡电路的连接参见下图::
出于成本考虑,一般在用的时候会省去反馈电阻Rf和幅度衰减电阻R1。
其中, Rf为反馈电阻,其作用是稳定输出幅度和相位,其取值为200K~1Mohm;
R1为驱动限流电阻,限制反向放大器输出幅度,同时起到抑制EMI的作用。该电阻可以不使用,但当芯片输出功率较大时,或是振荡频率较高时,建议使用该限流电阻,以防止晶体被过驱动;该电阻不能太大,其阻值应与C2电容的电抗值(在振荡频率下)相当。
C1,C2为负载电容。
这次的问题原因就是省去电阻R1造成的。
现象:
单片机上电不工作,示波器测量Xout端对地时钟幅度达到8V左右,不知道为什么这么高?
解决方法:
串接幅度衰减电阻R1 = 4.7K后,单片机上电工作正常了。
不过,示波器在Xout端测量不到时钟波形了,衰减太大了?
结论:
做工合格的晶体,一般不会有这样的问题。
可是如果选到了质量一般的晶体,就会有上面的问题。
所以,建议电路还是按上面的连接来。
AVTP定义了一种打包格式,对象是各种各样的audio和video format及control信息。 AVTP是multicast协议,即一个talker(data source)提供信息给一个或多个listeners(data sink)。
IEEE1722a也定义了format用于field bus系统。
为了限制在Ethernet网络中的非要求 multicast交易的forwarding, AVTP package(典型的)放到VLAN tagged Ethernet package。
IEEE 802.1Q提供了一种机制 ,可以将neiwork分割成不同的broadcast domains。 GW系统所用的分类机制限于位于802.1Q Ethernet frames中的AVTP。
1722 sub format package用于传输Non Time-Synchronous Control Stream packages。不支持presentation time。Field bus可以是CAN messages。 NTSCF package被要求用于交换CAN messages通过GW系统,不需要CPU干预。 CAN agent用CAN-ACF容器与GW系统交换CAN messages。
测试中需要测试7个网卡,独立收、发802.1q的帧。
不限(目前在Ubuntu 14.04上实现,windows上没有实现)
目前实现的配置:
Ubuntu 14.04+Pycharm Community 2016.1+Python 2.7.6+scapy 2.3.2。 经过一番折腾,终于有结果了。过程很曲折,记录下来,以备以后翻阅。
网上查阅,发现scapy可以实现通过网卡收、发帧,需要基于python。
开始是在windows 7上,Eclipse+PyDev,运行时提示:IPv6不支持,而且发现用scapy无法实现收发802.1q的帧。
经过网上查阅,发现该问题从2012年就有人提交了问题,scapy在windows下目前不支持ip v6的相关操作(后来的实现也没有用到ipv6,而是用的ipv4)。
以后预计在scapy 3.0后会修改,会支持windows 10以后版本,windows 7不支持。
不过,不能收发802.1q帧的问题重点其实不在这里,而是windows不支持直接操作网卡。 所以,只好转到Ubuntu。
转Ubuntu,第一想法是用虚拟机,我采用了virtualBox虚拟机,安装了Ubuntu14.04LTS。
终端运行python,发现版本是2.7.6,符合要求。
安装scapy。
安装pycharm。
这时,可能会提示需要安装相应版本的JDK,具体安装另见“JDK的安装”。
JDK是必需的,而且相应版本要安装正确,pycham需要JDK 8.
pycharm下编辑python程序:发送802.1Q帧
from scapy.all import *
sendp(Ether(dst='(目标网卡MAC地址)',src='(发送源网卡MAC地址)') /Dot1Q(vlan=1,id=3,prio=2,type=0x22f0))
网卡的MAC地址在windows下可以通过ping命令查到,在Ubuntu下也可以通过ping命令查询到,也可以“系统设置”-“网络”-“有线”-“硬件地址”,直接看到。
另准备一台windows PC,安装wireshark,可以监测ubuntu发出来的802.1q帧。
但是,如果再接一个网卡,我用的是UGREEN的USB2Eth网卡,问题就来了:同一时间只能有一个网卡发送成功。
经过查询,VM中同一时间只能有一个网卡“桥接”方式有效,而我需要同时连接7个网卡呢。
所以,只好抛弃VM。
幸好,有台机器是uBuntu,还安装了mate桌面(坑,找不到设置),虽然版本是12.04,经过周末2个多小时的升级过程,升级到了14.04,mate被抹掉了。
添加root用户,重启,登陆。
检查python,版本是2.7.6,够用。
安装scapy,安装JDK。
安装pycharm。
重复前面的帧发送程序,从eth0发送,另一台PC运行wireshark监测,成功。
修改前面的帧发送程序,从eth1发送,另一台PC运行wireshark监测,成功。
pycharm下编辑python程序:接收802.1Q帧
from scapy.all import *
sniff(filter="ether proto 0x8100", prn=lambda x: x.show(), count=1,timeout=20)
运行程序监测接收数据,从另一台PC运行ostinato发送802.1Q数据,发现收到的数据缺少4个VLAN tag字节(0x8100,priority,VLAN ID)。
windows下用wireshark监测数据时,曾经出现过不显示VLAN tag的问题,通过网卡的高级属性,设置“Priority and VLAN tag”为disabled,就可以显示VLAN tag。
还用这个思路,在ubuntu下不知道如何设置网卡属性。
查阅结果发现,是linux kernel把VLAN tag给stripped(移除)了,因为它认为0x8100是标准的,没有人需要该信息,可是我需要呀。
用tcpdump命令发现,监视到0x8100字样的VLAN tag存在。
终于搜到一个帖子(如下,我加了一些安装信息)提示安装pcap或pcappy,因为它们采用和tcpdump同样的方法:重建VLAN tag。
Does anyone know why scapy is unable to capture (parse?) the vlan frame, but tcpdump sees it fine?
Based on RyPeck’s answer and GuyHarris’s advice, I now have a much better workaround:
###a) Using http://sourceforge.net/projects/pylibpcap/ import pcap conf.use_pcap=True
Linux下安装pylibpcap模块
1. 安装libpcap
apt-get install libpcap-dev
2.安装python的dev版,否则安装pylibpcap出错
apt-get install python-dev
3.安装python pcap模块
下载pylibpcap-0.6.2.tar.gz并解压,执行
python setup.py install
4. 去pylibpcap-0.6.2/examples执行测试脚本
python sniff.py eth0 'port80'
###b) Using pcappy - which is can be installed with: pip install pcappy import pcappy as pcap conf.use_pcap=True
Now scapy shows the same vlan information as tcpdump, with all it's great parsing features intact!
安装setuptools
wget https://bootstrap.pypa.io/ez_setup.py -0 - | python easy_install -i https://pypi.python.org/pypi/pcappy pcappy (easy_install pcappy会出错,缺省网址变了)
运行程序准备接收,从另一台PC运行ostinato发送802.1Q数据。
带VLAN tag字节(0x8100,priority,VLAN ID)的帧数据终于被收到了,而且两个网卡都可以正常Tx & Rx了。
总结:
scapy对windows支持不好,尤其是windows7以下。
windows下很难以administrator权限操作网卡。
VM下只能有一个网卡作用于桥接方式。
需要pcap或pcappy重建被linux kernel移除的VLAN tag。
注:以下内容选自Renesas SH7269 HW(Hardware Manual,硬件手册)。
A/D转换器将模拟输入通道输入的模拟值一边和模拟基准电压进行比较一边转换为10位的数字值。此时的A/D转换绝对精度,即输入模拟值和输出数字值的偏差包含以下误差,按照下图,依次说明每个误差。但是,为了使图容易理解,将10位的A/D转换器简化为3位的A/D转换器。
是指在数字输出值从最小值(零电压)“B’0000000000”(图中是“000”)变为“B’0000000001”(图中是 “001”)时实际A/D转换特性与理想A/D转换特性的偏差 (图1(1))为。
是指在数字输出值从 “B’1111111110”(图中是 “110” )变为最大值 (满刻度电压)“B’1111111111”(图中是 “111”)时实际A/D转换特性与理想A/D转换特性的偏差 (图1(2))。
是指A/D转换器固有的偏差,表示为1/2LSB(图1(3))。
是指从零电压到满刻度电压之间的实际A/D转换特性与理想A/D转换特性的偏差 (图1(4)),但是不包含偏移误差、满刻度误差和量化误差。
注:以下内容选自Renesas SH7269 HW(Hardware Manual,硬件手册)。