Linux驱动---ADC驱动

news2024/12/24 21:26:31

文章目录

  • 一、电路图
  • 二、将ADC标准驱动选配到内核
  • 三、修改设备树文件
  • 四、实验现象

一、电路图

在这里插入图片描述
由电路图可知,两个电路测量分别通过ANA0和ANA1两个ADC通道完成

查看芯片手册可知,ANA0可作为ADC1的通道0和通道1,或者ADC2的通道0和通道1.
在这里插入图片描述
ANA1可作为ADC1的通道1和ADC2的通道1
在这里插入图片描述
本次ANA0选用ADC1的通道0,ANA1选用ADC1的通道1

二、将ADC标准驱动选配到内核

执行 make menuconfig,将ADC标准驱动选配到内核中

Device Drivers --->
	<*> Industrial I/O support --->
			Analog to digital converters --->
					<*> STMicroelectronics STM32 adc core
					<*> STMicroelectronics STM32 adc

在这里插入图片描述
保存配置后,重新编译内核
在这里插入图片描述

三、修改设备树文件

参考帮助文档:
linux-5.10.61/Documentation/devicetree/bindings/iio/adc

 // Example 2: with stm32mp157c to setup ADC1 with:
471     // - channels 0 & 1 as single-ended 通道0和1被配置为单端模式
472     // - channels 2 & 3 as differential (with resp. 6 & 7 negative inputs) 通道2和3被配置为差分模式
473       #include <dt-bindings/interrupt-controller/arm-gic.h>
474       #include <dt-bindings/clock/stm32mp1-clks.h>
475       adc12: adc@48003000 {
476         compatible = "st,stm32mp1-adc-core";
477         reg = <0x48003000 0x400>;
478         interrupts = <GIC_SPI 18 IRQ_TYPE_LEVEL_HIGH>,
479                      <GIC_SPI 90 IRQ_TYPE_LEVEL_HIGH>;
480         clocks = <&rcc ADC12>, <&rcc ADC12_K>;
481         clock-names = "bus", "adc";                                              
482         booster-supply = <&booster>; 
483         vdd-supply = <&vdd>;
484         vdda-supply = <&vdda>;
485         vref-supply = <&vref>;
486         st,syscfg = <&syscfg>;
487         interrupt-controller;
488         #interrupt-cells = <1>;
489         #address-cells = <1>;
490         #size-cells = <0>;                                                       
491         adc@0 {
492           compatible = "st,stm32mp1-adc";
493           #io-channel-cells = <1>;
494           reg = <0x0>;
495           interrupt-parent = <&adc12>;
496           interrupts = <0>;
497           st,adc-channels = <0 1>;
498           st,adc-diff-channels = <2 6>, <3 7>;
499           st,min-sample-time-nsecs = <5000>;
500           dmas = <&dmamux1 9 0x400 0x05>;
501           dma-names = "rx";
502         };
503         // ...
504         // other adc child node follow...
505       };

在stm32mp151.dtsi文件中找到adc1节点

