[活动专区] 【杰发科技AC7802x测评】7. ADC应用之可燃气体测试

[复制链接]
5124|15
 楼主| hehung 发表于 2023-6-17 13:56 | 显示全部楼层 |阅读模式
#申请原创# #技术资源#

# 前言

本文将介绍如何使用AC7802X的ADC功能。

本文使用如下ADC功能:

- PA11(即ADC_IN0)来采集可燃气体传感器MQ-5检测空气中的可燃气体浓度。
- PA11(即ADC_IN1)来检测板载电位计采集的ADC值,通过转动电位计可以改变PA11连接的引脚的电压
- 芯片内部温度传感器应用-采集芯片温度
- 使用了规则组

# 1 硬件连接

下图展示了ADC以及对应引脚之间的关系。**将PA11连接到了MQ-5可燃气体传感器上**

1686978136893.png

下图是板载的电位器的原理图,可以知道连接到了PA10引脚上,对应的ADC为ADC_IN1。

1686978760027.png 1686978793118.png

# 2 ADC功能介绍

关于AC7802X的功能以及使用方式,可以参考用户手册《ATC_AC7802x_ReferenceManual_CH》 8 模数转换器(ADC)。

ADC分为了两种转换组:注入组和对则组,关于其区别可以参考用户手册,本文不做赘述。本文使用了对则组进行转换。

下面是关于片内温度传感器的说明,片内温度传感器也连接到了ADC上,可以通过VIN来采集温度值,下面是关于片内温度传感器的说明以及计算公式。

1686979055456.png

关于计算公式中,用到了VTEMP25以及Slope,这两个变量的值在数据手册中可以找到典型值,可以用来计算实际温度,如下所示:

1686979186938.png

所以真实的计算公式为:

温度=(0.705-VSENSOR)/-1.709 + 25。

知道了公式,下面就可以实现代码逻辑了。

# 3 代码实现

## 3.1 ADC初始化

初始化代码如下:

其中:

