VD6283TX环境光传感器驱动开发(4)----移植闪烁频率代码

VD6283TX环境光传感器驱动开发----4.移植闪烁频率代码

  • 闪烁定义
  • 视频教学
  • 样品申请
  • 源码下载
  • 开发板设置
  • 开发板选择
  • IIC配置
  • 串口配置
  • 开启X-CUBE-ALS软件包
  • 时钟树配置
  • ADC使用定时器触发采样
  • KEIL配置
  • FFT代码配置
  • app_x-cube-als.c
  • 需要添加函数

闪烁定义

光学闪烁被定义为人造光源的脉动或波动的光现象。
在低频闪烁中,光是可见的(人眼能够察觉光的闪烁)。超过100 Hz的光学闪烁对于人眼来说不再可见,但仍然存在,可能对人体产生影响。
大多数类型的人造光源在连接到电力主网(家庭或商业办公室)时会发出闪烁,这主要取决于国家的电力频率,通常是50 Hz或60 Hz。
由于电流在光源中的交替流动,所有人造光源都会分别在50 Hz和60 Hz电力主网下发出100 Hz或120 Hz的闪烁频率。
为了消除可见的闪烁并减少对人体的影响,大多数发光二极管(LED)使用脉冲宽度调制(PWM)调光方法,以实现更高的闪烁频率。
VD6283传感器可以检测光的闪烁频率,最高可达2 kHz。
最近在弄ST的课程,需要样片的可以加群申请:615061293 。

在这里插入图片描述

视频教学

https://www.bilibili.com/video/BV1xu4y1t75n/

VD6283TX环境光传感器驱动开发(2)----获取光强和色温

样品申请

https://www.wjx.top/vm/OhcKxJk.aspx#

源码下载

开发板设置

在手册种给出了,闪烁手册可以查看AN5639,资料链接如下。
https://www.st.com/content/ccc/resource/technical/document/application_note/group1/9f/7e/8c/ce/36/85/4c/08/DM00776948/files/DM00776948.pdf/jcr:content/translations/en.DM00776948.pdf

在这里插入图片描述

在AN5639手册中,需要对SB3进行连接。

在这里插入图片描述
同时GPIO2需要接到MCU的ADC通道中。

在这里插入图片描述

查看X-NUCLEO-6283A1手册,可以看到VD6283TX的GPIO2连接到MCU的ADC端口0-2。

在这里插入图片描述

在VD6283TX-SATEL中,可以看到VD6283TX通过SB3连接到了AFLR_1V8。
需要将AFLR_1V8接到开发板的A0端口中。

在这里插入图片描述

开发板选择

这里使用NUCLEO-F401RE 开发板。
在这里插入图片描述

IIC配置

在这里插入图片描述

串口配置

在这里插入图片描述

开启X-CUBE-ALS软件包

在这里插入图片描述

时钟树配置

在这里插入图片描述

ADC使用定时器触发采样

在app_als_adc_utils.c中,定义了ADC使用的频率,为8000Hz。
在这里插入图片描述

定时器的arr设置为10500-1,那么定时器频率为8000Hz。
Trigger Event Selection :update event 定时器自动更新。
在这里插入图片描述
配置ADC检测VD6283TX的GPIO2管脚的AD值。
设置触发方式为外部触发,选择刚刚配置的TIM2,触发方式为上升沿触发。

在这里插入图片描述

开启中断。
在这里插入图片描述

KEIL配置

在这里插入图片描述

FFT代码配置

arm_cortexM4lf_math.lib 库包含了一系列数学函数,特别是适用于基于Cortex-M4和Cortex-M7处理器的浮点运算单元的优化数学例程。这些例程涵盖了常见的数学运算,如信号处理、滤波、变换等。
arm_math.h 这个头文件包含了CMSIS-DSP库的函数声明、宏定义和结构体定义等,可以通过包含这个头文件,使用库中提供的各种数学函数,包括信号处理、滤波、变换等。
添加arm_cortexM4lf_math.lib文件。
在这里插入图片描述
在这里插入图片描述

