你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

物联网之STM32开发六(ADC模数转换)

[复制链接]
STMCU 发布时间:2020-9-28 10:09
STM32-ADC模数转换内容概要:

STM32-ADC模数转换概述

STM32-单通道采集实例

STM32-多通道采集实例


STM32-ADC模数转换概述

内容概要:

ADC简介

STM32F0-ADC时钟

STM32F0-ADC转化模式

STM32F0-ADC转化时间

STM32F0-ADC模拟看门狗



ADC简介:

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


ADC的性能指标:

    量程:能测量的电压范围

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

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


1_meitu_1.jpg


STM32F0-ADC特性:


2_meitu_2.jpg


12位精度下转换速度可高达1MHz


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

转换电压范围:0 ~ 3.6V,V SSA ~ V DDA

供电范围:2.4V ~ 3.6V

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


采样时间可配置


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


STM32F0-ADC时钟:


APB时钟的2或4分频,最高14MHz

优点:不会有时钟域之间的同步带来的抖动,触发事件和转换的起始时刻之间的延迟是确定 的,从 而保证转换之间的时间间隔是固定的

缺点: ADC的转换时间和系统时钟频率相关,受系统频率的影响较大



片上14MHZ HSI RC振荡器

优点:无论MCU的运行频率,都可以保证最高的ADC工作频率可以使用自动节电模式(自动开启或关闭14MHz的内部振荡器)

缺点:触发信号的同步会带来抖动,触发事件和转换的起始时刻之间的延迟不确定



3_meitu_1.jpg


STM32F0-ADC通道的选择:

4_meitu_2.jpg



19路复用通道:

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

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

ADC 可以转换一个单一通道或自动扫描一个序列通道。被转换的通道序列必须在通道选择寄存器 ADC_CHSELR 中编程选择:每个模拟输入通道有专门的一位选择位 (CHSEL0...CHSEL18).



STM32F0-ADC转化模式:

5_meitu_3.jpg



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

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

         这些标志位都是在ADC 中断和状态寄存器(ADC_ISR)中  ADC_CFGR1可配置COUNT位 。

         每次有一个通道在转化结束之后( (EOC) 事件),必须先读取出数据寄存器中采集的数据,然后才能采集下一个通道。



6_meitu_4.jpg


7_meitu_5.jpg



STM32F0-ADC转化时间:

可编程采样时间 (SMP):

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

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


转化的时间:

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


8_meitu_6.jpg



每个通道总的转换时间等于:  T Sampling + T conversion (采样时间 + 转化时间)

转换时间快速预览表:不需要高转换精度的应用,可以通过降低精确度来提高转换速度    假设ADC模块工作在14MHz的最高工作频率下



9_meitu_7.jpg



STM32F0-ADC触发方式:

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

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



10_meitu_8.jpg



11_meitu_9.jpg



STM32F0-ADC模拟看门狗:


12_meitu_10.jpg


检测待转换的模拟电压:(简单的来说就是检测到电压值不在预设的范围之内,则产生中断,在中断中设置报警等处理措施)

    电压超出检测范围就置位AWD@ADC_ISR,并条件性地产生中断      

    检测范围由上下门限寄存器指定、 12位的ADC_HTR和ADC_LTR有效值


模拟看门狗的使能控制:

    AWDEN@ADC_CFGR1      

    检测所有通道还是单个通道由AWDSEL@ADC_CFGR1决定      

    检测哪个单个通道由AWDCH[4:0]@ADC_CFGR1决定



STM32-单通道采集实例

实验要求:利用ADC采集光照传感器的数据,并在中断中获取采集的结果



13_meitu_11.jpg



注:光敏电阻光强越强则阻值越小


过程如下:



14_meitu_12.jpg



15_meitu_13.jpg



16_meitu_14.jpg



17_meitu_15.jpg



18_meitu_16.jpg



19_meitu_17.jpg



20_meitu_18.jpg



21_meitu_19.jpg


22_meitu_20.jpg



main.c中启动ADC并使能中断

23_meitu_21.jpg



HAL_ADC_Start_IT(&hadc);//启动ADC转化并使能中断

追加到回调函数(可以在向量表中开始追加,也可以在中断程序文件中(.._it.c表示的就是中断程序文件)追加)

