四、ADC模数转换概述

1、ADC简介

        1.1 ADC的作用

               采集传感器的数据,测量输入电压,检查电池电量剩余,检测温湿度等。

        1.2 ADC的性能指标

               量程:能测量的电压范围

               分辨率:ADC的分辨率通常以输出二进制的位数表示,位数越多,分辨率越高,一般来说分辨率越高,转化时间越长。常见 8位,10位,12位,16位,24位

               转化时间:模拟输入电压在允许的最大变化范围内,从转换开始到活的稳定的数字量输出所需要的时间称为转换时间。

          1.3 ADC 特性

              ①转换速度                  

              ②可配置的转换精度:6位,8位,10位,12位

              ③ 转换电压范围:0 ~ 3.6V           VSSA ~ VDD

              ④ 供电范围:2.4V ~ 3.6V

              ⑤ 19个转换通道:16个外部通道,3个内部通道

              ⑥ 采样时间可配置

              ⑦ADC的结果可以左对齐或右对齐方式存储在数据寄存器中

2、STM32F-ADC时钟

3、STM32F-ADC转化模式

3.1 通道的选择

 ①19路复用通道

          ②16个从GPIO引脚引入的模拟输入(ADC_IN0...ADC_IN15)

          ③3个内部模拟输入(温度传感,内部参考电压,VBAT通道)

                ADC可以转换一个单一通道或自动扫描一个序列通道,被转换的通道序列必须再通道选择寄存器

                ADC_CHSELR中编程选择:每个模拟输入通道有专门的一位选择位(CHSEL0......CHSEL18)

          ④ 什么是规则组转换,注入组转换                  

                       STM32的ADC控制器有很多通道,所以模块通过内部的模拟多路开关,可以切换到不同的输入通道并进行转换。STM32特别地加入了多种成组转换的模式,可以由程序设置好之后,

                对多个模拟通道自动地进行逐个地采样转换。它们可以组织成两组:规则通道组和注入通道组。

                        例如,可以如下顺序完成转换:通道3、通道8、通道2、通道2、通道0、通道2、通道2、通道15。

                        规则通道组:最多可以安排16个通道。规则通道和它的转换顺序在ADC_SQRx寄存器中选择,规则组转换的总数应写入ADC_SQR1寄存器的L[3:0]中;
                        注入通道组:最多可以安排4个通道。注入组和它的转换顺序在ADC_JSQR寄存器中选择。注入组里转化的总数应写入ADC_JSQR寄存器的L[1:0]中。
                        在执行规则通道组扫描转换时,如有例外处理则可启用注入通道组的转换。也就是说,注入通道的转换可以打断规则通道的转换,在注入通道被转换完成之后,规则通道才可以继续转换。             

                        当然,需要注意的是:如果ADC_SQRx或ADC_JSQR寄存器在转换期间被更改,当前的转换被清除,一个新的启动脉冲将发送到ADC以转换新选择的组。

                        可能单从字面上还是不是很了解?我们可以通过图形来更直观地认知:

   

3.2 常见五种转换模式

注:ADC通知应用每次转换结束(EOC)事件   

                      ADC通知应用每次序列转换结束(EOS)事件  

                   这些标志都是在ADC中断和状态寄存器(ADC_ISR)中

                    ADC_CFGR1可配置COUNT位

3.3 单次转换模式代码示例

 3.3.1 STM32CubeMx如何配置 

配置为单次转换模式

开启中断

3.3.2 主程序

int main(void)
{

     /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
       HAL_Init();

      /* Configure the system clock */
     SystemClock_Config();

 

      MX_GPIO_Init();
      MX_ADC1_Init();
 

      while (1)
     {
            /* USER CODE END WHILE */
            HAL_ADC_Start_IT(&hadc1);
            /* USER CODE BEGIN 3 */

          HAL_Delay(1000);
      }
      /* USER CODE END 3 */
}

3.3.3 中断代码

/* USER CODE BEGIN 0 */
static uint32_t value = 0;
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
/* Prevent unused argument(s) compilation warning */
UNUSED(hadc);
/* NOTE : This function Should not be modified, when the callback is needed,
the HAL_ADC_ConvCpltCallback could be implemented in the user file
*/
value = HAL_ADC_GetValue(hadc);
printf("value = %d\n",value);
}
/* USER CODE END 0 */

3.4 连续转换模式代码示例  

3.4.1 STM32CubeMx如何配置 

3.4.2 寄存器

3.4.3 主程序代码        80c51这种简单的CPU基本都是采用这种模式采集AD信号的,就是定时轮询,

int main(void)
{

 

/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();

 

/* Configure the system clock */
SystemClock_Config();

MX_GPIO_Init();
MX_ADC1_Init();

uint32_t temp = 0;

uint32_t temp2 = 0;
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
HAL_ADC_Start(&hadc1);
while(!(hadc1.Instance->SR & (1 < 2))); /*如果退出表示EOC置位,表示当前通道1转换完成*/
temp = HAL_ADC_GetValue(&hadc1);
printf("channel 1 temp=%d\n",temp);

while(!(hadc1.Instance->SR & (1 < 2))); /*如果退出表示EOC置位,表示当前通道4转换完成*/
temp = HAL_ADC_GetValue(&hadc1);
printf("channel 4 temp2=%d\n",temp2);
/* USER CODE BEGIN 3 */

HAL_Delay(1000);
}
/* USER CODE END 3 */
}

4、STM32F-ADC转化时间

  4.1 可编程采样时间(SMP)

                                 T Sampling 可配置: SMP[2:0]@ADC_SMPR

                                  需要和外部电路的输入阻抗匹配,采样时间适用于所有通道

   4.2 转化时间

                                T conversion 取决于转换精度:RES[1:0]

                               

4.3 每个通道总得转换时间等于:

                                  T Sampling + T conversion      精度越低,转化时间越短

 

5、STM32F-ADC触发方式

5.1 软件触发

              软件设置ADC_CR的ADSTART=1时,触发选择有效。

 5.2 外部事件触发

              外部事件(例如:定时器TRGO,输入引脚)触发,可以设置触发源以及触发极性

6、STM32F-ADC模拟看门狗

  可以使用这个功能,做电池的过流过压保护。

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值