同时导入arm_math.h文件。
在这里插入图片描述

app_x-cube-als.c

由于需要进行FFT算法,所以需要添加对应数学头文件。

#define ARM_MATH_CM4
#include "arm_math.h"
#include "app_als_adc_utils.h"

添加对应的函数申明。


#define FLK_CHANNEL	(5U)/** Increasing the value of the FLK_DATA_SIZE symbol will increase* processing time, flicker accuracy and memory footprint*/
#define FLK_DATA_SIZE (1024U)
#define FFT_SIZE (FLK_DATA_SIZE)/* Private variables ---------------------------------------------------------*/
static uint8_t is_quit_requested;
static uint8_t is_autogain_requested;
static int16_t flk_data[FLK_DATA_SIZE];
volatile uint8_t ALS_EventDetected;/** The FFT of a real N-point sequence has even symmetry in the frequency domain.* The second half of the data equals the conjugate of the first half flipped in frequency.* Looking at the data, we see that we can uniquely represent the FFT using only N/2 complex numbers.* These are packed into the output array in alternating real and imaginary components:* X = { real[0], imag[0], real[1], imag[1], real[2], imag[2] ... real[(N/2)-1], imag[(N/2)-1 }*/
static arm_rfft_fast_instance_f32 instance_fft;
static float32_t fft_in[FLK_DATA_SIZE];
static float32_t fft_out_tmp[FFT_SIZE];
static float32_t fft_out[FFT_SIZE/2];/** The FFT of a real N-point sequence has even symmetry in the frequency domain.* The second half of the data equals the conjugate of the first half flipped in frequency.* Looking at the data, we see that we can uniquely represent the FFT using only N/2 complex numbers.* These are packed into the output array in alternating real and imaginary components:* X = { real[0], imag[0], real[1], imag[1], real[2], imag[2] ... real[(N/2)-1], imag[(N/2)-1 }*/
static arm_rfft_fast_instance_f32 instance_fft;static void MX_VD6283A1_AnalogFlicker_Process(void); static float32_t complex_abs(float32_t real, float32_t complex);
static void init_fft(arm_rfft_fast_instance_f32 *instance, uint32_t size);
static void perform_fft(arm_rfft_fast_instance_f32 *instance, int16_t *data, float32_t *ffti, float32_t *ffto, uint32_t size);
static void find_flk_freq(uint32_t fs, float32_t *ffto, uint32_t *freq, uint8_t skip_dc, uint32_t size);static int32_t flicker_autogain(uint8_t Instance, uint32_t *pAppliedGain, uint32_t timeoutMs);static void display_gain(uint32_t gain);

在MX_VD6283A1_LuxCCT_Init()函数中添加init_fft快速傅里叶变换初始化。
在这里插入图片描述

static void MX_VD6283A1_LuxCCT_Init(void)
{/* Initialize Virtual COM Port */BSP_COM_Init(COM1);printf("VD6283TX Lux / CCT Example\n\n");display_commands_banner();/* initialize ARM FFT library */init_fft(&instance_fft, FFT_SIZE);status = VD6283A1_LIGHT_SENSOR_Init(LIGHT_SENSOR_INSTANCE_0);if (status){printf("VD6283A1_LIGHT_SENSOR_Init failed\n");while(1);}
}

初始化完毕之后,添加频率获取函数。

