IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> Linux通过shell命令读取ADC电压 -> 正文阅读

[系统运维]Linux通过shell命令读取ADC电压

Linux通过shell命令读取ADC电压

Linux的ADC在应用层上可以直接操作/sys/bus/iio/devices/iio:\device0/目录的文件,而对于Linux的ADC操作有两种模式,一种是单次读取模式,第二种是多次读取模式。

一、单次读取

对于Linux系统上的ADC读取,在m3352上支持4路ADC输入,系统提供/sys文件系统接口操作,
在/sys/bus/iio/devices/iio:\device0/目录下有in_voltage4_raw~in_voltage7_raw这四个文件,
分别读取这4个文件,可获得对应的ADC值。

cat /sys/bus/iio/devices/iio\:device0/in_voltage4_raw 2782转换公式

二、多次读取

官方直接写一个C的程序去实现的,可能水平不够,没太看懂这样做的意义。直接用shell写个脚本多执行几次上面的命令不就成多次读取了吗,等以后回来来看看两者的利弊

我写的shell

#!/bin/bash
for a in {1..10}
do
 cat /sys/bus/iio/devices/iio\:device0/in_voltage$1_raw
 sleep 1
done

官方给的就复杂了

1.定义两个API函数
int find_type_by_name(const char name, const char type)
获取设备,其中name为需要打开的文件名

int build_channel_array(const char device_dir, struct iio_channel_info **ci_array, int counter)
根据ADC文件获取相应的ADC

2.程序源码

dev_num = find_type_by_name(device_name, "iio:device");            /*获取ADC设备,返回设备序号*/
if (dev_num < 0) {
    printf("Failed to find the %s\n", device_name);
    ret = -ENODEV;
    goto error_ret;
}
asprintf(&dev_dir_name, "%siio:device%d", iio_dir, dev_num);            /*将要操作的ADC文件*/
ret = build_channel_array(dev_dir_name, &infoarray, &num_channels);    /*获取相应的ADC渠道信息*/
if (ret) {
    printf("Problem reading scan element information\n");
    printf("diag %s\n", dev_dir_name);
    goto error_ret;
}
ret = asprintf(&buf_dir_name, "%siio:device%d/buffer", iio_dir, dev_num);/*ADC对应的buffer文件位置*/
if (ret < 0) {
    ret = -ENOMEM;
    goto error_ret;
}
ret = write_sysfs_int("length", buf_dir_name, buf_len);                /*设置ADC的数据长度*/
if (ret < 0)
    goto error_free_buf_dir_name;
/* Enable the buffer */
ret = write_sysfs_int("enable", buf_dir_name, 1);                    /*使能ADC*/
if (ret < 0)
    goto error_free_buf_dir_name;
ret = asprintf(&buffer_access, "/dev/iio:device%d", dev_num);            /*ADC文件目录*/
if (ret < 0) {
    ret = -ENOMEM;
    goto error_free_buf_dir_name;
}
/* Attempt to open non blocking the access dev */
fp = open(buffer_access, O_RDONLY | O_NONBLOCK);            /*打开ADC通道*/
if (fp == -1) { /*If it isn't there make the node */
    printf("Failed to open %s\n", buffer_access);
    ret = -errno;
goto error_free_buf_dir_name;
}
scan_size = size_from_channelarray(infoarray, num_channels);            /*获取渠道数据大小*/
data = malloc(scan_size*buf_len);
if (!data) {
    ret = -ENOMEM;
    goto error_close_buffer_access;
}
for (j = 0; j < num_loops; j++) {                                /*循环读取*/
    usleep(timedelay);
    read_size = read(fp, data, buf_len*scan_size);
    if (read_size == -EAGAIN) {
    printf("nothing available\n");
        continue;
    }
    for (i = 0; i < read_size/4; i++, data+=4)
printf("ADC Value: %d\n", *(long*)data);
}
/* Stop the ring buffer */
ret = write_sysfs_int("enable", buf_dir_name, 0);                    /*禁止使能*/
if (ret < 0)
    goto error_close_buffer_access;

值得注意的是,ADC的多次读取模式中,每次只能开启一个通道,若要切换通道必须先关闭已打开的ADC通道。

(1)创建设备节点
创建/dev/iio:device0设备节点,节点信息,参考/sys/bus/iio/devices/iio:device0/dev文件:
#cat /sys/bus/iio/devices/iio:device0/dev
251:0
设备节点主次设备号是251,0。创建命令:

(2)设置continuos模式
[root@M3352 ~]# echo continuous > /sys/bus/iio/devices/iio\:device0/mode

(3)使能通道4
[root@M3352 ~]# echo 1 > /sys/bus/iio/devices/iio\:device0/scan_elements/in_volta4_en

(4)运行范例程序

[root@M3352 ~]# ./generic_buffer -n tiadc -l 16 -c 5
ADC Value: 2199
ADC Value: 2199
ADC Value: 2199
ADC Value: 2200
ADC Value: 2202

其中,l和c参数,请参考generic_buffer.c源码。
 
(5)切换通道
切换通道时,则需要先关闭通道4,打开需要的通道,如通道5:

[root@M3352 ~]# echo 0 > /sys/bus/iio/devices/iio\:device0/scan_elements/in_volta4_en
[root@M3352 ~]# echo 1 > /sys/bus/iio/devices/iio\:device0/scan_elements/in_volta5_en

 然后继续读取即可。

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-04-28 12:14:41  更:2022-04-28 12:17:47 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 20:03:56-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码