ADC
ADC其实就是单片机采集电压


这是STM32内部的ADC
VREF+ 内部默认接 VDDA
VDDA 一般接 3.3V
所以默认最大采集电压 = 3.3V
然后STM32F103他的ADC是12位也就说最大是0-4095
参考函数
GPIO设置模拟输入
1 | GPIO_InitTypeDef GPIO_InitStructure; |
初始化ADC
1 | void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct) |
| 参数 | 数据类型 | 作用 | 选项 |
|---|---|---|---|
| ADC_TypeDef* ADCx | — | 选择ADC | ADC1-ADC3 |
| ADC_InitTypeDef* ADC_InitStruct | — | 结构体 | — |
| 返回值 | 无 | 无 | 无 |
定义结构体:ADC_InitTypeDef ADC_InitStructure;
| 名称 | 参数 | 作用 |
|---|---|---|
| ADC_Mode | ADC_Mode_Independent//adc独立模式 下面全部是双adc模式(要配置2个adc) ADC_Mode_InjecSimult//注入组同步模式 ADC_Mode_RegSimult//规则组同步模式 ADC_Mode_FastInterl//快速交错模式 ADC_Mode_SlowInterl//慢速交错模式 ADC_Mode_AlterTrig//交替触发模式 下面全部是混合模式 ADC_Mode_RegInjecSimult//工作在同步规则和同步注入模式 ADC_Mode_RegSimult_AlterTrig//规则同步与交替触发组合模式 ADC_Mode_InjecSimult_FastInterl//注入同步与快速交错组合模式 ADC_Mode_InjecSimult_SlowInterl//注入同步与慢速交错组合模式 |
配置ADC工作模式:独立模式/双ADC同步模式 |
| ADC_ScanConvMode | ENABLE DISABLE |
扫描模式:ENABLE=多通道采集,DISABLE=单通道采集 |
| ADC_ContinuousConvMode | ENABLE DISABLE |
转换模式:ENABLE=连续转换,DISABLE=单次转换 |
| ADC_ExternalTrigConv | ADC_ExternalTrigConv_None和 其他触发源(具体看下方) | 软件触发/ 硬件触发 |
| ADC_DataAlign | ADC_DataAlign_Right//右对齐 ADC_DataAlign_Left//左对齐 |
数据对齐方式:右对齐(推荐)/左对齐 |
| ADC_NbrOfChannel | 1~16 | 规则组待采集的通道总数 |
硬件触发源:
| —— | ADC1和ADC2 | ADC3 |
|---|---|---|
| 规则组: | ADC_ExternalTrigConv_T1_CC1//TIM1 CH1 ADC_ExternalTrigConv_T1_CC2//TIM1 CH2 ADC_ExternalTrigConv_T1_CC3//TIM1 CH3 ADC_ExternalTrigConv_T2_CC2//TIM2 CH2 ADC_ExternalTrigConv_T3_TRGO//TIM3 TRGO ADC_ExternalTrigConv_T4_CC4//TIM4 CH4 ADC_ExternalTrigConv_Ext_IT11_TIM8_TRGO//EXTI11和TIM8 TRGO |
ADC_ExternalTrigConv_T3_CC1//TIM3 CH1 ADC_ExternalTrigConv_T2_CC3//TIM2 CH3 ADC_ExternalTrigConv_T1_CC3//TIM1 CH3 ADC_ExternalTrigConv_T8_CC1//TIM8 CH1 ADC_ExternalTrigConv_T8_TRGO//TIM8 TRGO ADC_ExternalTrigConv_T5_CC1//TIM5 CH1 ADC_ExternalTrigConv_T5_CC3//TIM5 CH3 |
| 注入组: | ADC_ExternalTrigInjecConv_T1_TRGO//TIM1 TRGO ADC_ExternalTrigInjecConv_T1_CC4//TIM1 CH4 ADC_ExternalTrigInjecConv_T2_TRGO//TIM2 TRGO ADC_ExternalTrigInjecConv_T2_CC1//TIM2 CH1 ADC_ExternalTrigInjecConv_T3_CC4//TIM3 CH4 ADC_ExternalTrigInjecConv_T4_TRGO//TIM4 TRGO ADC_ExternalTrigInjecConv_Ext_IT15_TIM8_CC4//EXTI15和TIM8 CH4 |
ADC_ExternalTrigInjecConv_T1_TRGO//TIM1 TRGO ADC_ExternalTrigInjecConv_T1_CC4//TIM1 CH4 ADC_ExternalTrigInjecConv_T4_CC3//TIM4 CH3 ADC_ExternalTrigInjecConv_T8_CC2//TIM8 CH2 ADC_ExternalTrigInjecConv_T8_CC4//TIM8 CH4 ADC_ExternalTrigInjecConv_T5_TRGO//TIM5 TRGO ADC_ExternalTrigInjecConv_T5_CC4//TIM5 CH4 |

