引言: 本文使用adc读取接在SOC的ADC的通道上外设的模拟数据,本文的的实验对象是一个滑动变阻器, 像其它的ADC外设不如光电管, 火焰传感器, 等等一些里的adc设备的根据都是差不多的。
一、ADC的基本知识
ADC(模数转换器)是一种将模拟信号转换为数字信号的设备或电路。它是在数字系统中进行模拟信号处理和采集的关键组件。
以下是ADC的基本知识:
1. 工作原理:ADC通过一系列的转换步骤将连续变化的模拟信号转换为离散的数字信号。这个过程涉及两个主要步骤:采样和量化。 - 采样:ADC以固定的时间间隔采集模拟信号的样本值。采样率决定了每秒采集的样本数量,例如,1kHz采样率意味着每秒采样1000次。 - 量化:ADC将每个采样值转换为离散的数字表示,通常使用二进制形式。量化过程将模拟信号的连续范围分割成一系列离散的电平,每个电平对应一个数字值。
2. 分辨率(Resolution):ADC的分辨率决定了其可以转换的模拟信号范围的细致程度。较高的分辨率意味着ADC可以识别和转换更小的变化。分辨率通常以比特(bit)表示,例如8位、10位、12位等。
3. 参考电压(Reference Voltage):ADC使用参考电压来确定模拟信号的电平范围。参考电压是ADC转换时测量的基准,它定义了模拟信号的最大和最小电平。
4. 采样速率(Sampling Rate):ADC的采样速率表示以多少Hz的速度取样输入模拟信号。高采样率可以更准确地捕捉模拟信号的快速变化,但同时需要更大的数据处理和存储能力。
5. 输出数据格式:ADC通常将转换后的数字信号作为输出。输出数据格式可以是二进制编码(二进制数值),补码(有符号数值),或其他特定的编码方式,具体取决于ADC的设计和应用需求。
总之,ADC是将模拟信号转换为数字信号的设备,通过采样和量化将连续变化的模拟信号转换为离散的数字表示,方便数字系统进行信号处理和存储。
二、实验开始
1. 查看原理图
大家根据自己的原理图, 产看外围的设备与SOC连接的引脚, 去配置gpio引脚的模式。
选着对应的adc通道, 接着再去将对应的adc通道给打开。
设置adc的相关参数
需要重点关注的是adc的分辨率, 也就是量化之后的值。
2. 计算原理
假设我选择的adc分辨率为12位, 2的12次方也就是65535, 假如我的IO口的电压范围是0~3.3V, 那是不是我可以将0~65535-1和0~3.3v做一个量化比值的过程, 计算公式如下:
获取到多少mv之后再给大家介绍一下小数转换位整数, 以及使用printf函数显示小数。
float a = 3.2;
int b = a; //方法一:b就是一个整数
int c = (int)a; //方法二:b也是一个整数
使用printf函数显示小数部分, 因为printf在单片机的应用中, printf是不支持显示小数的, 但是可以这样干。
还可以这样
程序源码:
/*
* measure_voltage.h
*
* Created on: Dec 30, 2023
* Author: 哈西好多
*/
#ifndef INC_MEASURE_VOLTAGE_H_
#define INC_MEASURE_VOLTAGE_H_
#include "main.h"
#define VOLTAGE_MAX (3762)
#define VOLTAGE_MIN (70)
#define STEP (3300/3762.0)
extern uint32_t Get_Voltage_Value(void);
#endif /* INC_MEASURE_VOLTAGE_H_ */
/*
* measure_voltage.c
*
* Created on: Dec 30, 2023
* Author: 哈西好多
*/
#include "measure_voltage.h"
#include "adc.h"
uint32_t Get_Voltage_Value(void)
{
uint32_t voltage = 0;
float temp = 0;
int interge, digit;
if(HAL_ADC_Start(&hadc1) != HAL_OK) {
Error_Handler();
}
HAL_ADC_PollForConversion(&hadc1, 300);
voltage = HAL_ADC_GetValue(&hadc1);
temp = voltage * STEP / 1000;
interge = (int)temp; //整数部分
digit = (temp * 100) - (interge * 100); //小数部分
printf("voltage: %d.%dv\n", interge, digit);
return 0;
}
这里我是使用uart到电脑显示的, 大家也可以驱动OLED来显示。