目录

1.基础概念

2.原理:ADC采样过程分为四步:采样、保持、量化、编码。

3.采样定理

4.采样保持放大器(SHA)

5.ADC电压值转换

6.ADC轮询采样


1.基础概念

ADC 全称:Analog-to-Digital Converter,指模拟/数字转换器,就是将模拟信号转换成数字信号

①模拟信号:是连续变化的,具有电路简单,分辨率很高的特点,抗噪声能力弱

②数字信号:是离散变化的,抗噪声能力强,便于存储和交换,可用于加密

2.原理:ADC采样过程分为四步:采样、保持、量化、编码。

①采样是指将模拟波形在时域上进行切分,每个切片大小大致等于原来的波形的值,这过程往往回丢失一些信息

②采样保持:如果被采样的模拟信号的变化频率相对于A/D转换器的速度来说比较高,为保证转换精度,需要在A/D转换之前加上采样保持电路,使得在A/D转换期间保持输入模拟信号不变。

③量化:在采样完后给每个时间片分配一个数字,这样的过程称为量化

④编码: 量化后的数值还需通过编码用一个二进制代码表示出来,经过编码后得到的就是AD转换结果的数字量,二进制编码的位宽等于ADC的位宽。

3.采样定理

又称奈奎斯特采样定理,即当采样频率fs大于采样信号最高频率fmax的两倍时,采样后的数字信号完整地保留了原始信号中的信息。公式 :fs>2*fn

4.采样保持放大器(SHA)

采样保持过程将已采样的模拟电压在一段必要的时间内保持恒定,以便让ADC将模拟电压转换成数字形式。

一个基本的SHA如图,开始的时候模拟开关闭合,通过输入缓冲放大器对模拟电压进行采样,电容C存储或保存采样电压一段时间,输出缓冲放大器提供一个高输入阻抗来防止电容快速掉电。ADI要求输出缓冲器的输入阻抗足够高,以便电容可以保持时间内放电少于1LSB

5.ADC电压值转换

1.首先确定ADC是几位的,即确定最大数值是多少。比如一个8位的ADC,最大值是0xFF,就是255。
(一般芯片手册会有说明)

2.然后确定最大值时对应的参考电压值。一般而言最大值对应3.3V。这个你需要看这个芯片ADC模块的说明。寄存器中有对于输入信号参考电压的设置。

3.计算电压,读取的ADC数值除以最大数值再乘以参考电压值。比如你ADC值为0x55,那么实际值就是0x55/(0xFF+1)*3.3V = 1.65V

4.验证计算值。你可以用电压表量一下对应的引脚,看看计算值和实际值是否一样。