以上就是硬件触发源
解析
关于采集和转换模式
单次转换和连续转换:
单次转换:单ADC被触发一次就记录一次数据
连续转换:不管有没有触发都在记录
单通道采集和多通道采集
单通道采集:一次只记录一个通道的
多通道采集:按照通道顺序依次采集
关于数据对齐
数据寄存器是16位的,ADC是12位的,因此存在一个数据对齐的问题,以便正确获取数据。一般使用右对齐,直接得到转换结果。
| 对齐方式 | 数据寄存器16位存储结构(从高位到低位) |
|---|---|
| 右对齐 | 0, 0, 0, 0, D11, D10, D9, D8, D7, D6, D5, D4, D3, D2, D1, D0 |
| 左对齐 | D11, D10, D9, D8, D7, D6, D5, D4, D3, D2, D1, D0, 0, 0, 0, 0 |
开启ADC电源
1 | void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState) |
| 参数 | 数据类型 | 作用 | 选项 |
|---|---|---|---|
| ADC_TypeDef* ADCx | — | 选择ADC | ADC1-ADC3 |
| FunctionalState NewState | — | ENABLE DISABLE |
开启或关闭 |
| 返回值 | 无 | 无 | 无 |
ADC校准
复位校准
1 | void ADC_ResetCalibration(ADC_TypeDef* ADCx) |
| 参数 | 数据类型 | 作用 | 选项 |
|---|---|---|---|
| ADC_TypeDef* ADCx | — | 选择ADC | ADC1-ADC3 |
| 返回值 | 无 | 无 | 无 |
获取复位的进度
1 | FlagStatus ADC_GetResetCalibrationStatus(ADC_TypeDef* ADCx) |
| 参数 | 数据类型 | 作用 | 选项 |
|---|---|---|---|
| ADCx | ADC_TypeDef | 指定要查询的ADC外设 | ADC1、ADC2、ADC3 |
| 返回值 | FlagStatus | 获取ADC复位校准状态 | SET:正在复位校准 RESET:复位校准完成/等待 |
开始校准
1 | void ADC_StartCalibration(ADC_TypeDef* ADCx) |
| 参数 | 数据类型 | 作用 | 选项 |
|---|---|---|---|
| ADC_TypeDef* ADCx | — | 选择ADC | ADC1-ADC3 |
| 返回值 | 无 | 无 | 无 |
获取校准的进度
1 | FlagStatus ADC_GetCalibrationStatus(ADC_TypeDef* ADCx) |
| 参数 | 数据类型 | 作用 | 选项 |
|---|---|---|---|
| ADCx | ADC_TypeDef | 指定要查询的ADC外设 | ADC1、ADC2、ADC3 |
| 返回值 | FlagStatus | 获取ADC开始校准状态 | SET:正在复位校准 RESET:复位校准完成/等待 |
关于ADC通道和引脚关系

