当前位置: 首页 > backend >正文

HC32L190 ADC采集

一、ADC AIN2 驱动

使用外接3.3V采集范围

二、代码

hd_adc.c

#include "hd_adc.h"
#include "bgr.h"
#include <stdio.h>#define FILTER_SIZE 16      // 滑动平均窗口
#define ADC_TIMEOUT 10000   // 超时计数限制// 初始化 ADC(阻塞模式,无中断)
void Hd_ADC_Init(void)
{stc_adc_cfg_t stcAdcCfg;Gpio_SetAnalogMode(GpioPortA, GpioPin2);  // PA02 -> AIN2Sysctrl_SetPeripheralGate(SysctrlPeripheralAdcBgr, TRUE);Bgr_BgrEnable();  // 启用内部基准,提高精度stcAdcCfg.enAdcMode         = AdcSglMode;stcAdcCfg.enAdcClkDiv       = AdcMskClkDiv2;stcAdcCfg.enAdcSampCycleSel = AdcMskSampCycle12Clk;stcAdcCfg.enAdcRefVolSel    = AdcMskRefVolSelAVDD; // 使用外部3.3V作为参考stcAdcCfg.enAdcOpBuf        = AdcMskBufDisable;stcAdcCfg.enInRef           = AdcMskInRefEnable;stcAdcCfg.enAdcAlign        = AdcAlignRight;Adc_Init(&stcAdcCfg);Adc_CfgSglChannel(AdcExInputCH2);  // AIN2 通道
}// 单次阻塞式采集(带超时)
uint16_t Adc_Read(void)
{Adc_SGL_Start();  // 启动采样uint32_t timeout = 0;while (!Adc_GetIrqStatus(AdcMskIrqSgl)) {if (++timeout > ADC_TIMEOUT)return 0xFFFF;  // 超时}uint16_t result = Adc_GetSglResult();Adc_ClrIrqStatus(AdcMskIrqSgl); // 清中断标志return result;
}// 增量滑动平均滤波器(适合电压变化缓慢)
uint16_t Adc_FilteredRead(void)
{static uint16_t buffer[FILTER_SIZE] = {0};static uint8_t index = 0;static uint32_t sum = 0;static uint8_t filled = 0;uint16_t raw = Adc_Read();if (raw == 0xFFFF) return 0xFFFF;// 减去旧值,加上新值sum -= buffer[index];sum += raw;buffer[index] = raw;index = (index + 1) % FILTER_SIZE;if (filled < FILTER_SIZE) filled++;return sum / filled;
}

hd_adc.h

#ifndef HD_ADC_H
#define HD_ADC_H#include "adc.h"
#include "gpio.h"
#include "bgr.h"void Hd_ADC_Init(void);
uint16_t Adc_Read(void);
uint16_t Adc_FilteredRead(void);#endif

task

/*********************** 电量任务框架 ************************/
static void vAdcTask(void *pvParameters)
{Hd_ADC_Init();          //ADC初始化while(1){uint16_t filtered = Adc_FilteredRead();if (filtered != 0xFFFF) {float voltage = (filtered / 4095.0f) * 3.3f;printf("\rADC: %d (%.3f V)", filtered, voltage);}vTaskDelay(pdMS_TO_TICKS(3000)); // 1Hz 检测频率}
}

三、效果图

http://www.xdnf.cn/news/6740.html

相关文章:

  • firewall防火墙
  • 前端方法的总结及记录
  • 隧道结构安全在线监测系统解决方案
  • 探秘雷克赛恩生产基地:解码国产投影技术深耕之路
  • 动态规划-63.不同路径II-力扣(LeetCode)
  • 操作系统知识总结
  • 丝杆升降机最大载荷的工程力学解析与选型实践
  • 懒汉式单例模式的线程安全实现
  • ros2中自定义的package查不到?
  • 事件响应策略规范模版
  • 基于Unity的简单2D游戏开发
  • [特殊字符] 如何优雅地避免 SQL 多表 LEFT JOIN 造成的笛卡尔积放大问题?
  • springboot连接高斯数据库(GaussDB)踩坑指南
  • 杰理ac696配置mic
  • 二水平设计的单次重复
  • 【Shell的基本操作】
  • jvm第一篇《内存与垃圾回收》学习笔记第一章jvm初始
  • 电平匹配电路
  • windows下找出时间大于某时间的附件
  • JavaScript - JavaScript 运算符之圆括号运算符与方括号运算符(圆括号运算符概述、圆括号运算符用法、方括号运算符概述、方括号运算符用法)
  • 最新开源 TEN VAD 与 Turn Detection 让 Voice Agent 对话更拟人 | 社区来稿
  • [ linux-系统 ] 进程优先级 | Linux内核O(1)算法
  • 解决uni-app开发中的“TypeError: Cannot read property ‘0‘ of undefined“问题
  • 51单片机的lcd12864驱动程序
  • 裸金属服务器和云服务器之间的差别
  • ansible进阶06
  • NX二次开发C#---遍历当前工作部件实体并设置颜色
  • SQL练习(6/81)
  • 【Linux】Linux安装并配置MongoDB
  • 游戏引擎学习第285天:“Traversables 的事务性占用”