1.ADC简介
2.逐次逼近型ADC结构
逼近方式为二分法
3.内部结构
注入组一次可以选中四个通道,可以输出四个数据,规则组可以选择16个通道,但是只能保存一个数据
4.ADC基本结构
下面是输入通道
STM32ADC转换有四种模式,单次转换,连续转换,扫描模式和非扫描模式
5.触发控制
触发信号的选择可以通过设置右边寄存器来完成,或者使用库函数设置参数
6.数据对齐
一般使用右对齐
7。转换时间
如果不需要非常高速的转换频率,那转换时间就可以忽略,采样时间长可以避免毛刺干扰
ADCCLK最大为14MHz
8.校准
9.外围硬件电路
10.相关库函数
void RCC_ADCCLKConfig(uint32_t RCC_PCLK2);对APB2的72MHZ时钟选择2,4,6,8分频输入到ADCCLK
void ADC_DeInit(ADC_TypeDef* ADCx);恢复缺省配置
、void ADC_DeInit(ADC_TypeDef* ADCx);初始化
void ADC_DeInit(ADC_TypeDef* ADCx);结构体初始化
void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState);给ADC上电
void ADC_DMACmd(ADC_TypeDef* ADCx, FunctionalState NewState);开启DMA输出信号
void ADC_DMACmd(ADC_TypeDef* ADCx, FunctionalState NewState);中断输出控制
void ADC_ResetCalibration复位校准
void ADC_ResetCalibration获取复位校准状态
void ADC_StartCalibration(ADC_TypeDef* ADCx);开始校准
ADC_GetCalibrationStatus(ADC_TypeDef* ADCx);获取开始校准状态
void ADC_SoftwareStartConvCmd用于软件触发
ADC_GetSoftwareStartConvStatus获取软件开始转换状态(没啥用)
void ADC_DiscModeChannelCountConfig每隔几个通道间断一次
void ADC_DiscModeCmd是否启用间断模式
void ADC_RegularChannelConfig(ADC规则组通道配置
void ADC_ExternalTrigConvCmd(ADC外部触发转换控制
uint16_t ADC_GetConversionValue(ADC获取转换值
void ADC_AnalogWatchdogCmd(是否启动模拟看门狗
void ADC_AnalogWatchdogThresholdsConfig配置高低阈值
void ADC_AnalogWatchdogSingleChannelConfig配置看门通道
FlagStatus ADC_GetFlagStatus获取标志位状态
void ADC_ClearFlag清除标志位
void ADC_ClearFlag获取中断状态
void ADC_ClearITPendingBit清除中断挂起位
下面是模板:
#include "stm32f10x.h" // Device header
void AD_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);
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_Cmd(ADC1, ENABLE);
ADC_ResetCalibration(ADC1);
while (ADC_GetResetCalibrationStatus(ADC1) == SET);
ADC_StartCalibration(ADC1);
while (ADC_GetCalibrationStatus(ADC1) == SET);
}
uint16_t AD_GetValue(void)
{
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
return ADC_GetConversionValue(ADC1);
}