adc: adc@48003000 {
			compatible = "st,stm32mp1-adc-core";
			reg = <0x48003000 0x400>;
			interrupts = <GIC_SPI 18 IRQ_TYPE_LEVEL_HIGH>,
				     <GIC_SPI 90 IRQ_TYPE_LEVEL_HIGH>;
			clocks = <&rcc ADC12>, <&rcc ADC12_K>;
			clock-names = "bus", "adc";
			interrupt-controller;
			st,syscfg = <&syscfg>;
			#interrupt-cells = <1>;
			#address-cells = <1>;
			#size-cells = <0>;
			status = "disabled";

			adc1: adc@0 {
				compatible = "st,stm32mp1-adc";
				#io-channel-cells = <1>;
				reg = <0x0>;
				interrupt-parent = <&adc>;
				interrupts = <0>;
				dmas = <&dmamux1 9 0x400 0x80000001>;
				dma-names = "rx";
				status = "disabled";
			};

将帮助手册中的实例与当前设备树进行对比后,发现需要配置以下键

&adc{
	booster-supply = <&booster>; 
	vdd-supply = <&vdd>;
	vdda-supply = <&vdda>;
	vref-supply = <&vref>;
	status = "okay";
	&adc1{
		st,adc-channels = <0 1>;
		st,adc-diff-channels = <>;
		st,min-sample-time-nsecs = <>;
		status = "okay";
	};
};

继续查看帮助手册,查明相应键值的含义

首先是st,adc-channels 代表单端通道模式下的通道标号
stm32mp1板子具有20个通道,取值范围为0-19
在这里插入图片描述
写值范围:
在这里插入图片描述

st,adc-diff-channels 用于配置差分输入模式,此次使用的单端通道模式,因此不配置该属性
在这里插入图片描述

st,min-sample-time-nsecs 用于配置ADC的最小采用时间
在这里插入图片描述
在这里插入图片描述

根据上述信息,得到设备树节点

&adc {
	vdd-supply = <&vdd>;
	vdda-supply = <&vdd>;
	vref-supply = <&vdd>;
	status = "okay";
	adc1: adc@0 {
		st,adc-channels = <0 1>;
		st,min-sample-time-nsecs = <10000>;
		status = "okay";
	};
};

修改完设备树,重新编译设备树文件。
将重新编译的设备树文件以及内核镜像文件放到tftp目录下,重启开发板

四、实验现象

  1. 系统启动后可以查看目录/sys/bus/iio/devices/
    所有的iio设备目录都在该路径下
    在这里插入图片描述
  • 注:IIO设备,全称是Industrial I/O(工业I/O)设备,是专用于模数转换器(ADC)和数模转换器(DAC)的内核子系统中的设备
  1. 通过/sys/bus/iio/devices/iio:device*/name来确定是哪个设备节点
  2. in_voltage0_raw/in_voltage1_raw 文件读到的数据是当前采集到的数据
  3. in_voltage0_type/ in_voltage1_type 文件读到的数据是当前 ADC 通道的精度
  4. 在应用层通过读取文件的内容来获取相应的电流值以及电压值
  5. 读取到的数值需要进行计算
    在这里插入图片描述
    相应电阻的数值在电路图中有体现
    R50 = 1k
    R49 = 100k
    R53 = 10R
    R54 = 0.1R

在这里插入图片描述

实现现象
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2200645.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何在 ONLYOFFICE 文档中,将插件添加到右侧面板

通过自定义工具&#xff0c;可以提高您的工作效率。最新更新后&#xff0c;ONLYOFFICE 插件提供了更大的灵活性。在上一篇文章中&#xff0c;我们演示了如何将插件显示为选项卡。您也可以将插件面板放置在编辑器的左侧或右侧。在这篇文章中&#xff0c;我们将深入探讨此功能&am…

选型工单管理系统,从原理到应用全面解读

工单管理系统提升客户支持效率&#xff0c;优化内部协作&#xff0c;强化数据分析。选型需明确需求&#xff0c;比较系统功能和特性&#xff0c;评估试用后选择最适合的系统。ZohoDesk凭其多渠道支持、智能分配、自动化工具、协作工具和数据分析能力&#xff0c;成为企业优选。…

C语言 | Leetcode C语言题解之第449题序列化和反序列化二叉搜索树

题目&#xff1a; 题解&#xff1a; #define MAX_NODE_SIZE 10000void postOrder(struct TreeNode *root, int *arr, int *pos) {if (root NULL) {return;}postOrder(root->left, arr, pos);postOrder(root->right, arr, pos);arr[(*pos)] root->val; }struct Tree…

界面控件DevExpress中文教程 - 如何拓展具有AI功能的文本编辑器(一)

本文重点介绍了DevExpress在近年来最热门领域——人工智能(AI)和自然语言处理(NLP)的改进&#xff01; NLP是人工智能的一个分支&#xff0c;它允许计算机与人类语言进行交互&#xff0c;这包括以有意义/有用的方式理解、解释、生成和回应文本(和语音)的能力。基于NLP的功能允…

ESP32-C3实现GPIO输入-判断高低电平

在 ESP32-C3 上实现 GPIO 输入并判断电平状态相对简单。以下是如何在 Arduino IDE 中配置 GPIO 作为输入&#xff0c;并在循环中检查电平状态的步骤&#xff1a; 1. 定义 GPIO 管脚 首先&#xff0c;定义你将要使用的 GPIO 管脚号。 #define GPIO_INPUT_PIN 2 // 定义一个 GP…

DAMA数据管理知识体系(第13章 数据质量)

课本内容 13.1 引言 语境图 图13-1 语境关系图&#xff1a;数据质量业务驱动因素 1&#xff09;提高组织数据价值和数据利用的机会。2&#xff09;降低低质量数据导致的风险和成本。3&#xff09;提高组织效率和生产力。4&#xff09;保护和提高组织的声誉。 提机会、降成本、增…

django(三):创建第一个django的app和url的两种获取参数的方式

一.创建第一个django的app 1.1 在终端根目录下执行命令 ## 创建一个app python manage.py startapp <app名称>例&#xff1a;python manage.py startapp book1.2创建成功后生成文件如下 二.url两种获取参数的方式 book/views.py from django.shortcuts import …

HTB:Markup[WriteUP]

目录 连接至HTB服务器并启动靶机 1.What version of Apache is running on the targets port 80? 2.What username:password combination logs in successfully? 使用Yakit并使用TOP1000字典对密码进行爆破 3.What is the word at the top of the page that accepts use…

二叉搜索树(BST)简单讲解

概念&#xff1a; 二叉搜索树是一棵二叉树或者空树&#xff0c;又名二叉排序树&#xff0c;英文简写为 BST &#xff08;Binary Search Tree&#xff09; 性质&#xff1a; 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值若它的右子树不为空&#xf…

使用C++写一个自己定义的图像格式,写入磁盘

看到OpenCV的Image类实例一副图像&#xff0c;觉得挺好玩&#xff0c;因此想自己定义一个自己的图像类&#xff0c;让后完成写盘&#xff0c;并且读取出来。没有办法&#xff0c;再利用一下OpenCV的imshow显示一下&#xff0c;看看和自己的预期是否一样。 首先要先定义一个图像…

养猫家庭有什么宠物空气净化器推荐吗?哪款吸毛效果最好?

不知道你们家的猫最近有没有大量掉毛&#xff1f;还是今早穿短袖感觉到有点冷&#xff0c;我才意识到秋天到了&#xff0c;新一轮的换毛季又来了。不仅和猫咪玩耍的时候可以“采摘”不少毛毛&#xff0c;而且家里的衣服上、地板上也被毛发入侵&#xff0c;感觉用不了多久&#…

Python基础之List列表用法

1、创建列表 names ["张三","李四","王五","Mary"] 2、列表分片 names[1]&#xff1a;获取数组的第2个元素。 names[1:3]&#xff1a;获取数组的第2、第3个元素。包含左侧&#xff0c;不包含右侧。 names[:3]等同于names[0:3]&…

DAY3 JAVA基本语法

了解注释 注释是写在程序中对代码进行解释说明的文字,方便自己和其他人查看,以便理解程序的。 注释不影响程序的运行,编译后的class文件夹没有内容 字面量 在Java中,字面量(literal)是用来表示源代码中常量值的符号。 这些字面量可以直接出现在Java源代码中,并且它们代…

搜狗翻译体验,2024四大翻译工具解析!

为了满足广大用户的需求&#xff0c;市面上涌现出了众多优秀的翻译工具&#xff0c;福昕在线翻译、福昕翻译客户端、海鲸AI翻译、搜狗翻译等。今天&#xff0c;我们就来对比一下这些翻译工具&#xff0c;看看它们各自的特点和优势。 福昕在线翻译&#xff1a;专业精准&#xf…

前端初识之一

网页 什么是网页 网站是指在因特网上根据一定的规则&#xff0c;使用 HTML等制作的用于展示特定内容相关的网页集合。 网页是网站中的一“页”&#xff0c;通常是HTML格式的文件&#xff0c;它要通过浏览器来阅读&#xff0c; 网页是构成网站的基本元素&#xff0c;它通常由…

【通过WSL2安装Ubuntu24.04系统及图形化界面】

WSL&#xff08;Windows Subsystem for Linux&#xff09;是一个为Windows用户设计的兼容层&#xff0c;它允许用户在Windows10和Windows11操作系统上直接运行GNU/Linux环境。WSL提供了一个微软开发的Linux兼容内核接口&#xff0c;使得用户可以在不启动虚拟机或使用双重启动设…

PostgreSQL的学习心得和知识总结(一百五十三)|[performance]将 OR 子句转换为 ANY 表达式

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《PostgreSQL数据库内核分析》 2、参考书籍&#xff1a;《数据库事务处理的艺术&#xff1a;事务管理与并发控制》 3、PostgreSQL数据库仓库…

安装Unity3D并配置VisualStudio

安装Unity3D并配置VisualStudio 由于近期课程要求&#xff0c;需要在电脑上安装Unity3D并配置VisualStudio&#xff0c;所以顺便写了本篇博文 1.下载Unity Hub 首先我们找到Unity中文官网&#xff0c;下载Unity Hub&#xff0c;它可以帮助我们管理我们的Unity项目和版本&#…

vue3.x系列之封装响应式的hooks技巧

v3.x封装一个接口请求的hooks的&#xff0c;都应该很熟练了&#xff0c;那么要实现一个响应式的hooks该怎么做&#xff1f; 实现效果 代码实现 <template><div v-if"error">Oops! Error encountered: {{ error.message }}</div><div v-else-i…

【第2章 开始学习C++】C++语句

文章目录 导语声明语句和变量赋值语句cout的新花样使用cin类简介 导语 C 程序是一组函数&#xff0c; 而每个函数又是一组语句。 C 有好几种语句&#xff0c;例如&#xff1a;声明语句创建变量&#xff0c; 赋值语句给该变量提供一个值。 声明语句和变量 计算机是一种精确的…