Codesys + BeagleBone PLC控制达到小儿科水平之I2C ADC输入
1,项目目标
准备将自己设计的AM335x平台变成一个PLC平台,所以准备学习一些有关PLC控制和开发的技术。
2,项目环境
因为Beaglebone 使用的也是AM335x处理器,所以准备先在Beaglebone 平台上练练手。
硬件:
Beaglebone black C版本
ADC模拟芯片是Ti公司的ADS1115
软件:
Beaglebone Debian操作系统。
CODESYS 64 3.5.18
本文地址:
https://blog.csdn.net/dylanZheng/article/details/126132057
3,I2C 总线上的ADC设备的测试
本人使用的ADC芯片是Ti公司的ADS1115。在构建Codesys的工程之前,需要先确保I2C总线上的ADC芯片是否能够正常操作.
I2cdetect –r –y 0
检查I2C0总线上是否有ADC芯片。它的I2C地址是0x48,。 如下图, 能够顺利扫描到设备。
图1,扫描I2C设备
但是使用命令i2cdump 去读寄存器数据时,会发生错误,如下图所示:
图2, I2C读取数据错误
这主要是因为系统启动后,自动加载了它的驱动,驱动占有/锁定了它的资源。它的操作需要通过驱动程序去执行,而不是直接i2c tool命令来。具体可以通过sys目录下的iio总线来执行,如下图所示。
图3, IIO总线的操作
4 新建ADC的Codesys工程
通过步骤3,我们已经知道ADC的物理连接是没有问题的。所以下一步就是要通过codesys的工程来实现ADC的数据读取。
Codesys提供的beaglebone runtime没有直接提供I2C操作的设备和库。 经过google,这里有两种解决方法:
1),下载raspberry的runtime包,在它的例子和库中有i2c的对应设备,安装上对应的设备和库后,在转到beaglebone的工程里,应该就能找到对应设备。
2),下载论坛里面其他人创建的ADS115工程,并在此基础上测试。
本人经过多番尝试第一种方法,但是不幸的是,这条路没有走通。 幸运的是刚好能够搜索到ADS115的工程包,因此直接通过第二种方法去测试。 如果有读者走通过第一种方法,欢迎留言或者私信,在此先谢过。
ADS115的工程包的下载地址:
https://forum.codesys.com//download/file.php?id=2123
下载后打开工程,如下图所示,除了I2C,工程中包含有其他总线:
图4,下载的ADS1115工程
删除掉上面工程中的不相关的总线,如GPIO, SPI, onewire以及Camera device后,只剩下I2C总线,如下图:
图5,清理后的ADS1115工程
这里需要修改几个配置项:
(1),添加I2C 总线号,我们连接的是CPU的I2C0,所以设定为 '/dev/i2c-0',如果使用的是I2C1,需要使用'/dev/i2c-1',以此类推。
图6, 设置总线
(2),配置ADS1115的I2C地址。它的地址是0x48,这里要换算成10进制,就是72.
图7, 设置I2C地址
(3),这里贴出其他选项设置,供参考 :
图8:ADS115的其他配置
以及PLC的代码:
图9, 工程的PLC代码
5,编译,下载,测试
关于具体如何编译,登录,下载等操作,可以参考本人其他博文。 这里专注于ADC相关的测试。
当工程运行时,如下图,没有任何错误,并且所有的选项都是绿色。此时在ADC输入端添加电压,就可以看到lrValue1读取的数值的变化。
图10,工程运行情况
6,调试中碰到的问题
在开始的调试codesys的时候, ADS1115报错, bus not running。
具体的原因是系统内核的驱动占用了总线资源。所以需要重新编译内核,将ADS1115的对应驱动编译成模块。
图11,编译驱动为模块方式
重新更新内核后,使用命令lsmod可以看到ti_ads1015已经是作为模块运行了。
图12,查看系统运行模块
卸载掉模块后:
图13, 卸载模块
可以使用i2c tool测试一下
图14,运行I2C tool
此时再次运行codesys,代码就能正常了。
-----------------------------------完--------------------------------------------