配置规则组
1 | void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime) |
| 参数 | 数据类型 | 作用 | 选项 |
|---|---|---|---|
| ADC_TypeDef* ADCx | — | 选择ADC | ADC1-ADC3 |
| uint8_t ADC_Channel | uint8_t | 选择ADC通道 | ADC_Channel_0 ··· ADC_Channel_16 |
| uint8_t Rank | uint8_t | 配置规则组组别 | 0-16 |
| uint8_t ADC_SampleTime | uint8_t | 采样时间 | ADC_SampleTime_1Cycles5 1个周期 ADC_SampleTime_7Cycles5 7个周期 ADC_SampleTime_13Cycles5 13个周期 ADC_SampleTime_28Cycles5 28个周期 ADC_SampleTime_41Cycles5 41个周期 ADC_SampleTime_55Cycles5 55个周期 ADC_SampleTime_71Cycles5 71个周期 ADC_SampleTime_239Cycles5 239个周期 |
| 返回值 | 无 | 无 | 无 |
配置注入组
1 | void ADC_InjectedChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime) |
| 参数 | 数据类型 | 作用 | 选项 |
|---|---|---|---|
| ADC_TypeDef* ADCx | — | 选择ADC | ADC1-ADC3 |
| uint8_t ADC_Channel | uint8_t | 选择ADC通道 | ADC_Channel_0 ··· ADC_Channel_16 |
| uint8_t Rank | uint8_t | 配置注入组组别 | 0-16 |
| uint8_t ADC_SampleTime | uint8_t | 采样时间 | ADC_SampleTime_1Cycles5 1个周期 ADC_SampleTime_7Cycles5 7个周期 ADC_SampleTime_13Cycles5 13个周期 ADC_SampleTime_28Cycles5 28个周期 ADC_SampleTime_41Cycles5 41个周期 ADC_SampleTime_55Cycles5 55个周期 ADC_SampleTime_71Cycles5 71个周期 ADC_SampleTime_239Cycles5 239个周期 |
| 返回值 | 无 | 无 | 无 |
硬件触发启用(要前面配置触发源)
1 | void ADC_ExternalTrigInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState); |
| 参数 | 数据类型 | 作用 | 选项 |
|---|---|---|---|
| ADC_TypeDef* ADCx | — | 选择ADC | ADC1-ADC3 |
| FunctionalState NewState | — | ENABLE DISABLE |
开启或关闭 |
| 返回值 | 无 | 无 | 无 |
软件触发
1 | void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState) |
| 参数 | 数据类型 | 作用 | 选项 |
|---|---|---|---|
| ADC_TypeDef* ADCx | — | 选择ADC | ADC1-ADC3 |
| FunctionalState NewState | — | ENABLE DISABLE |
开启或关闭 |
| 返回值 | 无 | 无 | 无 |
检查 ADC 指定的标志位是否被置位(有效)
1 | FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t ADC_FLAG) |
| 参数 | 数据类型 | 作用 | 选项 |
|---|---|---|---|
| ADC_TypeDef* ADCx | — | 选择ADC | ADC1-ADC3 |
| uint8_t ADC_FLAG | uint8_t | 标志位 | ADC_FLAG_AWD//模拟看门狗事件标志 ADC_FLAG_EOC//规则通道转换完成标志 ADC_FLAG_JEOC//注入通道转换完成标志 ADC_FLAG_JSTRT//注入通道开始转换标志 ADC_FLAG_STRT//规则通道开始转换标志 |
| 返回值 | FlagStatus | 检测标志位状态 | SET:标志位置位(有效) RESET:标志位置位(无效) |
读出ADC数据
1 | uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx) |
| 参数 | 数据类型 | 作用 | 选项 |
|---|---|---|---|
| ADC_TypeDef* ADCx | — | 选择ADC | ADC1-ADC3 |
| 返回值 | uint16_t | 读取当前的电压 | 0-4095 |
实际电压=读出的adc值/4095*3.3
模拟看门狗
adc的模拟看门狗就是
设置一个高电压一个低电压
假如电压在区间内那么就正常
如果电压一但高于或者低于就会触发中断
所以叫模拟看门狗
开启ADC监控电压
1 | void ADC_AnalogWatchdogCmd(ADC_TypeDef* ADCx, uint32_t ADC_AnalogWatchdog); |
| 参数 | 数据类型 | 作用 | 选项 |
|---|---|---|---|
| ADC_TypeDef* ADCx | — | 选择ADC | ADC1-ADC3 |
| uint32_t ADC_AnalogWatchdog | uint32_t | 选择监控的通道 | ADC_AnalogWatchdog_None//关闭看门狗 ADC_AnalogWatchdog_SingleRegEnable//检测规则组单个通道 ADC_AnalogWatchdog_SingleInjecEnable//检测注入组单个通道 ADC_AnalogWatchdog_SingleRegOrInjecEnable//检测规则+注入单个通道 ADC_AnalogWatchdog_AllRegEnable//检测规则组所有通道 ADC_AnalogWatchdog_AllInjecEnable//检测注入组所有通道 ADC_AnalogWatchdog_AllRegAllInjecEnable//检测全部规则 + 全部注入全通道监控 |
| 返回值 | 无 | 无 | 无 |
监控电压的范围
1 | void ADC_AnalogWatchdogThresholdsConfig(ADC_TypeDef* ADCx, uint16_t HighThreshold, uint16_t LowThreshold); |
| 参数 | 数据类型 | 作用 | 选项 |
|---|---|---|---|
| ADC_TypeDef* ADCx | — | 选择ADC | ADC1-ADC3 |
| uint16_t HighThreshold | uint16_t | 电压上限 | 0-4095 |
| uint16_t LowThreshold | uint16_t | 电压下限 | 0-4095 |
| 返回值 | 无 | 无 | 无 |
要监控的通道
1 | void ADC_AnalogWatchdogSingleChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel); |
| 参数 | 数据类型 | 作用 | 选项 |
|---|---|---|---|
| ADC_TypeDef* ADCx | — | 选择ADC | ADC1-ADC3 |
| uint8_t ADC_Channel | uint8_t | 选择ADC通道 | ADC_Channel_0 ··· ADC_Channel_16 |
| 返回值 | 无 | 无 | 无 |
开启中断
1 | void ADC_ITConfig(ADC_TypeDef* ADCx, uint16_t ADC_IT, FunctionalState NewState); |
| 参数 | 数据类型 | 作用 | 选项 |
|---|---|---|---|
| ADC_TypeDef* ADCx | — | 选择ADC | ADC1-ADC3 |
| FunctionalState NewState | — | ENABLE DISABLE |
开启或关闭 |
| 返回值 | 无 | 无 | 无 |