static void MX_VD6283A1_AnalogFlicker_Process(void)
{uint32_t fs; /* sampling frequency */uint32_t pos = 0; uint32_t flk_freq = 0;uint32_t index;uint32_t current_gain;uint32_t current_exposure;/* initialize exposure time */VD6283A1_LIGHT_SENSOR_SetExposureTime(LIGHT_SENSOR_INSTANCE_0, 100000);VD6283A1_LIGHT_SENSOR_GetExposureTime(LIGHT_SENSOR_INSTANCE_0, &current_exposure);printf("Exposure set to %lu us\n", (unsigned long)current_exposure);/* initialize gain */flicker_autogain(LIGHT_SENSOR_INSTANCE_0, &current_gain, 1);printf("Channel %u gain set to", FLK_CHANNEL);display_gain(current_gain);status = als_adc_start(&fs);if (status){printf("ADC Start failed\n");while (1);}VD6283A1_LIGHT_SENSOR_StartFlicker(LIGHT_SENSOR_INSTANCE_0, FLK_CHANNEL, LIGHT_SENSOR_FLICKER_ANALOG);while (!is_quit_requested){status = als_adc_get_frame(&flk_data[pos], &index);/* fill the ADC frame buffer */if (status == 0){pos += ADC_FRAME_SIZE;}/* if the ADC frame buffer is full, then process it */if (pos == FLK_DATA_SIZE){perform_fft(&instance_fft, flk_data, fft_in, fft_out, FFT_SIZE);find_flk_freq(fs, fft_out, &flk_freq, 1, FFT_SIZE);pos = 0; /* reset position index */printf("Flicker freq: %4lu Hz\r", (unsigned long)flk_freq);fflush(stdout);if (is_autogain_requested == 1){VD6283A1_LIGHT_SENSOR_StopFlicker(LIGHT_SENSOR_INSTANCE_0);flicker_autogain(LIGHT_SENSOR_INSTANCE_0, &current_gain, 1);printf("Channel %u gain set to", FLK_CHANNEL);display_gain(current_gain);VD6283A1_LIGHT_SENSOR_StartFlicker(LIGHT_SENSOR_INSTANCE_0, FLK_CHANNEL, LIGHT_SENSOR_FLICKER_ANALOG);is_autogain_requested = 0;}}handle_cmd(get_key());}als_adc_stop();VD6283A1_LIGHT_SENSOR_StopFlicker(LIGHT_SENSOR_INSTANCE_0);VD6283A1_LIGHT_SENSOR_DeInit(LIGHT_SENSOR_INSTANCE_0);printf("Quitting the demo...\n");while (1);
}

在MX_X_CUBE_ALS_Process函数中开启频率获取函数,关闭光强获取函数MX_VD6283A1_LuxCCT_Process。
在这里插入图片描述

添加增益设置函数。

/** @brief find and apply appropriate gain value depending on saturation value* @warning this function mustn't be called when a capture is ongoing*/
static int32_t flicker_autogain(uint8_t Instance, uint32_t *pAppliedGain, uint32_t timeoutMs)
{int32_t res;uint8_t i, j;uint8_t idx = 7; /* start with mid-table value */const uint8_t sat_limit = 2;uint32_t saturation;/* duplicate 0x42AB to avoid 100x and keep multiples of 2 for array size */const uint16_t Gains[] = {0x42AB, 0x42AB, 0x3200, 0x2154, 0x1900, 0x10AB, 0x0A00, 0x0723,0x0500, 0x0354, 0x0280, 0x01AB, 0x0140, 0x0100, 0x00D4, 0x00B5};/* clip timeout value */timeoutMs = timeoutMs == 0 ? 1 : timeoutMs;timeoutMs = timeoutMs >= 100 ? 100 : timeoutMs;for (i = 0; i <= 3; i++){VD6283A1_LIGHT_SENSOR_SetGain(Instance, FLK_CHANNEL, Gains[idx]);VD6283A1_LIGHT_SENSOR_GetGain(Instance, FLK_CHANNEL, pAppliedGain);res = VD6283A1_LIGHT_SENSOR_StartFlicker(Instance, FLK_CHANNEL, LIGHT_SENSOR_FLICKER_ANALOG);if (res)return res;/* read saturation value each ms so we can exit early if saturation detected */for (j = 0; j < timeoutMs; j++){HAL_Delay(1);res = VD6283A1_LIGHT_SENSOR_GetSaturation(Instance, &saturation);if (res)return res;if (saturation > sat_limit)break;}res = VD6283A1_LIGHT_SENSOR_StopFlicker(Instance);if (res)return res;/* update index to next value */if (i)idx += saturation > sat_limit ? 1 << (i - 1) : -(1 << (i - 1));else if (saturation > sat_limit)idx++;}/* clip index if it reaches max value */if (idx > 15) idx = 15;VD6283A1_LIGHT_SENSOR_SetGain(Instance, FLK_CHANNEL, Gains[idx]);res = VD6283A1_LIGHT_SENSOR_GetGain(Instance, FLK_CHANNEL, pAppliedGain);return res;
}

