1. ADC是模数转换器转换器 的供应商的英文简称,是一种能将模拟信号转变为数字信号的电子元件。通常是将信号采样并保持以后,再进行量化和编码,这两个过程是在转化的同时实现的。

分辨率-说明AD对输入信号的分辨能力,及数值部分的精度。一般模拟采样中使用16位还是24位的AD芯片说的就是分辨率.
例如:输入模拟电压的变化范围为0~3.3 V,输出16位二进制数可以分辨的最小模拟电压为3.3V / 216=0.05 mV;

  1. 转化误差-表示AD实际电压与理论电压的偏差,一般用最低有效位来表示,单位LSB,通常以相对误差的形式出现,比如相对误差≤±LSB/2,表明实际输出的数字量和理论量误差小于最低位的一半。

转换精度-这里一般用转化误差和分辨率来表述,具体就是AD最大量化过程中采用了四舍五入的方法及模拟处理部分的精度问题。

转化时间-即从信号输入开始到输出稳定的信号所经过的时间。不同的AD准换的速度不同,根据实际要求来选型。

工作电压和基准电压(内部或者外部基准):工作电压是AD芯片工作的额定电压,关键的是基准电压,又叫参考电压,可以来之芯片内部又或者外部接入,其决定了AD的分辨率,所有基准电压一定要稳。

模块简介

本芯片内部集成了一个 12 位高精度、高转换速率的逐次逼近(SAR)型模数转换器(ADC)模块。具
有以下特性:
⚫ 12 位转换精度
⚫ 1Msps 转换速度
⚫ 8 路转换通道:7 个引脚通道、1 个 VCAP 校准通道
⚫ 参考电压(Refence Voltage)为电源电压
⚫ ADC 的电压输入范围:0-VREF
⚫ 3 种转换模式:单次转换、连续转换、累加转换
⚫ ADC 的转换速率软件可配
⚫ 支持片内及外设中断自动触发 ADC 转换启动,有效降低芯片功耗、提高转换实时性

