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

ADC常用库函数(STC8系列)

ADC工作原理:
深化量化误差分析:引入公式Equant=Vref2n+1 E_{\text{quant}} = \frac{V_{\text{ref}}}{2^{n+1}} Equant=2n+1Vref,其中EquantE_{\text{quant}}Equant为量化误差,nnn为分辨率(12位时误差约0.61 mV)。解释如何通过过采样降低噪声。
STC8 ADC硬件特性
补充多通道切换时序:建议添加时序图描述(例如,通道切换延迟tswitch≈1μst_{\text{switch}} \approx 1 \mu stswitch1μs),并讨论外部参考电压源的选择(如使用TL431稳压器提升精度)。

1. ADC初始化函数

/******************* ADc配置函数 *******************/
void	ADC_config(void)
{ADC_InitTypeDef		ADC_InitStructure;		//结构定义ADC_InitStructure.ADC_SMPduty   = 31;		//ADC 模拟信号采样时间控制, 0~31(注意: SMPDUTY 一定不能设置小于 10)ADC_InitStructure.ADC_CsSetup   = 0;		//ADC 通道选择时间控制 0(默认),1ADC_InitStructure.ADC_CsHold    = 1;		//ADC 通道选择保持时间控制 0,1(默认),2,3ADC_InitStructure.ADC_Speed     = ADC_SPEED_2X1T;		//设置 ADC 工作时钟频率	ADC_SPEED_2X1T~ADC_SPEED_2X16TADC_InitStructure.ADC_AdjResult = ADC_RIGHT_JUSTIFIED;	//ADC结果调整,	ADC_LEFT_JUSTIFIED,ADC_RIGHT_JUSTIFIEDADC_Inilize(&ADC_InitStructure);		//初始化ADC_PowerControl(ENABLE);				//ADC电源开关, ENABLE或DISABLENVIC_ADC_Init(DISABLE,Priority_0);		//中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
}

2. 获取值

u16 result = Get_ADCResult(chn); // chn: ADC_CH0, ADC_CH1, ADC_CH2 .... ADC_CH15

3. 计算电压

float v = result * 基准电压 / 采样精度;

4. 案例

#include    "GPIO.h"
#include	"Delay.h"
#include 	"UART.h"	// 串口配置 UART_Configuration
#include 	"NVIC.h"	// 中断初始化NVIC_UART1_Init
#include 	"Switch.h"  // 引脚切换 UART1_SW_P30_P31
#include    "ADC.h"void GPIO_config() { GPIO_InitTypeDef info;// ===== UART1  P30  P31  准双向info.Mode = GPIO_PullUp; 				// 准双向info.Pin = GPIO_Pin_0 | GPIO_Pin_1;   	// 引脚GPIO_Inilize(GPIO_P3, &info);// P05 高阻输入info.Mode = GPIO_HighZ;     // 高阻输入info.Pin = GPIO_Pin_5;   	// 引脚GPIO_Inilize(GPIO_P0, &info);
}// 串口配置函数的定义
void UART_config(void) {// >>> 记得添加 NVIC.c, UART.c, UART_Isr.c <<<COMx_InitDefine		COMx_InitStructure;					//结构定义COMx_InitStructure.UART_Mode      = UART_8bit_BRTx;	//模式, UART_ShiftRight,UART_8bit_BRTx,UART_9bit,UART_9bit_BRTxCOMx_InitStructure.UART_BRT_Use   = BRT_Timer1;			//选择波特率发生器, BRT_Timer1, BRT_Timer2 (注意: 串口2固定使用BRT_Timer2)COMx_InitStructure.UART_BaudRate  = 115200ul;			//波特率, 一般 110 ~ 115200COMx_InitStructure.UART_RxEnable  = ENABLE;				//接收允许,   ENABLE或DISABLECOMx_InitStructure.BaudRateDouble = DISABLE;			//波特率加倍, ENABLE或DISABLEUART_Configuration(UART1, &COMx_InitStructure);		//初始化串口1 UART1,UART2,UART3,UART4NVIC_UART1_Init(ENABLE,Priority_1);		//中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3UART1_SW(UART1_SW_P30_P31);		// 引脚选择, UART1_SW_P30_P31,UART1_SW_P36_P37,UART1_SW_P16_P17,UART1_SW_P43_P44
}/******************* AD配置函数 *******************/
void	ADC_config(void)
{ADC_InitTypeDef		ADC_InitStructure;		//结构定义ADC_InitStructure.ADC_SMPduty   = 31;		//ADC 模拟信号采样时间控制, 0~31(注意: SMPDUTY 一定不能设置小于 10)ADC_InitStructure.ADC_CsSetup   = 0;		//ADC 通道选择时间控制 0(默认),1ADC_InitStructure.ADC_CsHold    = 1;		//ADC 通道选择保持时间控制 0,1(默认),2,3ADC_InitStructure.ADC_Speed     = ADC_SPEED_2X1T;		//设置 ADC 工作时钟频率	ADC_SPEED_2X1T~ADC_SPEED_2X16TADC_InitStructure.ADC_AdjResult = ADC_RIGHT_JUSTIFIED;	//ADC结果调整,	ADC_LEFT_JUSTIFIED,ADC_RIGHT_JUSTIFIEDADC_Inilize(&ADC_InitStructure);		//初始化ADC_PowerControl(ENABLE);				//ADC电源开关, ENABLE或DISABLENVIC_ADC_Init(DISABLE,Priority_0);		//中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
}void main() {u16 adc;float vol; // 电压EA = 1; // 使能中断总开关GPIO_config(); // GPIO配置UART_config(); // 串口配置ADC_config();  // ADC配置while (1){// 读取ADC采样值,是采样值,不是电压值,但和电压有关系// 参数不能乱写,原理图 芯片手册 P05 对应的通道是 13 通道adc = Get_ADCResult(ADC_CH13);// 转换为电压vol = adc * 2.5 / 4095;// 0~2.5v 是准确的, 2.5v~3.3v  代码读到的数据都是2.5v// 1.65 ~ 2.5v printf("adc = %d, vol = %.2f\n", (int)adc, vol);// 处理的太快delay_ms(250);delay_ms(250);}
}