在下方添加函数的定义。

/** @brief initilize arm rfft library*/
static void init_fft(arm_rfft_fast_instance_f32 *instance, uint32_t size)
{arm_rfft_fast_init_f32(instance, size);
}

打印增益函数。

/** @brief normalize, convert and dislay gain */
static void display_gain(uint32_t gain)
{uint32_t g = (gain * 100) / 256;printf(" %3lu.%02lu\n", (unsigned long)g / 100, (unsigned long)(g % 100));
}

执行FFT。

/** @brief perform fft on the input buffer using arm rfft library*/
static void perform_fft(arm_rfft_fast_instance_f32 *instance, int16_t *flk, float32_t *ffti, float32_t *ffto, uint32_t size)
{uint32_t i;uint32_t index = 0;/* copy the ADC sampled signal into the fft input buffer* this allows to convert the data from int16_t to float32_t */for (i = 0; i < size; i++){ffti[i] = flk[i];}/* Perform the FFT on the input buffer:* results are packed in a way so that even indexes contain real values* and odd indexes contain the complex value of each bin.* Therefore the fft_output array contains FFT_SIZE / 2 bins */arm_rfft_fast_f32(instance, ffti, fft_out_tmp, 0);/* Calculate the magnitude for each bin from the temp fft output buffer */for (i = 0; i < size; i += 2){ffto[index] = complex_abs(fft_out_tmp[i], fft_out_tmp[i+1]);if (ffto[index] < 0) ffto[index] = 0;index++;}
}

查找峰值频率值。

/** @brief find peak frequency value*/
static void find_flk_freq(uint32_t fs, float32_t *ffto, uint32_t *freq, uint8_t skip_dc, uint32_t size)
{uint32_t i;uint32_t res;uint32_t index_max = 0;uint32_t limit = size / 2;float32_t max_value = -1;/* do not take account of the DC value if the flag skip_dc is set */skip_dc ? (i = 1) : (i = 0);/* run through the output array to detect the peak */for (; i < limit; i++){if (ffto[i] > max_value){index_max = i;max_value = ffto[i];}}/* convert index of the bin into frequency */res = (index_max * fs) / size;/* return the result if the pointer is valid */if (freq){*freq = res;}
}

计算一个复数的绝对值。

/** @brief compute absolute value of a complex number*/
static float32_t complex_abs(float32_t real, float32_t complex)
{float32_t res;arm_sqrt_f32(real * real + complex * complex, &res);return res;
}

需要添加函数

arm_cortexM4lf_math.lib 库包含了一系列数学函数,特别是适用于基于Cortex-M4和Cortex-M7处理器的浮点运算单元的优化数学例程。这些例程涵盖了常见的数学运算,如信号处理、滤波、变换等。
arm_math.h 这个头文件包含了CMSIS-DSP库的函数声明、宏定义和结构体定义等,可以通过包含这个头文件,使用库中提供的各种数学函数,包括信号处理、滤波、变换等。
app_als_adc_utils.c功能主要包括启动和停止ADC采样,获取采样数据,ADC采样速度设置,以及处理相关的硬件中断。
app_als_adc_utils.h是app_als_adc_utils.c对应头文件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/148374.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