/********************************************************//**        AT89C52+ADC0832+LCD1602                     **//**       用ADC0832采集电压,并在1602上显示电压值                  **//********************************************************/#include <reg52.h>#include <intrins.h>typedef unsigned int u16;typedef unsigned char u8;bit RW=0;sbit RS=P2^7;sbit EN=P2^6; sbit CLK=P1^0;sbit DIO=P1^1;sbit CS=P1^3;u8 len;u8 Display_Buffer[4];void LcdInit();void delay_us(u8 us);void delay_ms(u8 ms);void LcdDisplay(u8 x,u8 y, u8 *str);void LcdSetCursor(u8 x,u8 y);void LcdStar();void write_con(u8 con);void write_dat(u8 dat);u8 Get_AD_Result(){u8 i;u8 data1=0,data2=0;CS=0;//第一个下降沿到来前,DI需置1,起始控制位,开始转换CLK=0;DIO=1; _nop_();   CLK=1;_nop_();//第二个下降沿到来前,设D=1/0,选择单端/差分(SGL/DIF)模式中的单端输入模式CLK=0;DIO=1; _nop_();  CLK=1;       _nop_();     //第三个下降沿到来前,设D=0/1,选择CH0/CH1,这里选择单通道ch0  CLK=0;DIO=1; _nop_();   CLK=1;DIO=0; _nop_();  //第四个下降沿到来前,DI =1 CLK=0;DIO=1; _nop_();//4-11,共8个下降沿 DO输出转换信号,读取数据(MSB-->LSB) for(i=0;i<8;i++){CLK=1;_nop_();CLK=0;_nop_();data1=(data1<<1)|(u8)DIO;}//11-18,共8个下降沿,读取数据(LSB)-->MSB) for(i=0;i<8;i++){data2=data2|((u8)DIO<<i);CLK=1;_nop_();CLK=0;_nop_();}CS=1;//如果MSB-->LSB和LSB)-->MSB读取数据结果相同,返回读取结果,否则0return(data1==data2)?data1:0;}//-----------------------------------------//    主函数//-----------------------------------------void main(){u8 Data;LcdInit();LcdStar();while(1){//获取AD转换值 最大值255对应最高电压5.000v 显示三个数 使用500Data =Get_AD_Result()*500.0/255;Display_Buffer[0]= Data/100+'0'; Display_Buffer[1]= '.';Display_Buffer[2]=Data/10%10+'0'; Display_Buffer[3]=Data%10+'0';LcdDisplay(9,1, Display_Buffer);}}//-----------------------------------------//   延时us和1ms函数//-----------------------------------------void delay_us(u8 us){while(us--);}void delay_ms(u8 ms){while(ms--){delay_us(248);delay_us(248);}}//-----------------------------------------//    lcd1602显示//-----------------------------------------//lcd初始化void LcdInit(){write_con(0x01);//清屏write_con(0x38);//设置16*2显示,配置8位数据接口write_con(0x38);//设置16*2显示,配置8位数据接口write_con(0x0C);//开显示,光标关,闪烁关,去黑块write_con(0x06);//写数据时光标右移,画面不动}void LcdStar(){u8 code str[]="Voltage measure";u8 tab[]="Voltage=";LcdInit();                    //初始化1602液晶  LcdDisplay(1,0,str);LcdDisplay(1,1,tab);LcdDisplay(9,1,"...");        //默认初始化温度00LcdDisplay(13,1,"V");         //添加V电压}//设置显示RAM 起始地址,亦即光标位置,(x,y)对应屏幕上的起始坐标void LcdSetCursor(u8 x,u8 y){u8 addr;if(y==0)    //由输入的屏幕坐标计算显示RAM的地址addr=0x00+x;    //第一行字符地址从0x00起始elseaddr=0x40+x;    //第二行字符地址从0x40起始write_con(addr|0x80);   //设置RAM地址}//设置显示RAM 起始地址,亦即光标位置,(x,y)对应屏幕上的起始坐标,str-字符串指针void LcdDisplay(u8 x,u8 y,u8 *str){LcdSetCursor(x,y); //设置起始地址  while(*str !='\0')  //连续写入字符串数据,直到检测到结束符{write_dat(*str++);  //先取str指向的数据,然后str自加1delay_us(100);}}//lcd1602写指令void write_con(u8 con){P0=con;RS=0;RW=0;EN=1;delay_us(200);EN=0;}//lcd1602写数据void write_dat(u8 dat){P0=dat;RS=1;RW=0;EN=1;delay_us(200);EN=0;}

6.ADC轮询采样

在STM32 ADC轮询转换通道中,下一个通道开启时前一个通道不需要手动关闭,ADC会自动切换到下一个通道进行采集。

ADC轮询转换通道的原理和过程:

ADC(Analog-to-Digital Converter)是模拟信号转换为数字信号的电路。在STM32中,ADC是一个十分重要的外设,它可以将模拟信号转换为数字信号,供微处理器进行处理。

ADC的转换方式有多种,其中轮询转换通道是最基本的一种,它的原理是:在一次转换完成之后,自动切换到下一个通道进行采集,直到所有通道采集完成,然后产生一个转换结束的中断。

下面是一个简单的ADC轮询转换通道的代码示例:

  1. 初始化ADC模块:设置ADC通道和转换模式等参数,以及开启ADC时钟。

  2. 获取采样数据:通过设置ADC转换模式为单次转换或连续转换,轮流对3个通道进行采样,将采样结果存储到缓冲区中。

  3. 数据处理:将采样结果进行处理,比如进行滤波、校准等操作,得到最终的采样数据。

  4. 计算采样时间和定采样周期:采样时间是指从开始采样到采样结束所需的时间,可以通过软件延时或硬件定时器实现。采样周期是指两次采样之间的时间间隔,可以根据需要进行设置。

以下是采样的代码实现和注释:

