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

ATK-MB001模块使用说明


        1,硬件连接

       这里以正点原子M48Z-M3最小系统板STM32F103版为例,给大家介绍一下模块和板卡的连接方法。其它板卡与模块的硬件连接方法,请大家在“ATK-MB001光敏传感器模块\3,程序源码\相应板卡例程文件夹\readme.txt”路径下查看。

       光敏传感器模块可通过杜邦线与正点原子M48Z-M3最小系统板STM32F103版进行连接,具体的连接关系,如下表所示:



表1.1.1光敏传感器模块与M48Z-M3最小系统板STM32F103版连接关系 

        2,实验功能


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


       2.1.1 功能说明

       在本实验中,串口会打印光敏电阻模块DO端输出、AO端电压转换值和光照强度百分比值。需要查看这部分实验信息的用户,可用杜邦线将最小系统板STM32F103的PA9引脚和GND连接至外部的USB转串口设备,这样就可以通过XCOM上位机查看串口打印的信息了。

       用户还可以通过调节电位器来控制光照强度阈值。当检测到的光强度超过阈值时,DO输出低电平,模块指示灯STA点亮;当检测到的光强度低于阈值时,DO输出高电平,模块指示灯STA熄灭。同时,通过开发板的ADC采集AO引脚的模拟信号,用于分析光照强度,范围为0至100,数值越大光照越强。

       开发板的LED0闪烁,提示程序运行。


       2.1.2 源码解读

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


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


图2.1.2.2 ADC驱动代码


       2.1.2.1 光敏传感器模块驱动

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


       1. 函数atk_light_init()

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

/**
 * @brief       光敏传感器模块初始化函数
 * @param       无
 * @retval      无
 */
void atk_light_init(void)
{
    GPIO_InitTypeDef gpio_init_struct;
    ATK_LIGHT_DO_GPIO_CLK_ENABLE();                /* DO时钟使能 */
 
    gpio_init_struct.Pin = ATK_LIGHT_DO_GPIO_PIN;  /* DO引脚 */
    gpio_init_struct.Mode = GPIO_MODE_INPUT;            /* 输入 */
    gpio_init_struct.Pull = GPIO_NOPULL;              /* 无上下拉 */
    gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;   /* 高速 */
    HAL_GPIO_Init(ATK_LIGHT_DO_GPIO_PORT, &gpio_init_struct);     
 
    adc_init();                                             /* 初始化ADC */
}

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


       2. 函数atk_light_get_val ()

       该函数主要实现读取光敏传感器的光照强度数值。函数atk_light_get_val ()的具体代码,如下所示:

/**
 * @brief       读取光敏传感器值
 * @param       无
 * @retval      0~100:0,最暗;100,最亮
 */
uint8_t atk_light_get_val(void)
{
    uint32_t temp_val = 0;
    temp_val = adc_get_result_average(ADC_ADCX_CHY, 10);  /* 读取平均值 */
    temp_val /= 40;
 
    if (temp_val > 100)temp_val = 100;
 
    return (uint8_t)(100 - temp_val);
}

       atk_light_get_val 函数用于获取当前光照强度,该函数通过 adc_get_result_average 函数得到ADC通道转换的电压值,经过简单量化后,处理成 0~100 的光强值。 其中0 对应最暗, 100 对应最亮。


       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_light_init();                   
    
    while (1)
{
/* 获取ADC通道的转换值,10次取平均 */
        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("光敏传感器光照强度:%d\r\n", atk_light_get_val());    
        
        /* 光照强度超过预设阈值时的操作 */
        if(ATK_LIGHT == GPIO_PIN_RESET)
        {
            printf("光照强度超阈值!\r\n");
        }else
        {
            printf("光照强度未超阈值!\r\n");
        }
        printf("\r\n");
        
        LED0_TOGGLE();                  /* 闪烁LED,提示系统正在运行. */
        delay_ms(500);
    }
}

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

 

       2.1.3 实验现象

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


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


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