声明:本篇文章只是个人知识盲区、知识弱点、重点部分的归纳总结,望各位大佬不喜勿喷。梳理顺序是按照正点原子的视频和文档的实际顺序梳理,转载请注明出处。
作者:sumjess
适用:这个视频我已经看过3遍了,总会有忘记的,所以来写这本书的随手笔记,记录重点、易忘点。该博客可以当做字典,也可以当做笔记。
目前内容:ADC模/数转换

一、ADC简介:

Analog-to-Digital Converter的缩写。指模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件。典型的模拟数字转换器将模拟信号转换为表示一定比例电压值的数字信号。

二、STM32F10x  ADC特点:

12位逐次逼近型的模拟数字转换器。

最多带3个ADC控制器

最多支持18个通道,可最多测量16个外部和2个内部信号源。

支持单次和连续转换模式

转换结束,注入转换结束,和发生模拟看门狗事件时产生中断。

通道0到通道n的自动扫描模式

自动校准

采样间隔可以按通道编程

规则通道和注入通道均有外部触发选项

转换结果支持左对齐或右对齐方式存储在16位数据寄存器

ADC转换时间:最大转换速率 1us。(最大转换速度为1MHz,在ADCCLK=14M,采样周期为1.5个ADC时钟下得到。)

ADC供电要求:2.4V-3.6V

ADC输入范围:VREF- ≤  VIN  ≤  VREF+

三、STM32F10x大容量芯片带3ADC控制器:

其中144脚芯片因为带PF脚,所以多5个通道,为21个外部通道。

小于144脚芯片只有16个外部通道。

四、STM32F10x系列芯片ADC通道和引脚对应关系:

五、ADC引脚:

六、ADC框图:

七、STM32通道组:

①规则通道组:相当正常运行的程序。最多16个通道。

     规则通道和它的转换顺序在ADC_SQRx寄存器中选择,规则

     组转换的总数应写入ADC_SQR1寄存器的L[3:0]中

② 注入通道组:相当于中断。最多4个通道。

     注入组和它的转换顺序在ADC_JSQR寄存器中选择。注入组

     里转化的总数应写入ADC_JSQR寄存器的L[1:0]中

八、STM32F1的ADC的各通道可以单次、连续、扫描或间断模式执行:

(1)单次转化 VS 连续转换:

(2)扫描模式:

九、ADC中断:

十、ADC时钟配置:

不要让ADC时钟超过14MHz,否则可能不准。

RCC_ADCCLKConfig(RCC_PCLK2_Div6);

十一、ADC_CR1寄存器:

十二、ADC_CR2寄存器:

十三、数据对齐方式:

十四、ADC_SMPR1寄存器:

十五、ADC_SMPR2寄存器:

十六、ADC的采样时间 

最小采样时间1us(ADC时钟=14MHz,采样周期为1.5周期下得到)

十七、ADC_SQR1/SQR2/SQR3规则序列寄存器:

十八、ADC_JSQR注入系列寄存器:

十九、ADC_DR规则通道数据寄存器:

二十、ADC_JDR注入通道数据寄存器:

二十一、ADC_SR状态寄存器:

二十二、常用库函数:

void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);
void ADC_DeInit(ADC_TypeDef* ADCx)
void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState);
void ADC_ITConfig(ADC_TypeDef* ADCx, uint16_t ADC_IT, FunctionalState NewState);
void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime);
uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx);
 
void ADC_ResetCalibration(ADC_TypeDef* ADCx);
FlagStatus ADC_GetResetCalibrationStatus(ADC_TypeDef* ADCx);
void ADC_StartCalibration(ADC_TypeDef* ADCx);
FlagStatus ADC_GetCalibrationStatus(ADC_TypeDef* ADCx);

ADC初始化函数ADC_Init

void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);
 
 
typedef struct
{
  uint32_t ADC_Mode;//ADC模式:配置ADC_CR1寄存器的位[19:16]  :DUALMODE[3:0]位
  FunctionalState ADC_ScanConvMode; //是否使用扫描模式。ADC_CR1位8:SCAN位 
  FunctionalState ADC_ContinuousConvMode; //单次转换OR连续转换:ADC_CR2的位1:CONT
  uint32_t ADC_ExternalTrigConv;  //触发方式:ADC_CR2的位[19:17] :EXTSEL[2:0]                
  uint32_t ADC_DataAlign;   //对齐方式:左对齐还是右对齐:ADC_CR2的位11:ALIGN         
  uint8_t ADC_NbrOfChannel;//规则通道序列长度:ADC_SQR1的位[23:20]: L[3:0]       
}ADC_InitTypeDef;

void ADC_Init(ADC_TypeDefADCxADC_InitTypeDefADC_InitStruct);

ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//独立模式ADC_InitStructure.ADC_ScanConvMode = DISABLE;    //不开启扫描 
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//单次转换模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//触发软件 
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//ADC数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 1;//顺序进行规则转换的ADC通道的数目
ADC_Init(ADC1, &ADC_InitStructure);    

ADC使能函数 ADC_Cmd();

void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState
ADC_Cmd(ADC1, ENABLE);    //使能指定的ADC1

ADC使能软件转换函数 ADC_SoftwareStartConvCmd

void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState)
 
ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能ADC1的软件转换启动

ADC 规则通道配置函数ADC_RegularChannelConfig

void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime);
 
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_239Cycles5 );


ADC 获取转换结果函数ADC_GetConversionValue

uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx);
 
ADC_GetConversionValue(ADC1);//获取ADC1转换结果


二十三、ADC1的通道1PA1)进行单次转化:

①开启PA口时钟和ADC1时钟,设置PA1为模拟输入。

      GPIO_Init();     

     APB2PeriphClockCmd();

② 复位ADC1,同时设置ADC1分频因子。

      RCC_ADCCLKConfig(RCC_PCLK2_Div6);

      ADC_DeInit(ADC1);

③ 初始化ADC1参数,设置ADC1的工作模式以及规则序列的相关信息。

     void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);

④ 使能ADC并校准。

       ADC_Cmd(ADC1, ENABLE);

⑤ 配置规则通道参数:

     ADC_RegularChannelConfig();

⑥开启软件转换:ADC_SoftwareStartConvCmd(ADC1);

⑦等待转换完成,读取ADC值。

   ADC_GetConversionValue(ADC1);