复制#include "bf7006_adc.h"#define ADC_BUFFER_SIZE 16      // 缓冲区大小
#define ADC_SAMPLE_TIME 10      // 采样时间,单位为ms
#define ADC_SAMPLE_PERIOD 100   // 采样周期,单位为msstatic uint16_t adc_buffer[ADC_BUFFER_SIZE];   // 采样数据缓冲区
static uint8_t adc_buffer_index = 0;           // 缓冲区索引/*** @brief 初始化ADC模块*/
void adc_init(void)
{HAL_ADC_ConfigChannel(&hadc, ADC_CHANNEL_0, ADC_MODE_SINGLE);    // 配置ADC通道0为单次转换模式HAL_ADC_ConfigChannel(&hadc, ADC_CHANNEL_1, ADC_MODE_SINGLE);    // 配置ADC通道1为单次转换模式HAL_ADC_ConfigChannel(&hadc, ADC_CHANNEL_2, ADC_MODE_SINGLE);    // 配置ADC通道2为单次转换模式HAL_ADC_Start(&hadc);   // 开启ADC转换
}/*** @brief 获取采样数据*/
void adc_sample(void)
{HAL_ADC_Start(&hadc);   // 开始转换HAL_ADC_PollForConversion(&hadc, ADC_SAMPLE_TIME);  // 等待转换完成adc_buffer[adc_buffer_index++] = HAL_ADC_GetValue(&hadc);   // 保存采样结果if (adc_buffer_index >= ADC_BUFFER_SIZE) {    // 缓冲区已满,重置索引adc_buffer_index = 0;}
}/*** @brief 数据处理*/
uint16_t adc_process_data(void)
{uint16_t result = 0;for (uint8_t i = 0; i < ADC_BUFFER_SIZE; i++) {   // 对所有采样数据进行求和result += adc_buffer[i];}result /= ADC_BUFFER_SIZE;  // 求平均值return result;
}/*** @brief 计算采样周期*/
uint32_t adc_calculate_period(void)
{return ADC_SAMPLE_PERIOD - ADC_SAMPLE_TIME;   // 采样周期减去采样时间即为等待时间
}
开发板的ADC模块有三个通道,可以通过轮询的方式进行连续转换采样。下面是采样原理和过程:采样原理:ADC模块将模拟信号转换为数字信号,采样过程中需要注意采样精度和采样速率。采样精度指的是数字信号的位数,采样速率指的是每秒钟采样的次数。采样过程:1. 初始化ADC模块,设置ADC通道和采样精度;
2. 设置ADC转换模式为连续转换模式;
3. 启动ADC转换;
4. 轮询ADC转换完成标志位,读取ADC转换结果;
5. 对采样数据进行处理和计算。下面是代码注释及解析:```c
#include "xxxx_adc.h"#define ADC_CHANNEL_NUM 3 // ADC通道数
#define ADC_SAMPLE_NUM 10 // 每个通道采样次数static uint16_t adc_data[ADC_CHANNEL_NUM][ADC_SAMPLE_NUM]; // 存储采样数据的数组void adc_init(void)
{ADC_InitTypeDef ADC_InitStruct;ADC_InitStruct.ADC_Channel = ADC_Channel_0; // 设置ADC通道ADC_InitStruct.ADC_Resolution = ADC_Resolution_12Bit; // 设置采样精度为12位ADC_Init(&ADC_InitStruct);ADC_Cmd(ENABLE); // 使能ADC模块
}void adc_sample(void)
{uint8_t i, j;ADC_ContinuousModeCmd(ENABLE); // 设置ADC转换模式为连续转换模式ADC_SoftwareStartConvCmd(ENABLE); // 启动ADC转换for (i = 0; i < ADC_CHANNEL_NUM; i++) {for (j = 0; j < ADC_SAMPLE_NUM; j++) {while (!ADC_GetFlagStatus(ADC_FLAG_EOC)); // 轮询ADC转换完成标志位adc_data[i][j] = ADC_GetConversionValue(); // 读取ADC转换结果}}ADC_ContinuousModeCmd(DISABLE); // 关闭ADC转换模式
}void adc_process(void)
{uint8_t i, j;uint32_t sum;float average;for (i = 0; i < ADC_CHANNEL_NUM; i++) {sum = 0;for (j = 0; j < ADC_SAMPLE_NUM; j++) {sum += adc_data[i][j]; // 对采样数据进行求和}average = (float)sum / ADC_SAMPLE_NUM; // 计算采样数据的平均值// 对采样数据进行处理和计算}
}int main(void)
{adc_init(); // 初始化ADC模块while (1) {adc_sample(); // 进行采样adc_process(); // 对采样数据进行处理和计算}
}
```在上面的代码中,我们通过`adc_init()`函数初始化ADC模块,设置ADC通道和采样精度。在`adc_sample()`函数中,我们设置ADC转换模式为连续转换模式,并启动ADC转换。然后,我们通过轮询ADC转换完成标志位,读取ADC转换结果,并将采样数据存储到数组中。最后,在`adc_process()`函数中,我们对采样数据进行处理和计算。关于采样时间和采样周期的计算,可以根据采样精度和采样速率进行计算。采样时间可以通过以下公式计算:采样时间 = 1 / 采样速率采样周期可以通过以下公式计算:采样周期 = 采样时间 x 采样次数在实际应用中,我们可以根据需要调整采样精度和采样速率,以满足应用的要求。

STM32 ADC采样相关推荐

  1. STM32 ADC 采样 频率的确定

    一 STM32 ADC 采样频率的确定 1.       : 先看一些资料,确定一下ADC 的时钟: (1),由时钟控制器提供的ADCCLK 时钟和PCLK2(APB2 时钟)同步.CLK 控制器为A ...

  2. STM32 ADC采样使用内部参考电压

    整理也能进步!写得清楚才能理解更深. [问题背景] 在使用ADC时,通常的用法是Vref+接电源VDD3.3V,然后计算时直接用3.3V做参考电压,但是这种方法忽略了一些情况如供电电压有可能随外部一些 ...

  3. STM32的ADC采样与多通道ADC采样

    一 单通道采样  参考资料: <STM32库开发实战指南> 刘火良,杨森著 原理性质的东西还是少讲,因为上面那本书里面讲解的很详细了,直接来看硬件电路图 这里使用的是3362电位器(10K ...

  4. adc 采样时间 采样周期数 采样频率计算(以stm32为例)

    ADC转换就是输入模拟的信号量,单片机转换成数字量.读取数字量必须等转换完成后,完成一个通道的读取叫做采样周期.采样周期一般来说=转换时间+读取时间.而转换时间=采样时间+12.5个时钟周期.采样时间 ...

  5. 【STM32】定时器TIM触发ADC采样,DMA搬运到内存(超详细讲解)

    TIM+ADC+DMA原理 一般情况下,当我们需要进行采样的时候,需要用到ADC.例如:需要对某个信号进行定时采样(也就是隔一段时间,比如说2ms). 本文提供的解决方案是:使用ADC的定时器触发AD ...

  6. STM32 ADC多通道规则采样和注入采样

    layout: post tags: [STM32] comments: true 文章目录 layout: post tags: [STM32] comments: true 什么是ADC? STM ...

  7. STM32多通道ADC采样获取GY-25A倾角传感器模拟输出数据

    STM32多通道ADC采样获取GY-25A倾角传感器模拟输出数据 GY-25A模块是新型的倾角传感器模块,具有X和Y两轴模拟角度输出和串口角度输出的功能.这里介绍STM32获取GY-25A模拟输出的角 ...

  8. STM32多通道ADC采样获取MCP9701模拟温度传感器温度输出数据

    STM32多通道ADC采样获取MCP9701模拟温度传感器温度输出数据 市面上常见的模拟温度传感器有TI的LM35系列,然后使用中并不简便.MCP9701是Microchip公司推出的相似的模拟温度传 ...

  9. STM32+FreeRTOS+CUBEMX_学习笔记(五 )ADC采样

    ADC的各种模式 前言 1.STM系列ADC的参数: 2.ADC的几种工作模式 单次转换模式 连续转换模式 DMA 双ADC模式 3.函数 4.具体操作 参考资料 前言 ADC采样是一种常见的功能 1 ...

最新文章

  1. 独家 | PyCaret 2.1横空出世-有什么新的内容?
  2. CSS命名方法(笔记)
  3. 在使用Asp.net制作网站的时候遇到的问题(二)
  4. pragma pack(1) and #pragma pack(push,1)
  5. 2、基于wsgiref模块DIY一个web框架
  6. LINQ系列:LINQ to XML操作
  7. Linux目录/bin、/sbin、/usr/bin、/usr/sbin的区别
  8. LeetCode 1954. 收集足够苹果的最小花园周长(数学)
  9. a算法TSP旅行商java_A*算法实现旅行商问题(人工智能报告,付代码)
  10. AIX 文件操作和AIX 目录操作
  11. LogManager分析
  12. JavaScript学习(二十九)—JS常用的事件
  13. 网易云api如何调用_谈谈网易云如何快速升级
  14. php字符是否在字符串中出现,php 判断一个字符串中的字符是否都在另一个中出现(算法)...
  15. web测试要点及基本方法
  16. java导入jdk源码_eclipse导入JDK源码
  17. NVMe PM951 硬盘写入速度优化
  18. 财务管理系统如何帮助企业实现财务自动化管理?
  19. css 设置图片原来大小,用CSS设置背景图像的大小?
  20. Android系统 linux内核按键驱动开发

热门文章

  1. Centos7 Certbot 常用命令相关总结
  2. 苹果最新专利:虚拟SIM卡
  3. GPS模块HAL层分析和调试
  4. YTU 2914: xiaoping学构造函数
  5. android程序出现了奇怪的错误 Field requires API level 5 (current min is 1): ......
  6. 程序员鄙视链至今还存在,你咋想不通呢?看完给你理清思绪
  7. electron应用通过web页面按钮唤醒
  8. Golang之NSQ
  9. 动力学分析基础(一)
  10. 便宜耐用学生蓝牙耳机哪款好?适合学生购买的蓝牙耳机推荐