量化交易全流程(六)

本节目录 多因子风险模型 自从股票市场产生以来&#xff0c;大量的学者、业界人员都在研究股票的价格波动究竟是由什么决定的。一个明显的事实是&#xff0c;股票的价格波动一定是由多种因素决定的&#xff0c;比如大盘因素、市值因素和行业因素。对于大盘因素&#xff0c;股…

uniapp项目实践总结(二十七)苹果应用商店上架教程

导语&#xff1a;之前介绍了如何打包一个苹果安装包文件&#xff0c;如果想要上架苹果 ios 应用商店&#xff0c;那么就来这里学习一下方法吧。 目录 准备材料上架步骤审核事项 准备材料 基本信息 构建版本&#xff1a;需要一个 ipa 格式安装包&#xff1b;logo&#xff1a…

一文拿捏Spring之IOC、循环依赖、Spring的设计模式

1.IOC(控制反转)与DI(依赖注入) &#x1f31f;面试题(IOC-DI): IOC控制反转是一种实现对象解耦的思想。传统情况下是采用new的方式来创建对象&#xff0c;这个对象是由我们来直接控制的&#xff0c;但是有了IOC后&#xff0c;我们可以在IOC运行期间通过DI动态的将依赖的对象进…

数组结构与算法

文章目录 数据结构与算法稀疏数组sparse队列单向链表双向链表单向环形列表&#xff1a;CircleSingleLinkedList栈递归排序算法快速排序思路 树赫夫曼树 &#xff08;HuffmanTree&#xff09;二叉排序树&#xff08;Binary sort tree&#xff09;构建二叉树遍历二叉树 平衡二叉树…

分布式架构篇

1、微服务 微服务架构风格&#xff0c;就像是把一个单独的应用程序开发为一套小服务&#xff0c;每个服务运行在自己的进程中&#xff0c;并使用轻量级机制通信&#xff0c;通常是 HTTP API。这些服务围绕业务能力来构建&#xff0c;并通过完全自动化部署机制来独立部署。这些…

【3】c++设计模式——>UML表示类之间的关联关系

关联关系 关联&#xff08;Assocition&#xff09;关系是类与类之间最常见的一种关系&#xff0c;它是一种结构化的关系&#xff0c;表示一个对象与另一个对象之间有联系&#xff0c;如汽车和轮胎、师傅和徒弟、班级和学生等。在UML类图中&#xff0c;用&#xff08;带接头或不…

列表的增删改查和遍历

任务概念 什么是任务 任务是一个参数为指针&#xff0c;无法返回的函数&#xff0c;函数体为死循环不能返回任务的实现过程 每个任务是独立的&#xff0c;需要为任务分别分配栈称为任务栈&#xff0c;通常是预定义的全局数组&#xff0c;也可以是动态分配的一段内存空间&#…

华为云云耀云服务器L实例评测|部署在线影音媒体系统 Jellyfin

华为云云耀云服务器L实例评测&#xff5c;部署在线影音媒体系统 Jellyfin 一、云耀云服务器L实例介绍1.1 云服务器介绍1.2 产品规格1.3 应用场景1.4 支持镜像 二、云耀云服务器L实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置 三、部署 Jellyfin3.1 Jellyfin 介绍3.2 Docke…

全志ARM926 Melis2.0系统的开发指引④

全志ARM926 Melis2.0系统的开发指引④ 编写目的7. 固件打包脚本7.1.概要描述7.2.术语定义7.2.1. makefile7.2.2. image.bat 7.3.工具介绍7.4.打包步骤7.4.1. makefile 部分7.4.2. image.bat 部分 7.5.问题与解决方案7.5.1. 固件由那些文件构成7.5.2. melis100.fex 文件包含什么…

十天学完基础数据结构-第五天(栈(Stack)和队列(Queue))