- 首先初始化PA11和PA10为A。C引脚,复用功能为FUN2。
- 然后配置ADC
- 最后启动规则组转换以及内部温度传感器采样

  1. void Adc_Init(void)
  2. {
  3.     ADC_ConfigType adcConfig;                    /*! ADC初始化配置*/
  4.     memset(&adcConfig, 0x00, sizeof(adcConfig)); /*! 清空结构体*/

  5.     /*! ADC输入端口(MQ-5)配置*/
  6.     GPIO_SetFunc(GPIOA, GPIO_PIN11, GPIO_FUN2); /*! PA10复用为FUN2,为ADC_IN1 ,对应电位器VR1*/

  7.     /*! ADC输入端口(电位器)配置*/
  8.     GPIO_SetFunc(GPIOA, GPIO_PIN10, GPIO_FUN2); /*! PA10复用为FUN2,为ADC_IN1 ,对应电位器VR1*/

  9.     /*! ADC配置
  10.     ADC固定为12位分辨率,工作模式为MODE3(工作模式内容见参考手册8.4.2章节),规则组扫描+注入组扫描模式多通道单次转换,规则组长度为3,注入组长度为0
  11.     每触发一次进行一次ADC转换,每次转换规则组中的3个通道。
  12.     */
  13.     adcConfig.clkPsc                     = ADC_CLK_PRESCALER_2;  /*! ADC时钟分频设置,Set ADC Clk = APB时钟频率/(clkPsc + 1) = 16M/2 = 8M */
  14.     adcConfig.scanModeEn                 = ENABLE;               /*! 模式配置SCAN:扫描模式使能位 多通道需使能扫描模式,单通道则不需要使能*/
  15.     adcConfig.continuousModeEn           = DISABLE;              /*! 模式配置CONT:连续模式使能位 0:触发一次后只转换一次,1:触发后可连续转换*/
  16.     adcConfig.regularDiscontinuousModeEn = DISABLE;              /*! 模式配置DISCEN:打开规则组间断转换模式*/
  17.     adcConfig.injectDiscontinuousModeEn  = DISABLE;              /*! 模式配置IDISEN:打开注入组间断转换模式*/
  18.     adcConfig.injectAutoModeEn           = DISABLE;              /*! 模式配置IAUTO:自动注入模式*/
  19.     adcConfig.intervalModeEn             = DISABLE;              /*! 模式配置INTERVAL:注入组为间隔转换模式*/
  20.     adcConfig.regularDiscontinuousNum    = 0;                    /*! 规则组子组长度,用于Mode7和Mode8*/
  21.     adcConfig.interruptEn                = DISABLE;              /*! 总中断使能*/
  22.     adcConfig.voltageRef                 = ADC_VOLTAGEREF_VDDA;  /*! ADC参考源选择 */
  23.     adcConfig.regularTriggerMode         = ADC_TRIGGER_INTERNAL; /*! 规则组触发源类型选择*/
  24.     adcConfig.injectTriggerMode          = ADC_TRIGGER_INTERNAL; /*! 注入组触发源类型选择*/
  25.     adcConfig.regularSequenceLength      = 3;                    /*! 规则组长度*/
  26.     adcConfig.injectSequenceLength       = 0;                    /*! 注入组长度*/
  27.     adcConfig.dataAlign                  = ADC_DATA_ALIGN_RIGHT; /*! 数据右对齐*/
  28.     adcConfig.callBack                   = NULL;                 /*! ADC回调函数*/
  29.     adcConfig.powerMode                  = ADC_POWER_ON;         /*! ADC上电*/
  30.     ADC_Init(ADC0, &adcConfig);                                  /*! ADC works Mode Config*/

  31.     /*!
  32.         ADC转换率计算公式:
  33.         总转换时间=(SPT+ 12)/ADC时钟频率+5个APB时钟周期
  34.         备注:
  35.         1.SPT为采样周期个数,具体见下面ADC_SPT_CLK_x。
  36.         2.ADC时钟频率 = APB时钟频率 /(分频系数+1)
  37.         3.7802x ADC支持的最高采样率为250Ksps(即转换时间不低于4us),如果配置采样率高于该值,可能会导致采样结果精度显著减低。
  38.     */
  39.     /*规则组通道转换序列和转换速率配置*/
  40.     ADC_SetRegularGroupChannel(ADC0, ADC_CH_0, ADC_SPT_CLK_33, 0);   /*! 采样&转换时间= (33+12)/8000000 + 5/16000000 ≈ 5.94us */
  41.     ADC_SetRegularGroupChannel(ADC0, ADC_CH_1, ADC_SPT_CLK_33, 1);   /*! 采样&转换时间= (33+12)/8000000 + 5/16000000 ≈ 5.94us */
  42.     ADC_SetRegularGroupChannel(ADC0, ADC_CH_VIN, ADC_SPT_CLK_33, 2); /*! 采样&转换时间= (33+12)/8000000 + 5/16000000 ≈ 5.94us */
  43.     /*! Bandgap或T-sensor内部通道配置*/
  44.     ADC_SetInternalChannel(ADC0, ADC_INTERNAL_TSENSOR); /*! 内部电压信号选择(仅在使用了ADC_CH_VIN 时配置) */
  45.     ADC_SetVBufEnableFlag(ADC0, ENABLE);                /*! Bandgap和T-sensor内部通道使能(仅在使用了ADC_CH_VIN 时配置) */
  46. }



## 3.2 ADC值读取以及打印