/********************************************************************************
* @file    bsp_adc.c
* @author  jianqiang.xue
* @version V1.0.0
* @date    2021-04-10
* @brief   NULL
********************************************************************************//* Includes ------------------------------------------------------------------*/
#include "RTE_Components.h"
#include CMSIS_device_header#include "bsp_gpio.h"
#include "bsp_exti.h"
#include "bsp_adc.h"/* Private Includes ----------------------------------------------------------*/
#include "business_gpio.h"
#include "business_function.h"/* Private Define ------------------------------------------------------------*/
#define ADC0_CH_NUM                   8#define CH_NUM  (BS_ADC0_CH0 + BS_ADC0_CH1 + BS_ADC0_CH2 + BS_ADC0_CH3 + BS_ADC0_CH4 + BS_ADC0_CH5 + BS_ADC0_CH6 + BS_ADC0_CH7)
/* Private Variables ---------------------------------------------------------*/
// ADC初始化状态(0--deinit 1--init)
static bool g_adc_init = false;
// ADC采集数据存储buff
uint16_t bsp_adc0_val[ADC0_CH_NUM] = {0};// 定义ADC采集完毕回调函数
typedef void(*bsp_adc0_callback)(void);
static bsp_adc0_callback irq_callback;/****************结构体定义****************/
#if BS_ADC0_EN
ADC_HandleTypeDef adc0_handle_t =
{.Instance                = BS_ADC0_BASE,.Init.SamplingTime       = ADC_SAMPLE_8CYCLE,           // 采样周期.Init.ClkSel             = ADC_CLOCK_PCLK_DIV32,        // ADC时钟分频.Init.SingleContinueMode = ADC_MODE_CONTINUE,           // 连续转换模式.Init.NbrOfConversion    = BS_ADC0_SAMPLING_TIMES,      // 连续转换次数.Init.AutoAccumulation   = ADC_AUTOACC_DISABLE,         // 禁止ADC转换结果自动累加.Init.CircleMode         = ADC_MULTICHANNEL_NONCIRCLE,  // 禁止ADC循环转换模式.Init.ExternalTrigConv1  = ADC_SOFTWARE_START,          // 禁用自动触发ADC转换
};
#endif
/* External Variables --------------------------------------------------------*/
/* Public Function Prototypes ------------------------------------------------*/
#if BS_ADC0_EN
/*** @brief  ADC0初始化,并使能通道* @note   NULL* @retval None*/
void bsp_adc0_init(void)
{#if CH_NUMif (g_adc_init){return;}__HAL_RCC_ADC_CLK_ENABLE();// 使能通道adc0_handle_t.Init.ContinueChannelSel =
#if BS_ADC0_CH0ADC_CONTINUE_CHANNEL_0|
#endif
#if BS_ADC0_CH1ADC_CONTINUE_CHANNEL_1|
#endif
#if BS_ADC0_CH2ADC_CONTINUE_CHANNEL_2|
#endif
#if BS_ADC0_CH3ADC_CONTINUE_CHANNEL_3|
#endif
#if BS_ADC0_CH4ADC_CONTINUE_CHANNEL_4|
#endif
#if BS_ADC0_CH5ADC_CONTINUE_CHANNEL_5|
#endif
#if BS_ADC0_CH6ADC_CONTINUE_CHANNEL_6|
#endif
#if BS_ADC0_CH7ADC_CONTINUE_CHANNEL_7|
#endif0;HAL_ADC_Init(&adc0_handle_t);// ADC comparison settingsADC_ThresholdConfTypeDef adc0_threshold_conf_t;adc0_threshold_conf_t.ITMode          = DISABLE;adc0_threshold_conf_t.CompareMode     = ADC_COMP_THRESHOLD_NONE;      // 禁止 ADC比较中断控制HAL_ADC_ThresholdConfig(&adc0_handle_t, &adc0_threshold_conf_t);HAL_NVIC_SetPriority(BS_ADC0_IRQn, 2);HAL_NVIC_EnableIRQ(BS_ADC0_IRQn);       // 使能ADC中断g_adc_init = true;
#endif
}/*** @brief  ADC0功能关闭,并移除* @note   NULL* @retval None*/
void bsp_adc0_deinit(void)
{#if CH_NUMif (!g_adc_init){return;}HAL_NVIC_DisableIRQ(BS_ADC0_IRQn);      // 关闭ADC中断HAL_ADC_DeInit(&adc0_handle_t);g_adc_init = false;
#endif
}/*** @brief  ADC0 启动采样功能* @note   NULL* @retval None*/
void bsp_adc0_start(void)
{#if CH_NUMif (!g_adc_init){return;}HAL_ADC_Start_IT(&adc0_handle_t);    // 启动ADC中断转换
#endif
}#else
void bsp_adc0_init(void)
{}void bsp_adc0_deinit(void)
{}void bsp_adc0_start(void)
{}
#endif/*** @brief  Initializes the ADC MSP.* @param  hadc: ADC handle* @retval None*/
void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
{#if BS_ADC0_CH0BS_ADC0_CH0_GPIO_CLK_ENABLE();bsp_gpio_init_adc(BS_ADC0_CH0_GPIO_PORT, BS_ADC0_CH0_PIN);
#endif
#if BS_ADC0_CH1BS_ADC0_CH1_GPIO_CLK_ENABLE();bsp_gpio_init_adc(BS_ADC0_CH1_GPIO_PORT, BS_ADC0_CH1_PIN);
#endif
#if BS_ADC0_CH2BS_ADC0_CH2_GPIO_CLK_ENABLE();bsp_gpio_init_adc(BS_ADC0_CH2_GPIO_PORT, BS_ADC0_CH2_PIN);
#endif
#if BS_ADC0_CH3BS_ADC0_CH3_GPIO_CLK_ENABLE();bsp_gpio_init_adc(BS_ADC0_CH3_GPIO_PORT, BS_ADC0_CH3_PIN);
#endif
#if BS_ADC0_CH4BS_ADC0_CH4_GPIO_CLK_ENABLE();bsp_gpio_init_adc(BS_ADC0_CH4_GPIO_PORT, BS_ADC0_CH4_PIN);
#endif
#if BS_ADC0_CH5BS_ADC0_CH5_GPIO_CLK_ENABLE();bsp_gpio_init_adc(BS_ADC0_CH5_GPIO_PORT, BS_ADC0_CH5_PIN);
#endif
#if BS_ADC0_CH6BS_ADC0_CH6_GPIO_CLK_ENABLE();bsp_gpio_init_adc(BS_ADC0_CH6_GPIO_PORT, BS_ADC0_CH6_PIN);
#endif
// #if BS_ADC0_CH7
//     BS_ADC0_CH7_GPIO_CLK_ENABLE()
//     bsp_gpio_init_adc(BS_ADC0_CH7_GPIO_PORT, BS_ADC0_CH7_PIN);
// #endif
}#if BS_ADC0_CH0
void HAL_ADC_MultiChannel0_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{if (hadc->Instance == BS_ADC0_BASE){bsp_adc0_val[0] = HAL_ADC_GetValue(hadc, ADC_CONTINUE_CHANNEL_0);}
}
#endif#if BS_ADC0_CH1
void HAL_ADC_MultiChannel1_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{if (hadc->Instance == BS_ADC0_BASE){bsp_adc0_val[1] = HAL_ADC_GetValue(hadc, ADC_CONTINUE_CHANNEL_1);}
}
#endif#if BS_ADC0_CH2
void HAL_ADC_MultiChannel2_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{if (hadc->Instance == BS_ADC0_BASE){bsp_adc0_val[2] = HAL_ADC_GetValue(hadc, ADC_CONTINUE_CHANNEL_2);}
}
#endif#if BS_ADC0_CH3
void HAL_ADC_MultiChannel3_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{if (hadc->Instance == BS_ADC0_BASE){bsp_adc0_val[3] = HAL_ADC_GetValue(hadc, ADC_CONTINUE_CHANNEL_3);}
}
#endif#if BS_ADC0_CH4
void HAL_ADC_MultiChannel4_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{if (hadc->Instance == BS_ADC0_BASE){bsp_adc0_val[4] = HAL_ADC_GetValue(hadc, ADC_CONTINUE_CHANNEL_4);}
}
#endif#if BS_ADC0_CH5
void HAL_ADC_MultiChannel5_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{if (hadc->Instance == BS_ADC0_BASE){bsp_adc0_val[5] = HAL_ADC_GetValue(hadc, ADC_CONTINUE_CHANNEL_5);}
}
#endif#if BS_ADC0_CH6
void HAL_ADC_MultiChannel6_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{if (hadc->Instance == BS_ADC0_BASE){bsp_adc0_val[6] = HAL_ADC_GetValue(hadc, ADC_CONTINUE_CHANNEL_6);}
}
#endif#if BS_ADC0_CH7
void HAL_ADC_MultiChannel7_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{if (hadc->Instance == BS_ADC0_BASE){bsp_adc0_val[7] = HAL_ADC_GetValue(hadc, ADC_CONTINUE_CHANNEL_7);}
}
#endif/*** @brief  [重定义] ADC采样完毕回调函数* @note   NULL* @param  hadc: ADC handle* @retval None*/
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{if (hadc->Instance == BS_ADC0_BASE){if (irq_callback){irq_callback();}}
}/*** @brief  得到ADC0采样值* @note   NULL* @param  ch_num: 通道值* @retval 通道对应的ADC值*/
uint16_t bsp_adc0_get_ch_val(uint8_t ch_num)
{if (ch_num >= ADC0_CH_NUM){return 0xFFFF;}return bsp_adc0_val[ch_num];
}/*** @brief  注册ADC0采样完毕回调函数* @note   NULL* @param  *event: 绑定回调事件* @retval 0--失败 1--成功*/
bool bsp_adc0_irq_callback(void *event)
{if (irq_callback != NULL){return false;}else{irq_callback = (bsp_adc0_callback)event;}return true;
}
/********************************************************************************
* @file    bsp_adc.h
* @author  jianqiang.xue
* @version V1.0.0
* @date    2021-04-10
* @brief   ADC操作
********************************************************************************/#ifndef __BSP_ADC_H
#define __BSP_ADC_H/* Includes ------------------------------------------------------------------*/
#include <stdint.h>
#include <stdbool.h>/* Public Function Prototypes -----------------------------------------------*/void bsp_adc0_init(void);
void bsp_adc0_deinit(void);void bsp_adc0_start(void);uint16_t bsp_adc0_get_ch_val(uint8_t ch_num);bool bsp_adc0_irq_callback(void *event);#endif