main.c中重新编写fputc函数,adc.c中重新编写回调函数:



  1. int fputc(int ch,FILE *f){       
  2.     while((USART1->ISR&(1<<7)) == 0);       
  3.     USART1->TDR=(uint8_t)ch;
  4.     return ch;
  5. }
复制代码
  1. void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
  2. {
  3.         uint32_t light_value;
  4.         light_value = HAL_ADC_GetValue(hadc);  //获取ADC中数据寄存器采集的值
  5.         printf("light_value = %d\n",light_value);
  6. }
复制代码

测试结果:



28.png



STM32-多通道采集实例

实验要求:利用ADC采集按键以及光照传感器的数据,并在按键中断处理程序中打印采集的结果

原理图分析:

29_meitu_27.jpg



实验过程:

30_meitu_28.jpg



31_meitu_29.jpg



32_meitu_30.jpg



配置ADC功能,因为是由按键中断进行采集,所以配置可以随便选择

33_meitu_31.jpg


打开按键中断:

34_meitu_32.jpg



导出工程:

35_meitu_33.jpg



36_meitu_34.jpg



追加到按键中断回调函数

37_meitu_35.jpg


38_meitu_36.jpg



gpio.c中重新编写fputc 和 回调函数,添加必要的头文件:



39_meitu_37.jpg


  1. #include "adc.h"
  2. #include "usart.h"

  3. int fputc(int ch,FILE *f){       
  4.     while((USART1->ISR&(1<<7)) == 0);       
  5.     USART1->TDR=(uint8_t)ch;
  6.     return ch;
  7. }

  8. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
  9. {
  10.         uint32_t temp = 0;
  11.         if(GPIO_Pin == GPIO_PIN_8)
  12.         {
  13.                 HAL_ADC_Start(&hadc);   //启动ADC
  14.                 while(!(hadc.Instance->ISR & (1<<2)));//如果ADC的状态寄存器中的EOC置位,则表示当前通道转化结束
  15.                 temp = HAL_ADC_GetValue(&hadc);
  16.                 printf("key adc value = %d\n", temp);
  17.                 while(!(hadc.Instance->ISR & (1<<2)));//如果ADC的状态寄存器中的EOC置位,则表示当前通道转化结束
  18.                 temp = HAL_ADC_GetValue(&hadc);
  19.                 printf("light adc value = %d\n", temp);
  20.                 HAL_ADC_Stop(&hadc);  //关闭ADC
  21.         }
  22. }
复制代码




测试结果:



利用中断和ADC识别五向键,即五向键任一按键拨动时能通过串口打印出是那个按键

41_meitu_39.jpg



42_meitu_40.jpg




43_meitu_41.jpg



44_meitu_1.jpg



45_meitu_2.jpg



46_meitu_3.jpg



  1. #include "adc.h"
  2. #include "usart.h"

  3. int fputc(int ch,FILE *f){       
  4.     while((USART1->ISR&(1<<7)) == 0);       
  5.     USART1->TDR=(uint8_t)ch;
  6.     return ch;
  7. }

  8. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
  9. {
  10.         if(GPIO_Pin == GPIO_PIN_8)
  11.         {
  12.                 uint32_t data = 0;
  13.                 HAL_ADC_Start(&hadc);
  14.                 while(!(hadc.Instance->ISR & (1<<2)));
  15.                 data = HAL_ADC_GetValue(&hadc);
  16.                 printf("key value = %d    ", data);
  17.                 if(data > 0 && data < 500)
  18.                 {
  19.                         printf("下边的按键被按下\n");
  20.                 }
  21.                 else if(data < 1600)
  22.                 {
  23.                         printf("左边的按键被按下\n");
  24.                 }
  25.                 else if(data < 2200)
  26.                 {
  27.                         printf("上边的按键被按下\n");
  28.                 }
  29.                 else if(data < 2700)
  30.                 {
  31.                         printf("中间的按键被按下\n");
  32.                 }
  33.                 else if(data < 3100)
  34.                 {
  35.                         printf("右边的按键被按下\n");
  36.                 }
  37.                 HAL_ADC_Stop(&hadc);
  38.         }
  39. }
复制代码

实验结果:


47.png



24_meitu_22.jpg
25_meitu_23.jpg
26_meitu_24.jpg
27_meitu_25.jpg
40_meitu_38.jpg
收藏 1 评论0 发布时间:2020-9-28 10:09

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版