这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » 【FRDMDEVBOARDFORI.MX91测评】过程贴——ADC的使用

共1条 1/1 1 跳转至

【FRDMDEVBOARDFORI.MX91测评】过程贴——ADC的使用

菜鸟
2026-05-09 15:20:58     打赏

2过程贴——ADC的使用

这次来使用adc

image.png

开发板提供了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;
 }

编译后运行如下:

image-20260509113803711.png

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程序已退出")

运行结果如下:

image-20260509113851382.png




共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]