《正点原子BEE BLOCK模块资料》ATK-MB002模块使用说明

ATK-MB002模块使用说明


       1,硬件连接
       这里以正点原子M48Z-M3最小系统板STM32F103版为例,给大家介绍一下模块和板卡的连接方法。其它板卡与模块的硬件连接方法,请大家在“ATK-MB002热敏传感器模块\3,程序源码\相应板卡例程文件夹\readme.txt”路径下查看。
       热敏传感器模块可通过杜邦线与正点原子M48Z-M3最小系统板STM32F103版进行连接,具体的连接关系,如下表所示:



        2,实验功能

       2.1 热敏传感器模块测试实验

       2.1.1 功能说明
       在本实验中,串口会打印热敏电阻传感器模块DO端输出、AO端电压转换值和温度值。需要查看这部分实验信息的用户,可用杜邦线将最小系统板STM32F103的PA9引脚和GND连接至外部的USB转串口设备,这样就可以通过XCOM上位机查看串口打印的信息了。
       用户还可以通过调节电位器来控制温度阈值。当检测到的温度超过阈值时,DO输出低电平,模块指示灯STA点亮;当检测到的温度低于阈值时,DO输出高电平,模块指示灯STA熄灭。同时,通过开发板的ADC采集AO引脚的模拟信号,用于计算温度值。
       开发板的LED0闪烁,提示程序运行。

       2.1.2 源码解读
     打开本实验的工程文件夹,能够在./Drivers/BSP目录下看到ATK_NTC文件夹,和ADC文件夹,其中ATK_NTC文件夹中就包含了热敏传感器模块的驱动文件,ADC文件夹中就包含了ADC的驱动文件如下图所示:


图2.1.2.1热敏传感器模块驱动代码


图2.1.2.2 ADC驱动代码


       2.1.2.1 热敏传感器模块驱动

       下面将简要介绍atk_ntc.c中几个重要的API 函数。


       1. 函数atk_ntc_init()

       该函数用于初始化热敏传感器模块,具体的代码,如下所示:

/**
 * @brief       热敏传感器模块初始化函数
 * @param       无
 * @retval      无
 */
void atk_ntc_init(void)
{
    GPIO_InitTypeDef gpio_init_struct;
    ATK_NTC_DO_GPIO_CLK_ENABLE();                       /* DO时钟使能 */
 
    gpio_init_struct.Pin = ATK_NTC_DO_GPIO_PIN;       /* DO引脚 */
    gpio_init_struct.Mode = GPIO_MODE_INPUT;               /* 输入 */
    gpio_init_struct.Pull = GPIO_NOPULL;                    /* 无上下拉 */
    HAL_GPIO_Init(ATK_NTC_DO_GPIO_PORT, &gpio_init_struct);   
 
    adc_init();                                               /* 初始化ADC */
}

       从上述代码可以看出,atk_ntc_init() 函数负责初始化  热敏传感器模块的 DO 引脚,并将其配置为无上下拉输入;然后调用adc_init() 函数初始化 ADC 采集通道,用于获取AO端电压转换值。


       2. 函数atk_ntc_get_temp()

       该函数主要实现计算并获取热敏传感器的温度值。函数atk_ntc_get_temp ()的具体代码,如下所示:

/**
 * @brief       计算温度值
 * @param       para: 温度采集对应ADC通道的值(已滤波)
 * @note        计算温度分为两步:
                1.根据ADC采集到的值计算当前对应的Rb
                2.根据Rb计算对应的温度值
 * @retval      温度值
 */
float atk_ntc_get_temp(uint16_t para)
{
    float Rb;
    float temp;
    float v1, v2;
    v1 = (para * 3.3f / 4096.0f);   /* 热敏电阻的分压 */
    v2 = 3.3f - v1;                  /* 得到上拉电阻10K的分压 */
    Rb = v1 / (v2 / 10000.0f);       /* 计算出热敏电阻的阻值 */    
 
    temp = Ra/Rb;
    temp = log(temp);                /* ln(Ra/Rb) */
    temp /= Bx;                      /* ln(Ra/Rb)/B */
    temp = (1.0f / Ta) - temp;           
    temp = 1.0f / temp;
    temp -= Ka;                      /* 转成摄氏度 */
    return temp;
}

       atk_ntc_get_temp() 函数用于计算并获取热敏电阻的温度值。该函数通过读取热敏电阻的模拟电压值,结合NTC热敏电阻的特性,精确地计算出当前环境的温度。有关计算公式的详细信息,可参考热敏电阻的数据手册。


       2.1.2.2 ADC驱动

       在图2.1.2.2中,adc.c 和 adc.h 为 ADC 驱动文件,包含了 ADC通道的初始化,并实现了多次采样与滤波等功能。我们就是使用其中的adc_get_result_average()函数来获取AO端电压转换值的。关于ADC的驱动介绍,请查看正点原子各个开发板对应的开发指南中ADC章节。


       2.1.2.3 实验测试代码

       实验的测试代码为文件 demo.c,在工程目录下的 User 子目录中。测试代码的入口函数为 demo_run(),具体的代码,如下所示:

/**
 * @brief       例程演示入口函数
 * @param       无
 * @retval      无
 */
void demo_run(void)
{
    uint16_t adcx;
    float temp;
    
    atk_ntc_init();              /* 初始化热敏传感器 */
    
    while (1)
    {
        /* 获取热敏电阻的模拟值 */
        adcx = adc_get_result_average(ADC_ADCX_CHY, 10);   
/* 获取计算后的带小数的实际电压值,比如3.1111 */                     
        temp = (float)adcx * (3.3 / 4096);       
/* 打印AO处电压值 */                               
        printf("热敏电阻传感器 AO模拟量:%d, 电压值:%.2fV\r\n", adcx, temp);  
/* 打印温度值 */
        printf("NTC温度值:%.2f℃\r\n", atk_ntc_get_temp(adcx));                
        
        /* 温度超过预设阈值时的操作 */
        if(ATK_NTC_DO == GPIO_PIN_RESET)
        {
            printf("温度超过阈值!\r\n");
        }else
        {
            printf("温度未超过阈值!\r\n");
        }
        printf("\r\n");
        
        delay_ms(500);
        LED0_TOGGLE();
    }
}

       从上面代码可以看出,整个测试代码的逻辑相对简单。首先,初始化传感器后,在while循环中调用相关函数获取DO和AO端的值,并通过串口打印。然后,通过atk_ntc_get_temp函数获取热敏传感器的温度值, 并通过串口打印。最后,LED0的闪烁表示程序正常运行。


       2.1.3 实验现象

       将热敏传感器模块按照第一节“硬件连接”中介绍的连接方式与开发板连接,并将实验代码编译烧录至开发板中,本实验使用串口输出调试信息,因此需将开发板的 PA9连接至 DAP 虚拟串口(或 USB 转 TTL 模块)的 RX引脚。完成连接后,可通过串口调试助手查看实验信息输出,如下图所示:


图2.1.3.2 串口调试助手显示内容


请使用浏览器的分享功能分享到微信等