关键寄存器说明:

寄存器功能描述
ADC_CONTR控制寄存器 (通道选择/启动/速度)
ADC_RESADC结果高8位
ADC_RESLADC结果低2位
P1M1/P1M0P1口模式配置寄存器

使用注意

  1. 首次使用需延时30μs等待ADC稳定
  2. ADC引脚必须配置为高阻输入模式
  3. 转换时间约tconv=12×分频系数sysclkt_{conv} = \frac{12 \times 分频系数}{sysclk}tconv=sysclk12×分频系数
  4. STC8A系列有12位ADC,需调整结果组合方式

建议配合STC-ISP工具生成的寄存器配置文件使用,不同子系列需查看对应数据手册调整细节。

http://www.lryc.cn/news/613253.html

相关文章:

  • 【面试向】大模型应用岗 —— Transformer 篇
  • 输电线路电气参数与阻抗计算全解析
  • 从库存一盘货到全域智能铺货:巨益科技全渠道平台助力品牌业财一体化升级
  • 从零开始掌握Hardhat开发
  • 【tips】css模仿矢量图透明背景
  • 小红书开源多模态视觉语言模型DOTS-VLM1
  • Ubuntu 22 下脚本登录MFA堡垒机
  • 嵌入式学习---在 Linux 下的 C 语言学习 Day10
  • 指针——练习
  • OLMo 2 架构深度解析:开放语言模型的技术革命
  • A Logical Calculus of the Ideas Immanent in Nervous Activity(神经网络早期的M-P模型)
  • 【数字图像处理系列笔记】Ch05:傅里叶变换与频率域滤波
  • 【实时Linux实战系列】实时分布式计算架构的实现
  • Mongodb常用命令简介
  • MongoDB学习专题(六)复制集和分片集群
  • 02电气设计-安全继电器电路设计(让电路等级达到P4的安全等级)
  • 内存泄漏系列专题分析之三十二:高通相机CamX ION/dmabuf内存管理机制CmdBuffer
  • VC6800智能相机:赋能智能制造,开启AI视觉新纪元
  • vue2+elementui select框可以选择可以回车添加新的option
  • Godot ------ 中级人物血条制作01
  • ElementUI之表格
  • Oracle 19C In-Memory 列存储技术测试
  • Renesas Electronics RA8M1语音套件(VK-RA8M1)
  • 深入解析Go设计模式:责任链模式实战
  • Electron 中 license-keys 的完整集成方案
  • 网络虚拟化是啥啊?
  • 自然语言处理×第四卷:文本特征与数据——她开始准备:每一次输入,都是为了更像你地说话
  • 拥抱云原生:从传统架构到云原生架构的演进与实践
  • python题目练习 无重叠区间
  • 京东关键字搜索商品列表接口开发实战:从参数优化到分布式调用