ADC简介

ADC前置

  • 模拟与数字: ADC输入电压范围:0~3.3v 12位ADC输出数字范围:0~4095

ADC定义: 将引脚上连续变化的模拟电压,转换为内存中存储的数字变量

ADC:

  • stm32f103c8t6资源: ADC1 ADC2 每个ADC有很多个通道

  • 工作模式: 12位逐次逼近型ADC

  • 分辨率 Vref / 2的adc位数次方

  • ADC通道: 规则组:16个ADC转换通道,但规则通道数据寄存器只能存放1个转换结果 配合DMA 注入组:4个ADC转换通道,有4个注入通道数据寄存器能存放4个转换结果

  • ADC模式: 单次转换 连续转换 扫描 非扫描

  • ADC转换触发: 软件:ADC_SoftwareStartConvCmd(ADC1, ENABLE); 硬件:定时器更新事件TRGO,触发ADC转换,节省中断资源 注意 软件触发,配置:ADC_ContinuousConvMode = DISABLE;则每进行一次ADC转换都得调用一次,ADC_SoftwareStartConvCmd(ADC1, ENABLE);

  • AD转换过程: 采样保持 量化编码 注意 采样保持是把待测量的电压值记录下来

  • 12位AD转换时间: ADC周期:1/14MHZ 采样时间 + 转换时间 1.5个ADC周期 + 12.5ADC周期

  • ADC复用GPIO配置: 对应的GPIO引脚配置成模拟输入的模式

ADC函数

ADC初始化函数:

  • 函数使用 函数:ADC_Init 入参:ADC 结构体指针 返回值:无

  • ADC_InitTypedef结构体成员变量 ADC_Mode: ADC_Mode_Independent 独立模式,ADC1与ADC2各转换各的,还有双ADC模式 ADC_DataAlign: ADC_DataAlign_Right / ADC_DataAlign_Left 转换结果16位,采用右对齐直接取结果 ADC_ExternalTrigConv: ADC_ExternalTrigConv_None,不使用外部触发,使用软件触发 ADC_ContinuousConvMode:ENABLE:连续转换模式 DISABLE:单次转换模式 ADC_ScanConvMode: ENABLE:扫描模式 DISABLE:非扫描模式 ADC_NbrOfChannel: 规则组转换列表通道数值 注意 ADC_NbrOfChannel配置扫描模式才起作用

  • 函数调用示例

ADC_InitTypeDef ADC_InitStructure;                      
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;      
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;  
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; 
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;     
ADC_InitStructure.ADC_ScanConvMode = DISABLE;           
ADC_InitStructure.ADC_NbrOfChannel = 1; 
ADC_Init(ADC1, &ADC_InitStructure);                     

ADC时钟分频函数:

  • 函数使用 函数:RCC_ADCCLKConfig 入参:分频值(RCC_PCLK2_Div2,RCC_PCLK2_Div4,RCC_PCLK2_Div6,RCC_PCLK2_Div8) 返回值:无 注意 ADC时钟此单片机最大为14MHZ

  • 函数调用示例

RCC_ADCCLKConfig(RCC_PCLK2_Div6);

ADC规则组通道配置函数:

  • 函数使用 函数:ADC_RegularChannelConfig 入参:ADC ADC通道 序列号 ADC采样时间 返回值:无

  • 函数调用示例

ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);

ADC启动函数:

  • 函数使用: 函数:ADC_Cmd 入参:定时器 ENABLE/ DISABLE 返回值:无

  • 函数调用示例:

ADC_Cmd(ADC1, ENABLE);

ADC校准函数

  • 总调用示例

ADC_ResetCalibration(ADC1);
while (ADC_GetResetCalibrationStatus(ADC1) == SET);
ADC_StartCalibration(ADC1);
while (ADC GetCalibrationStatus(ADC1) == SET);

注意 调用时机:上电后,调用ADC_Cmd后 校准好了是标志位清零,函数返回状态RESET

ADC触发转换函数:

  • 函数使用: 函数:ADC_SoftwareStartConvCmd 入参:ADC ENABLE/ DISABLE 返回值:无

  • 函数调用示例:

ADC_SoftwareStartConvCmd(ADC1, ENABLE);

ADC获取转换结果函数:

  • 函数使用: 函数:ADC_GetConversionValue 入参:ADC 标志位 返回值:SET / RESET

  • 函数调用示例:

uint16_t val = ADC_GetConversionValue(ADC1);

ADC标志位: ADC_GetFlagStatus函数: ADC_FLAG_EOC:代表ADC转换完成

ADC_GetITStatus函数: ADC_IT_EOC:代表ADC转换完成

ADC单通道模块函数

void ADC_Init(void)

RCC_APB2PeriphClockCmd
RCC_APB2PeriphClockCmd
​
RCC_ADCCLKConfig
​
GPIO_Init
​
ADC_RegularChannelConfig
ADC_Init
ADC_Cmd
ADC_ResetCalibration
ADC_GetResetCalibrationStatus
ADC_StartCalibration
ADC_GetCalibrationStatus

uint16_t ADC_GetValue(void) ADC_SoftwareStartConvCmd ADC_GetFlagStatus ADC_GetConversionValue

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