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 stswitch≈1μs),并讨论外部参考电压源的选择(如使用TL431稳压器提升精度)。

1. ADC初始化函数

c 复制代码
/******************* 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(默认),1
	ADC_InitStructure.ADC_CsHold    = 1;		//ADC 通道选择保持时间控制 0,1(默认),2,3
	ADC_InitStructure.ADC_Speed     = ADC_SPEED_2X1T;		//设置 ADC 工作时钟频率	ADC_SPEED_2X1T~ADC_SPEED_2X16T
	ADC_InitStructure.ADC_AdjResult = ADC_RIGHT_JUSTIFIED;	//ADC结果调整,	ADC_LEFT_JUSTIFIED,ADC_RIGHT_JUSTIFIED
	ADC_Inilize(&ADC_InitStructure);		//初始化
	ADC_PowerControl(ENABLE);				//ADC电源开关, ENABLE或DISABLE
	NVIC_ADC_Init(DISABLE,Priority_0);		//中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
}

2. 获取值

c 复制代码
u16 result = Get_ADCResult(chn); // chn: ADC_CH0, ADC_CH1, ADC_CH2 .... ADC_CH15

3. 计算电压

c 复制代码
float v = result * 基准电压 / 采样精度;

4. 案例

c 复制代码
#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_BRTx
    COMx_InitStructure.UART_BRT_Use   = BRT_Timer1;			//选择波特率发生器, BRT_Timer1, BRT_Timer2 (注意: 串口2固定使用BRT_Timer2)
    COMx_InitStructure.UART_BaudRate  = 115200ul;			//波特率, 一般 110 ~ 115200
    COMx_InitStructure.UART_RxEnable  = ENABLE;				//接收允许,   ENABLE或DISABLE
    COMx_InitStructure.BaudRateDouble = DISABLE;			//波特率加倍, ENABLE或DISABLE
    UART_Configuration(UART1, &COMx_InitStructure);		//初始化串口1 UART1,UART2,UART3,UART4

  	NVIC_UART1_Init(ENABLE,Priority_1);		//中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
    UART1_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(默认),1
	ADC_InitStructure.ADC_CsHold    = 1;		//ADC 通道选择保持时间控制 0,1(默认),2,3
	ADC_InitStructure.ADC_Speed     = ADC_SPEED_2X1T;		//设置 ADC 工作时钟频率	ADC_SPEED_2X1T~ADC_SPEED_2X16T
	ADC_InitStructure.ADC_AdjResult = ADC_RIGHT_JUSTIFIED;	//ADC结果调整,	ADC_LEFT_JUSTIFIED,ADC_RIGHT_JUSTIFIED
	ADC_Inilize(&ADC_InitStructure);		//初始化
	ADC_PowerControl(ENABLE);				//ADC电源开关, ENABLE或DISABLE
	NVIC_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_RES ADC结果高8位
ADC_RESL ADC结果低2位
P1M1/P1M0 P1口模式配置寄存器

使用注意:

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

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

相关推荐
youcans_2 小时前
【嵌入式软件AI编程】22. STM32 基础实验:GPIO外部中断
stm32·单片机·嵌入式硬件·ai编程·claude
未来_攻城狮2 小时前
STM32F407VGT6 芯片详解:高性能 Cortex-M4 MCU 入门指南
stm32·单片机·嵌入式硬件
xcLeigh2 小时前
FreeRTOS实战:用STM32+SEGGER打造工业级实时嵌入式系统
人工智能·stm32·单片机·嵌入式硬件·ai
路上有只喵3 小时前
认识元器件 · 单片机(MCU/MPU/SOC) · 实战篇1
单片机·嵌入式硬件
芯岭技术郦3 小时前
XL4460 FSK 无线透传模组
stm32·单片机·嵌入式硬件
半导体憨包3 小时前
共源共栅(Cascode)功率器件:让 SiC / GaN “兼容“你的硅栅驱动
嵌入式硬件·生成对抗网络·硬件工程·半导体·dc-dc·半导体芯片
天空'之城3 小时前
单片机基础核心知识点汇总(五十)
单片机·嵌入式硬件
硅基造物主4 小时前
STM32 从 0 到 1 做智能家居(十):串口与 printf 重定向
stm32·单片机·智能家居·usart·中断
新晨单片机设计6 小时前
S033A-基于STM32单片机拼图游戏机【Proteus仿真+Keil程序+原理图】
stm32·单片机·嵌入式硬件·拼图游戏机
Silicore_Emma7 小时前
D2596HV:高压异步DC-DC降压芯片简介
嵌入式硬件·消费电子·dc-dc系列电路·电源管理电路·降压(buck)开关稳压器