打印
[活动专区]

【杰发科技AC7802x测评】7. ADC应用之可燃气体测试

[复制链接]
1078|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可燃气体传感器上**



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



# 2 ADC功能介绍

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

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

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



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



所以真实的计算公式为:

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

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

# 3 代码实现

## 3.1 ADC初始化

初始化代码如下:

其中:

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

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

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

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

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

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



## 3.2 ADC值读取以及打印

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

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

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

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

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

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



## 3.3 主函数

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

    Adc_Init();

    while(1)
    {
        Adc_SwTrigger();

        for (int i = 0; i < 1000; i++)
            for (int j = 0; j< 10000; j++);
    }




# 4 实验效果

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

1. 电位器采样果



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







使用特权

评论回复

相关帖子

沙发
hehung|  楼主 | 2023-6-17 21:51 | 只看该作者

忘了说了,要正常使用ADC功能,需要开启ADC选项,见上图

使用特权

评论回复
板凳
cdb1235| | 2023-6-19 08:58 | 只看该作者
这里是不是写错了
- PA11(即ADC_IN1)(PA10是IN1吧)来检测板载电位计采集的ADC值,通过转动电位计可以改变PA11连接的引脚的电压

94497648fa7da9c276.png (537.85 KB )

94497648fa7da9c276.png

使用特权

评论回复
地板
hehung|  楼主 | 2023-6-19 09:12 | 只看该作者
cdb1235 发表于 2023-6-19 08:58
这里是不是写错了
- PA11(即ADC_IN1)(PA10是IN1吧)来检测板载电位计采集的ADC值,通过转动电位 ...

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

使用特权

评论回复
评论
cdb1235 2023-6-19 09:13 回复TA
老哥客气了,并非大佬,学习一下,感谢分享 
5
tpgf| | 2023-7-5 16:29 | 只看该作者
可燃气体的检测一般用哪种传感器呢?

使用特权

评论回复
评论
hehung 2023-7-5 17:03 回复TA
我用的MQ5,可以检测丁烷、丙烷、甲烷这些可燃气体 
6
kxsi| | 2023-7-5 17:33 | 只看该作者
这个需要同时至少两路adc进行采集吗

使用特权

评论回复
评论
hehung 2023-7-8 19:14 回复TA
一路就行了 
7
caigang13| | 2023-7-5 19:54 | 只看该作者
还有个型号是MQ2

使用特权

评论回复
评论
hehung 2023-7-8 19:16 回复TA
感谢分享 
8
qcliu| | 2023-7-5 21:13 | 只看该作者
我们如何验证传感器精度和adc的采集精度是多少呢

使用特权

评论回复
评论
hehung 2023-7-8 19:17 回复TA
传感器精度不需要验证,可以查看相关的手册,有说明输出的电压范围,ADC的精度可以自己确定,只要可以采集到传感器电压范围的电压就可以了 
9
drer| | 2023-7-5 21:42 | 只看该作者
芯片内部温度传感器的误差可是比较大的啊

使用特权

评论回复
评论
hehung 2023-7-8 19:18 回复TA
看起来不是很准确,哈哈 
10
sperper| | 2024-7-24 17:33 | 只看该作者
adc采集,mode3和mode5的区别大吗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

66

帖子

1

粉丝