栈的定义和特点 栈是一种线性数据结构&#xff0c;它遵循后进先出&#xff08;LIFO&#xff09;原则。栈具有以下基本概念和特点&#xff1a; 栈顶&#xff1a;栈的顶部元素&#xff0c;是唯一可访问的元素。 入栈&#xff1a;将元素添加到栈顶。 出栈&#xff1a;从栈顶移除…

CUDA C编程权威指南:1.1-CUDA基础知识点梳理

主要整理了N多年前&#xff08;2013年&#xff09;学习CUDA的时候开始总结的知识点&#xff0c;好长时间不写CUDA代码了&#xff0c;现在LLM推理需要重新学习CUDA编程&#xff0c;看来出来混迟早要还的。 1.CUDA 解析&#xff1a;2007年&#xff0c;NVIDIA推出CUDA&#xff08…

微信小程序button按钮去除边框去除背景色

button边框 去除button边框 在button上添加plain“true”在css中添加button.avatar-wrapper {background: none}用于去除button背景色在css中添加button.avatar-wrapper[plain]{ border:0 }用于去除button边框

SpringMVC(二)@RequestMapping注解

我们先新建一个Module。 我们的依赖如下所示&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaL…

NXP公司K60N512+PWM控制BLDC电机

本篇文章介绍了使用NXP公司提供的塔式快速原型系统来驱动控制带霍尔传感器的无刷直流电机。文章涉及的塔式快速原型系统主要包括以下四个独立板卡&#xff1a;1.塔式系统支撑模块&#xff08;TWR-Elevator&#xff09;&#xff0c;用以连接微控制器以及周边模块&#xff1b;2.低…

Android开源 Skeleton 骨架屏 V1.3.0

目录 一、简介 二、效果图 三、引用 Skeleton 添加jitpack 仓库 添加依赖: 四、新增 “块”骨架屏 1、bind方法更改和变化&#xff1a; 2、load方法更改和变化&#xff1a; 五、关于上一个版本 一、简介 骨架屏的作用是在网络请求较慢时&#xff0c;提供基础占位&…

LabVIEW开发带式谱感测技术

LabVIEW开发带式谱感测技术 如今&#xff0c;通过无线网络传输的数据量正在迅速增加&#xff0c;并导致频谱稀缺。超过数十亿的无线设备将被连接起来&#xff0c;并需要互联网接入。因此&#xff0c;无线电频谱管理方案的效率不足以授予对所有设备的访问权限。在频谱分配中&am…

开源白板工具 Excalidraw 架构解读

本文讲解开源白板工具 Excalidraw 的架构设计。 版本 0.16.1 技术栈 Vite React TypeScript Yarn Husky。 脚手架原来是用的是 Create React App&#xff0c;但这个脚手架已经不维护了&#xff0c;一年多没发布新版本了。 目前市面上比较流行的 React 脚手架是 Vite&…

CSS学习小结

css的两种使用方式&#xff1a; ①内嵌样式表 ②导入外部样式表&#xff08;实际开发常用&#xff09;<link href"...." rel"stylesheet"/> 选择器&#xff1a; ①标签选择器&#xff1a;通过标签种类决定 ②类选择器&#xff1a;class"..…

SSRF+redis未授权漏洞复现

1.SSRF漏洞简介 SSRF&#xff08;Server-Side Request Forgery&#xff09;即服务器端请求伪造&#xff0c;是一种由攻击者构造攻击链传给服务器&#xff0c;服务器执行并发起请求造成安全问题的漏洞&#xff0c;一般用来在外网探测或攻击内网服务。当网站需要调用指定URL地址…

nodejs+vue养老人员活体鉴权服务系统elementui

系统 统计数据&#xff1a;统计报表、人员台账、机构数据、上报数据、核验报表等&#xff0c;养老人员活体鉴权服务是目前国家养老人员管理的重要环节&#xff0c;主要为以养老机构中养老人员信息为基础&#xff0c;每月进行活体鉴权识别并统计数据为养老补助等管理。前端功能&…