Linux驱动---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

在这里插入图片描述

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值