操作系统嵌入式物联网嵌入式OSRTOS【免费下载链接】rt-threadRT-Thread is an open source IoT Real-Time Operating System (RTOS). https://rt-thread.github.io/rt-thread/项目地址https://gitcode.com/gh_mirrors/rt/rt-thread点击查看免费下载本文以 RT-Thread 仓库中 Microchip SAM E54 BSP 的 ADC 同步驱动文档 为核心骨架结合 HAL 层接口、HPL 层实现 与 Atmel Start 配置头文件 等仓库源码系统讲解 ADC 的工作原理、差分/单端模式、分辨率与增益、窗口监视、参考电压选择、单次/自由运行两种转换模式以及基于adc_sync_descriptor的完整同步采样编程流程。读完本文你将能够在 SAM E54 平台上独立完成 ADC 的初始化、通道配置、阻塞式采样读数与窗口越限监测并可迁移到仓库中同系列的其他 Microchip BSP如 SAM C21、SAM E70、SAM L10。ADC 同步驱动简介ADCAnalog-to-Digital Converter模数转换器将模拟信号转换为数字值。其核心思想是把已知电压电平的参考信号量化为大小相等的若干分块每个分块对应一个从 0 到该 ADC 位分辨率所能表示的最大值的数字值。ADC 测量的输入电压与这些分块逐一比较电压电平最接近的那个分块所对应的数字值就是该模拟输入电压的数字表示。同步sync驱动意味着采样流程是阻塞式的调用方发起转换后驱动通过轮询转换完成标志等待结果就绪然后读取转换结果返回。这与基于中断/回调的异步async驱动、以及基于 DMA 的驱动是互补的三种形态仓库中对应的头文件分别为 hpl_adc_sync.h、hpl_adc_async.h 和 hpl_adc_dma.h。核心概念与工作原理单端模式与差分模式通常 ADC 可以工作在差分模式differential mode或单端模式single-ended mode差分模式两个信号 V 和 V- 相互比较得到的数字值表示 V 与 V- 之间的相对电压差。如果 V 上的输入电压低于 V-数字值为负这意味着在差分模式下会损失 1 位用于符号位。单端模式只将 V 与参考电压比较得到的数字值只能为正但可以使用 ADC 的全部位宽范围。在 HAL 层差分/单端的选择通过 adc_sync_set_channel_differential_mode() 完成其枚举定义于 hpl_adc_sync.henum adc_differential_mode { ADC_DIFFERENTIAL_MODE_SINGLE_ENDED 0, ADC_DIFFERENTIAL_MODE_DIFFERENTIAL };底层实现位于 hpl_adc.c选择差分模式时置位INPUTCTRL.DIFFMODE位否则清除该位。单端模式下负输入通常应接内部地MUXNEG配置为0x18这在 hpl_adc_config.h 的默认配置中已体现。分辨率与转换时间ADC 通常支持多种分辨率降低分辨率可以减少转换时间但会损失精度。SAM E54 的 ADC 支持 8/10/12/16 位四种分辨率通过 adc_sync_set_resolution() 设置底层写入CTRLB.RESSEL位段见 hpl_adc.c。需要注意的是16 位分辨率必须配合硬件平均averaging功能使用。从 hpl_adc_config.h 可以看到分辨率的取值说明RESSEL 值分辨率说明0x012-bit默认精度档位0x116-bit必须启用平均功能SAMPLENUM 00x210-bit较高转换速度0x38-bit最高转换速度精度最低分辨率还直接决定同步读数的数据宽度。在 hpl_adc.c 中_adc_sync_get_data_size()根据CTRLB.RESSEL是否为 8 位返回 1 或 2字节该值在 hal_adc_sync.c 的adc_sync_read_channel()中用于校验缓冲区长度是否与数据宽度对齐。增益级Gain Stage部分 ADC 在输入线上带有增益级可用来扩大动态范围。默认增益通常为 x1意味着转换范围为 0V 到参考电压。应用可以修改增益来扩大或缩小转换范围。SAM E54 的 HAL 提供了 adc_sync_set_channel_gain() 接口但在当前仓库的 HPL 实现中该函数为空操作见 hpl_adc.c可以推断 SAM E54 的 ADC 通过增益校正寄存器GAINCORR与数字校正逻辑CTRLB.CORREN来补偿增益误差而非物理可编程增益放大器。若需使用增益调整应参考具体型号数据手册确认硬件能力。窗口模式Window Mode窗口模式允许将转换结果与一组预定义阈值比较。应用可以使用回调函数监视转换结果是否超过预定义阈值。窗口模式下的典型应用是过压/欠压监测。窗口模式相关 API 包括adc_sync_set_window_mode()设置窗口监视模式底层写入CTRLB.WINMODE见 hpl_adc.c。adc_sync_set_thresholds()设置上下阈值底层分别写入WINLT与WINUT寄存器见 hpl_adc.c。adc_sync_get_threshold_state()查询当前是否处于越限状态底层读取中断标志位WINMON见 hpl_adc.c。在 Atmel Start 配置中窗口监视模式共有五种取值hpl_adc_config.hWINMODE 值含义0x0无窗口模式0x1Mode 1结果高于下限阈值0x2Mode 2结果低于上限阈值0x3Mode 3结果在下限与上限之间窗口内0x4Mode 4结果在下限与上限之外窗口外上下阈值均为 16 位值范围 065535WINLT、WINUT。文档特别强调启用窗口监视时ADC 应设置为自由运行模式以保证转换结果持续更新并被窗口比较逻辑实时检查。参考电压Reference VoltageADC 通常支持多种参考电压包括内部参考与不同电平的外部参考。参考电压会影响精度选择时应覆盖模拟输入信号的完整范围且绝不能小于预期的最大输入电压——否则超出参考的信号将发生削波。SAM E54 支持的参考源在 hpl_adc_config.h 中列出REFSEL 值参考源注意事项0x0内部带隙参考Internal bandgap reference电压较低0x21/2 VDDANA仅当 VDDANA 2.0V 时可用0x3VDDANA默认值0x4外部参考 A外接参考引脚0x5外部参考 B外接参考引脚0x6外部参考 C外接参考引脚运行时可通过 adc_sync_set_reference() 动态切换参考源。其底层实现 hpl_adc.c 中的_adc_set_reference_source()会先关闭 ADC 使能写入REFCTRL.REFSEL位段后再恢复使能状态以保证参考切换期间 ADC 处于安全状态。两种转换模式单次转换与自由运行ADC 支持两种转换模式单次转换模式Single shot应用触发时 ADC 只执行一次转换。触发后转换完成、结果就绪后即停止。自由运行模式Free running从被触发开始持续不断地进行转换直到应用显式停止。当启用窗口监视时ADC 应设为自由运行模式。转换模式通过 adc_sync_set_conversion_mode() 设置枚举定义于 hpl_adc_sync.henum adc_conversion_mode { ADC_CONVERSION_MODE_SINGLE_CONVERSION 0, ADC_CONVERSION_MODE_FREERUN };底层实现见 hpl_adc.c选择ADC_CONVERSION_MODE_FREERUN时置位CTRLB.FREERUN位否则清除。自由运行模式的默认配置则通过hpl_adc_config.h中的CONF_ADC_0_FREERUN宏默认 0在初始化阶段写入。驱动特性Features根据原文档本同步驱动提供以下特性初始化与去初始化adc_sync_init()/adc_sync_deinit()支持多种转换模式单次Single或自由运行Free run启动 ADC 转换adc_sync_read_channel()内部自动触发转换读取转换结果adc_sync_read_channel()阻塞式读取此外从 hal_adc_sync.h 的完整 API 清单可以看到驱动还提供通道使能/禁用、参考源设置、分辨率设置、输入源设置、差分模式设置、增益设置、窗口模式与阈值设置、阈值状态查询、转换完成状态查询以及版本查询adc_sync_get_version()等接口。典型应用场景Applications原文档列出的典型应用包括内部传感器测量如 MCU 内部温度传感器值对应 MUXPOS 输入源的 PTAT/CTAT 温度参考见 hpl_adc_config.h。外部传感器测量如温度、湿度传感器输出信号。信号采样与测量如正弦波、方波等波形信号采集。这些场景在驱动初始化时可通过 MUXPOS/MUXNEG 选择不同的输入源。SAM E54 的正输入可选择的内部源包括 1/4 缩放的核电源0x18、1/4 缩放的 VBAT0x19、1/4 缩放的 I/O 电源0x1A、带隙电压0x1B、PTAT 温度参考0x1C、CTAT 温度参考0x1D以及 DAC 输出0x1E外部则支持 AIN0AIN15 引脚见 hpl_adc_config.h。同步采样的完整编程流程第一步通过 Atmel Start 配置生成初始化代码SAM E54 BSP 的驱动初始化代码由 Atmel Start 自动生成核心初始化流程位于 driver_init.cstruct adc_sync_descriptor ADC_0; void ADC_0_PORT_init(void) { /* 引脚复用配置 */ } void ADC_0_CLOCK_init(void) { /* GCLK 时钟配置 */ } void ADC_0_init(void) { ADC_0_CLOCK_init(); ADC_0_PORT_init(); adc_sync_init(ADC_0, ADC0, (void *)NULL); }adc_sync_init()的底层实现 hpl_adc.c 中的_adc_sync_init()会将硬件实例指针存入描述符根据硬件地址计算 ADC 实例序号_adc_get_hardware_index()ADC0/ADC1 通过地址差 10区分查找对应的静态配置表_adcs[]执行_adc_init()完成软件复位、写入出厂校准值CALIB寄存器中的 BIASREFBUF/BIASR2R/BIASCOMP 熔丝值、并按ADC_CONFIGURATION(n)宏展开的配置逐寄存器写入CTRLB、REFCTRL、EVCTRL、INPUTCTRL、AVGCTRL、SAMPCTRL、WINLT、WINUT、GAINCORR、OFFSETCORR、DBGCTRL、CTRLA见 hpl_adc.c。可见 hpl_adc_config.h 中所有CONF_ADC_0_*宏构成了硬件初始化时的完整寄存器映像修改该配置文件或重新生成 Atmel Start 工程即可调整默认分辨率、参考源、预分频、自由运行、输入通道等参数。第二步使能通道并同步读数仓库自带的 ADC 使用示例位于 driver_examples.cvoid ADC_0_example(void) { uint8_t buffer[2]; adc_sync_enable_channel(ADC_0, 0); while (1) { adc_sync_read_channel(ADC_0, 0, buffer, 2); } }这段示例揭示了同步读数的关键调用链其底层实现在 hal_adc_sync.c 的adc_sync_read_channel()中校验描述符、缓冲区与长度参数非空通过_adc_sync_get_data_size()获取数据宽度并断言length能被数据宽度整除循环执行_adc_sync_convert()置位SWTRIG.START软件触发位发起转换见 hpl_adc.c→ 忙等_adc_sync_is_channel_conversion_done()轮询RESRDY结果就绪中断标志见 hpl_adc.c→_adc_sync_read_channel_data()读取RESULT寄存器见 hpl_adc.c并按小端序写入缓冲区数据宽度为 2 字节时低位在前、高位在result 8返回实际读入的字节数。对于 12/16 位分辨率2 字节数据宽度buffer需至少 2 字节8 位分辨率下则为 1 字节。若分辨率与缓冲区长度不匹配ASSERT(!(length % data_size))会在开发阶段直接暴露问题。第三步完整的多功能配置示例将上述 API 组合起来一个典型的单端、自由运行 窗口监视配置流程如下#include hal_adc_sync.h #include driver_init.h extern struct adc_sync_descriptor ADC_0; void adc_config_demo(void) { adc_threshold_status_t state; /* 选择参考源VDDANA默认 0x3 */ adc_sync_set_reference(ADC_0, 0x3); /* 设置分辨率16-bit需启用平均或 12-bit */ adc_sync_set_resolution(ADC_0, 0x0); /* 12-bit */ /* 设置正输入 AIN0负输入内部地单端 */ adc_sync_set_inputs(ADC_0, 0x00, 0x18, 0); /* 单端模式 */ adc_sync_set_channel_differential_mode(ADC_0, 0, ADC_DIFFERENTIAL_MODE_SINGLE_ENDED); /* 窗口监视要求自由运行模式 */ adc_sync_set_conversion_mode(ADC_0, ADC_CONVERSION_MODE_FREERUN); /* 启用窗口模式 3结果在窗口内触发 */ adc_sync_set_window_mode(ADC_0, 0x3); adc_sync_set_thresholds(ADC_0, 100, 900); /* 使能 ADC */ adc_sync_enable_channel(ADC_0, 0); while (1) { /* 轮询阈值状态true 表示转换结果落在上下阈值之间 */ adc_sync_get_threshold_state(ADC_0, state); } }依赖、并发与限制说明原文档补充的工程属性如下Dependencies依赖ADC 硬件本身。从实现看驱动还间接依赖hpl_adc_config.h生成的静态配置、GCLK 时钟配置peripheral_clk_config.h以及utils_assert.h提供的断言宏。Concurrency并发N/A。可以理解为该驱动未内置并发保护同步接口本身是阻塞式的使用时应注意避免在多个任务/中断上下文同时操作同一 ADC 描述符。Limitations限制N/A。Known issues and workarounds已知问题与规避方法N/A。驱动版本驱动通过 adc_sync_get_version() 返回当前驱动版本号实现在 hal_adc_sync.c 中当前版本常量为DRIVER_VERSION 0x00000001u对应 HPL 层文档标注的 v1.0.0 Initial Release。小结ADC 同步驱动为 SAM E54 平台提供了一套简洁的阻塞式模拟采样方案通过 hal_adc_sync.h 暴露的十余个 API开发者可以完成从初始化、通道配置、分辨率/参考/增益选择、差分/单端切换、窗口监视到最终读数的全部工作底层 hpl_adc.c 将这些调用一一映射到 SAM E54 ADC 外设的寄存器操作上配合 hpl_adc_config.h 的静态配置实现配置即初始化。在自由运行模式下结合窗口监视还能以极少的 CPU 开销实现持续的越限检测非常适合内部温度采样、外部传感器读取与波形采集等典型物联网与工业控制场景。赞分享操作系统嵌入式物联网嵌入式OSRTOS【免费下载链接】rt-threadRT-Thread is an open source IoT Real-Time Operating System (RTOS). https://rt-thread.github.io/rt-thread/项目地址https://gitcode.com/gh_mirrors/rt/rt-thread点击查看免费下载相关推荐RT-Thread 微芯 SAML10 BSP 之 ADC 同步驱动hal_adc_sync开发指南RT Thread 微芯 SAML10 BSP 之 ADC 同步驱动hal_adc_sync开发指南 本文以 bsp/microchip/saml10/bs操作系统嵌入式物联网嵌入式OSRTOSBackstage Kubernetes 后端代理端点Proxy Endpoint完全指南从 REST API 透传到权限管控Backstage Kubernetes 后端代理端点Proxy Endpoint完全指南从 REST API 透传到权限管控 导读 Backstage操作系统嵌入式物联网嵌入式OSRTOSRT-Thread 中 Microchip SAM E70 ADC 同步驱动adc_sync详解工作原理、HAL API 与实战采样RT Thread 中 Microchip SAM E70 ADC 同步驱动adc_sync详解工作原理、HAL API 与实战采样 本文以 RT Thr操作系统嵌入式物联网嵌入式OSRTOS上一篇解密Phi-4-da8w8-torchao-v0.16.0架构Phi3ForCausalLM模型细节与参数配置下一篇终极指南OpCore Simplify如何让黑苹果配置从复杂到简单创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