[单片机框架][bsp层][cx32l003][bsp_adc] ADC配置和使用相关推荐

  1. [单片机框架][bsp层][N32G4FR][bsp_uart] UART配置和使用

    USART 简介 通用同步异步收发器(USART)是一种全双工或半双工,同步或异步的一个串行数据交换接口.USART 提 供了可编程的波特率发生器,能对系统时钟进行分频产生 USART 发送和接收所需 ...

  2. [单片机框架][bsp层][nrf52832][nrf52840][nrf52810][nrf52820][ESB(2.4G)] ESB(2.4G)使用说明

    这个指南描述了什么是ESB(Enhanced ShockBurst)以及如何在nRF5系列中使用ESB. ESB支持双向数据包通信,包括数据包缓冲,数据包确认和丢失数据包的自动重传的基本协议.ESB提 ...

  3. [单片机框架][drivers层][cw2015/ADC] fuelgauge 硬件电量计和软件电量计(一)

    接上一篇:[单片机框架][device层] fuelgauge 电量计 CW2015 是一款超紧凑.低成本.主机侧/电池组侧.无传感电阻器的电量计量系统 IC,适用于手持和便携式设备中的锂离子 (Li ...

  4. [单片机框架][drivers层][cw2015] fuelgauge 硬件电量计(二)

    接上一篇:[单片机框架][device层] fuelgauge 电量计 [单片机框架][drivers层][cw2015] fuelgauge 硬件电量计(一) 本章是硬件电量计的使用方法,采用IIC ...

  5. [单片机框架][device层] fuelgauge 电量计

    通过 DEVICE_INITCALL("dev-gauge", fuelgauge_dev_init); 注册驱动,自动在main初始化中运行. 优点:耦合少,可移植性强,适用大团 ...

  6. [单片机框架][drivers层][extend_16ch] 16位恒流驱动芯片 MBI5020 JXI5020GP

    文章目录 一.简介 二.特性 三. 示例代码 一.简介 4pin控制16ping,IO扩展器件 二.特性 16 个等电流输出通道 等电流输出值不受输出端负载电压影响等电流范围值, 3-30mA@VDp ...

  7. [单片机框架] [kv_sys] 实现一个简易KV键值系统(升级版)

    [单片机框架] [kv_sys] 实现一个简易KV键值系统 Env 小型KV数据库,支持 写平衡(磨损平衡) 及掉电保护模式 让Flash变为NoSQL(非关系型数据库)模型的小型键值(Key-Val ...

  8. [单片机框架] [app_led] [WS2812x] 利用软定时器实现WS2812x闪烁和呼吸等灯光模式

    引脚编号 引脚名称 说明 1 DO 控制数据信号输出端 2 DI 控制数据信号输入端 3 VCC 控制电路电源正极 4 NC 空脚 5 VDD LED电源正极 6 VSS 电源负极 数据时序图 0,1 ...

  9. 了解JESD204B规范的各层—— 从高速ADC的角度出发

    本文内容来自ADI的技术文章,作者:Jonathan Harris 原网址为:https://www.analog.com/cn/technical-articles/understanding-la ...

最新文章

  1. AssetBundle Workflow
  2. 《WTM送书活动:向更遥远的星辰大海起航~》
  3. oracle查看登录时间黑屏,oracle 11g默认用户名、密码解锁 以及安装后重启黑屏问题.doc...
  4. linux mysql phpadmin_Linux系统下安装phpmyadmin方法
  5. Pytorch学习笔记总结
  6. java购物系统需求分析_java网上购物系统需求分析报告.doc
  7. 企鹅智库发布《2019-2020中国互联网趋势报告》
  8. 在Pycharm中,全文搜索、替换,以及单独文件搜索、替换!
  9. 微信小程序如何保存图片到相册
  10. Excel VBA之类模块 实例
  11. 1.3【展讯平台】Android 驱动(Kernel)、系统(framework) 定制,调试日志
  12. 【国产化系列】龙芯平台指令集简介及现有处理器的支持特性
  13. OpenAI 推出漏洞赏金计划,最高奖励 2 万美元;京东零售开启 5 年来最大组织变革;​Django 4.2|极客头条
  14. 项目专题 1: 结构化方法学自动取款机系统(ATM)分析
  15. 概念:COW与MOR
  16. python什么意思v_vpython是什么
  17. day01计算机基础知识Java语言基础
  18. 电子技术——系统性分析反馈电压放大器
  19. 日本最大的社交APP Line的服务架构(1)
  20. PDF页面顺序可以改吗?怎么重新排序?

热门文章

  1. 国考省考申论:2次阅读法:1读感知材料类型和段落关系,2读根据问题词,原因词,影响词,对策词,关联词把握得分要点
  2. 嘉洋独家观点:关于近期股市的详解
  3. 自媒体短视频快速吸引粉丝的诀窍
  4. Hive 如何设置ReduceTask的数量
  5. Go语言并发安全与锁
  6. 记Aspose.Word的使用中出现的问题
  7. dfs-全排列(UPC-方案数)
  8. 感谢谦哥的家族为中国相声事业做出了贡献。
  9. 统计自然语言处理梳理二:句法分析
  10. 【洛谷】P1593 因子和