2过程贴——ADC的使用
这次来使用adc

开发板提供了8个通道的adc,4引脚对应的是1通道。
有2种实现,分别是c和py: c:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
// 定义 IIO 设备的路径(根据你实际的板子,可能需要修改 device0 或 voltage0)
#define RAW_PATH "/sys/bus/iio/devices/iio:device0/in_voltage0_raw"
#define SCALE_PATH "/sys/bus/iio/devices/iio:device0/in_voltage_scale"
int main(void) {
FILE *raw_file, *scale_file;
int raw_value;
float scale_value, voltage;
printf("开始读取 ADC 数据,按 Ctrl+C 退出...\n");
while (1) {
// 1. 打开并读取原始值 (raw)
raw_file = fopen(RAW_PATH, "r");
if (raw_file == NULL) {
perror("错误:无法打开 raw 文件,请检查路径是否正确");
return EXIT_FAILURE;
}
if (fscanf(raw_file, "%d", &raw_value) != 1) {
perror("错误:读取 raw 值失败");
fclose(raw_file);
return EXIT_FAILURE;
}
fclose(raw_file);
// 2. 打开并读取比例因子 (scale)
scale_file = fopen(SCALE_PATH, "r");
if (scale_file == NULL) {
perror("错误:无法打开 scale 文件,请检查路径是否正确");
return EXIT_FAILURE;
}
if (fscanf(scale_file, "%f", &scale_value) != 1) {
perror("错误:读取 scale 值失败");
fclose(scale_file);
return EXIT_FAILURE;
}
fclose(scale_file);
// 3. 计算实际电压 (实际电压 = 原始值 * 比例因子)
voltage = raw_value * scale_value;
// 4. 打印结果
printf("原始值(Raw): %-6d | 比例因子(Scale): %-10.6f | 实际电压: %.3f mV\n",
raw_value, scale_value, voltage);
// 每隔 1 秒读取一次
sleep(1);
}
return EXIT_SUCCESS;
}编译后运行如下:

python实现:
import os
import time
# 根据你的截图,路径是 iio:device0
# 注意:在 Linux shell 中冒号是特殊字符,但在 Python 字符串里没问题
IIO_PATH = "/sys/bus/iio/devices/iio:device0"
def read_file(filepath):
"""辅助函数:读取文件内容并去除空格"""
try:
with open(filepath, 'r') as f:
return f.read().strip()
except FileNotFoundError:
return None
except PermissionError:
return "权限错误"
def get_adc_values():
# 1. 读取比例因子 (scale)
# 这个值通常是 mV/LSB,意味着 raw * scale = mV
scale_str = read_file(os.path.join(IIO_PATH, "in_voltage_scale"))
if not scale_str:
print("错误:无法读取 scale 文件或路径不正确")
return
scale = float(scale_str)
# print(f"当前 Scale: {scale} mV") # 调试用
print(f"{'通道':<10} {'原始值 (Raw)':<15} {'电压 (mV)':<15} {'电压 (V)':<10}")
print("-" * 55)
# 2. 循环读取通道 0-7 (根据你的截图,有 in_voltage0_raw 到 in_voltage7_raw)
for i in range(8):
raw_file = f"in_voltage{i}_raw"
raw_path = os.path.join(IIO_PATH, raw_file)
raw_str = read_file(raw_path)
if raw_str and raw_str.isdigit():
raw_val = int(raw_str)
# 计算电压:Raw * Scale
voltage_mv = raw_val * scale
voltage_v = voltage_mv / 1000.0
print(f"Channel {i:<9} {raw_val:<15} {voltage_mv:<15.3f} {voltage_v:<10.3f}")
else:
# 有些通道可能悬空或未启用,读不到是正常的
print(f"Channel {i:<9} 不可用或未连接")
if __name__ == "__main__":
try:
while True:
# 清屏 (可选,让输出更整洁)
os.system('clear')
print(f"--- 读取时间: {time.strftime('%H:%M:%S')} ---")
get_adc_values()
time.sleep(1) # 每秒刷新一次
except KeyboardInterrupt:
print("\n程序已退出")运行结果如下:

我要赚赏金