- 首先使用软件方式启动ADC0转换
- 然后等待转换完成
- 最后读取转换结果并将AN0和AN1的转换结果转变为mV为单位
- 将温度读取结果转换为实际温度值

  1. void Adc_SwTrigger(void)
  2. {
  3.     ADC_SoftwareStartRegularConvert(ADC0); /*! 软件触发规则组采样*/

  4.     while (!ADC_GetEOCFlag(ADC0, 2)) /*! 等待规则组最后一个通道转换完成*/
  5.     {
  6.         /* Wait */
  7.     }

  8.     g_adc_RegularArray[0] = (ADC_GetRegularData(ADC0, 0) * 3300 / 4096); /*! 获取规则组0的转换值*/
  9.     g_adc_RegularArray[1] = (ADC_GetRegularData(ADC0, 1) * 3300 / 4096); /*! 获取规则组1的转换值*/
  10.     g_adc_RegularArray[2] = ADC_GetRegularData(ADC0, 2); /*! 获取规则组2的转换值*/

  11.     float T_Sensor_V = ((float)g_adc_RegularArray[2] * 3.3 / 4096.0);
  12.     printf ("-->%f\n", T_Sensor_V);
  13.     float T_Sensor = (0.705 - T_Sensor_V) / -1.709 + 25;

  14.     /*! 打印ADC各通道转换结果*/
  15.     printf("ADC Regular value:  MQ-5 = %04dmV VR1 = %04dmV TSENSOR = %.2fCentigrade \r\n", g_adc_RegularArray[0], g_adc_RegularArray[1], T_Sensor);
  16. }



## 3.3 主函数

主函数调用ADC进行转换,如下:

  1.     Adc_Init();

  2.     while(1)
  3.     {
  4.         Adc_SwTrigger();

  5.         for (int i = 0; i < 1000; i++)
  6.             for (int j = 0; j< 10000; j++);
  7.     }




# 4 实验效果

下面是打印结果,第一个数字是MQ-5采集的可燃气体浓度值,第二个电位器采样值,第三个是采集的芯片内部温度。

1. 电位器采样果

1686980877158.png

2. MQ-5可燃气体采样结果:将打火机内部甲烷气体释放出来,靠近MQ-5即可进行测试,测试图以及测试结果如下:

1686981010085.png

1686981096801.png



 楼主| hehung 发表于 2023-6-17 21:51 | 显示全部楼层
1686981503834.png
忘了说了,要正常使用ADC功能,需要开启ADC选项,见上图
cdb1235 发表于 2023-6-19 08:58 | 显示全部楼层
这里是不是写错了
- PA11(即ADC_IN1)(PA10是IN1吧)来检测板载电位计采集的ADC值,通过转动电位计可以改变PA11连接的引脚的电压
94497648fa7da9c276.png
 楼主| hehung 发表于 2023-6-19 09:12 | 显示全部楼层
cdb1235 发表于 2023-6-19 08:58
这里是不是写错了
- PA11(即ADC_IN1)(PA10是IN1吧)来检测板载电位计采集的ADC值,通过转动电位 ...

大佬看的很仔细,确实写错了,ADC_IN1是连接到PA10上面的,也就是PA10是用来采集板载电位器电压信号的引脚。感谢大佬指正错误

评论

老哥客气了,并非大佬,学习一下,感谢分享  发表于 2023-6-19 09:13
tpgf 发表于 2023-7-5 16:29 | 显示全部楼层
可燃气体的检测一般用哪种传感器呢?

评论

我用的MQ5,可以检测丁烷、丙烷、甲烷这些可燃气体  发表于 2023-7-5 17:03
kxsi 发表于 2023-7-5 17:33 | 显示全部楼层
这个需要同时至少两路adc进行采集吗

评论

一路就行了  发表于 2023-7-8 19:14
caigang13 发表于 2023-7-5 19:54 来自手机 | 显示全部楼层
还有个型号是MQ2

评论

感谢分享  发表于 2023-7-8 19:16
qcliu 发表于 2023-7-5 21:13 | 显示全部楼层
我们如何验证传感器精度和adc的采集精度是多少呢

评论

传感器精度不需要验证,可以查看相关的手册,有说明输出的电压范围,ADC的精度可以自己确定,只要可以采集到传感器电压范围的电压就可以了  发表于 2023-7-8 19:17
drer 发表于 2023-7-5 21:42 | 显示全部楼层
芯片内部温度传感器的误差可是比较大的啊

评论

看起来不是很准确,哈哈  发表于 2023-7-8 19:18
sperper 发表于 2024-7-24 17:33 | 显示全部楼层
adc采集,mode3和mode5的区别大吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

66

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部