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

物联网之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个回答

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版