STM32-光敏传感器实验

news2024/9/21 20:51:01

光敏传感器的主要是光敏二极管,核心是PN结,利用了光电效应,对光强很敏感,有单向导电性,工作时需要加反向电压。光照越强,等效电阻越小。

实验要求通过ADC3通道6(PF8)采集光敏二极管的电压,然后转换为0~100的光纤强度值并显示在液晶屏上。

由下图可知对于的通道是PF8

  首先确定我们的最小刻度,Vref = 3.3V,所以0V <= Vin <= 3.3V,所以最小刻度是3.3V / 4096(2^12)。

接下来确定转换时间。采样时间239.5个ADC时钟周期为例,可以得到转换时间为21us。

时间转换公式参考如下公式:Tcvtmin=(12.5+X)周期=(12.5 + X)/(12MHz)=21us。

因为使用的是单通道,所以不使用扫描模式。因为未使用到DMA,所以使用单次扫描模式。

由于光敏二极管是光照越强,阻值越小,获取的电压值与光强关系成负相关,所以在处理数据的时候需要在取互补的部分。

 

接下来编写我们的函数代码:

接下来编写函数文件代码adc_l.c:

#include "./BSP/ADC/adc_l.h"
 
ADC_HandleTypeDef g_adc_handle;
 
void adc_init(void){
 
    ADC_ChannelConfTypeDef adc_ch_conf;
 
    g_adc_handle.Instance = ADC3;
    g_adc_handle.Init.DataAlign = ADC_DATAALIGN_RIGHT; //右对齐
    g_adc_handle.Init.ScanConvMode = ADC_SCAN_DISABLE; //不扫描
    g_adc_handle.Init.ContinuousConvMode = DISABLE; //单次模式
    g_adc_handle.Init.NbrOfConversion = 1; //转换通道数为1,单通道
    g_adc_handle.Init.DiscontinuousConvMode = DISABLE; //不用间断模式
    g_adc_handle.Init.NbrOfDiscConversion = 0; //无间断模式则无间断通道
    g_adc_handle.Init.ExternalTrigConv = ADC_SOFTWARE_START; //外部软件触发
 
    HAL_ADC_Init(&g_adc_handle);
    HAL_ADCEx_Calibration_Start(&g_adc_handle);
 
    adc_ch_conf.Channel = ADC_CHANNEL_1;
    adc_ch_conf.Rank = ADC_REGULAR_RANK_1; //转换顺序
    adc_ch_conf.SamplingTime = ADC_SMAPLINGTIME_239CYCLES_5; //设置为最大值
 
    HAL_ADC_ConfigChannel(&g_adc_handle, &adc_ch_conf);
}
 
void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc){
 
    if(hadc->Instance == ADC3){
        GPIO_InitTypeDef gpio_init_struct;
        RCC_PeriphCLKInitTypeDef adc_clk_init = {0};
 
        __HAL_RCC_GPIOF_CLK_ENABLE();  //使能ADC时钟
        __HAL_RCC_ADC3_CLK_ENABLE();   //使能GPIO时钟
 
        gpio_init_struct.Pin = GPIO_PIN_8;
        gpio_init_struct.Mode = GPIO_MODE_ANALOG; //模拟模式
        HAL_GPIO_Init(GPIOF, &gpio_init_struct);
 
        adc_clk_init.PeriphClockSelection = RCC_PERIPHCLK_ADC; //选择ADC外设时钟设置
        adc_clk_init.AdcClockSelection = RCC_ADCPCLK2_DIV6; //选择6分频,72/6=12MHz
 
        HAL_RCCEx_PeriphCLKConfig(&adc_clk_init, &g_adc_handle);
    }
}
 
uint32_t adc_get_result(void){
 
    HAL_ADC_Start(&g_adc_handle);
    HAL_ADC_PollForConversion(&g_adc_handle, 10); //第二个参数比1大就行
    return (uint16_t)HAL_ADC_GetValue(&g_adc_handle);
}
 
uint32_t adc_get_result_average(uint32_t ch, uint8_t times){
 
    uint32_t temp_val = 0;
    uint8_t t;
 
    for(t = 0; t < times; t++){
        temp_val += adc_get_result();
        delay_ms(5);
    }
 
    return temp_val / times;
}

uint8_t lsens_get_val(void){

    uint32_t temp_val;

    temp_val = adc_get_result();
    temp_val /= 40;

    if(temp_val > 100) temp_val = 100;

    return (uint8_t)(100 - temp_val);
}

再编写函数头文件adc_l.h:

#ifndef __ADC_L_H
#define __ADC_L_H
 
extern ADC_HandleTypeDef g_adc_handle;
 
void adc_init(void);
void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc);
uint32_t adc_get_result(void);
uint32_t adc_get_result_average(uint32_t ch, uint8_t times);
 
#endif

最后编写我们的主函数代码main.c:

#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./USMART/usmart.h"
#include "./BSP/LED/led.h"
#include "./BSP/LCD/lcd.h"
#include "./BSP/LSENS/lsens.h"


int main(void)
{
    short adcx;

    HAL_Init();                                 /* 初始化HAL库 */
    sys_stm32_clock_init(RCC_PLL_MUL9);         /* 设置时钟, 72Mhz */
    delay_init(72);                             /* 延时初始化 */
    usart_init(115200);                         /* 串口初始化为115200 */
    led_init();                                 /* 初始化LED */
    lcd_init();                                 /* 初始化LCD */
    lsens_init();                               /* 初始化光敏传感器 */

    lcd_show_string(30,  50, 200, 16, 16, "STM32", RED);
    lcd_show_string(30,  70, 200, 16, 16, "LSENS TEST", RED);
    lcd_show_string(30,  90, 200, 16, 16, "ATOM@ALIENTEK", RED);
    lcd_show_string(30, 110, 200, 16, 16, "LSENS_VAL:", BLUE);

    while (1)
    { 
        adcx = lsens_get_val();
        lcd_show_xnum(30 + 10 * 8, 110, adcx, 3, 16, 0, BLUE); /* 显示ADC的值 */
        LED0_TOGGLE();   /* LED0闪烁,提示程序运行 */
        delay_ms(250);
    }
}

到这里我们的函数代码便编写完成了

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

geoserver安装与发布服务过程

geoserver是做地图领域开发必会的插件之一&#xff0c;今天我们来分享多种安装方式与发布服务过程&#xff1a; 一、安装下载 1、官网地址&#xff1a;GeoServer 进入下载页面选择下载的版本&#xff0c;我这里选择2.22.3的稳定版本。 来到&#xff1a; 多种安装包可选&#…

科研er如何查询学术期刊分区信息?

文章目录 引言&#xff1a;为什么要查询学术期刊分区信息&#xff1f;1.使用LetPub查询1.1.LetPub简介1.2.查询步骤 2.使用《中科院文献情报中心期刊分区表》进行查询2.1.《中科院文献情报中心期刊分区表》简介2.2.查询步骤 引言&#xff1a;为什么要查询学术期刊分区信息&…

Linux man手册什么都找不到 常见问题总结

1.尝试安装缺少的page sudo yum[或者apt-get] install manpages-de manpages-de-dev manpages-dev glibc-doc manpages-posix-dev manpages-posix 安装成功后解决了没有pages的问题,如果还是查不到,则可能是找不到pages的问题 2.更新Gcc 或 G 后导致路径变化 man手册的所有…

每日一练 | 网络工程师软考真题 Day2

1、某工程制定的开发方案中定义了3个任务&#xff0c;其中任务A首先开始&#xff0c;且需要3周完成&#xff0c;任务周完B必须在任务A启动1周后开始&#xff0c;且需要2周完成&#xff0c;任务C必须在任务A后才能开始&#xff0c;且需要完成2周完成。该工程的进度安排可用下面的…

案例12:Java宠物医院预约管理系统设计与实现开题报告

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

CCF大数据与计算智能大赛-基于人工智能的漏洞数据分类冠军方案

基于人工智能的漏洞数据分类 前言 为及时跟踪国际信息安全趋势&#xff0c;需对国际公开的漏洞数据内容进行及时统计和梳理&#xff0c;例如CVE漏洞平台。CVE平台的漏洞信息包含有CVE编号、漏洞评分、漏洞描述等内容&#xff0c;其中漏洞描述含有对漏洞的利用条件、受影响的范…

Windows下快速启动Kafka以及三种发送消息的方式

目录 一、下载Kafka 二、启动kafka 2.1 启动kafka前得先启动zk 2.2 启动kafka 三、操作Kafka 3.1 创建 Kafka 主题&#xff08;Topic&#xff09; 3.2 将信息写入主题&#xff08;Topic&#xff09; 3.3 读取信息 四、Java实践-三种发送消息的方式 4.1 异步发送-无回…

登录appuploader

登录appuploader 常规使用登录方法 双击appuploader.exe 启动appuploader 点击底部的未登录&#xff0c;弹出登录框 在登录框内输入apple开发者账号 如果没有apple开发者账号&#xff0c;只是普通的apple账号&#xff0c;请勾选上未支付688 然后软件会提示输入验证码&#…

Go语言中sync.Mutex和sync.WaitGroup的用法

目录 【goroutine的调度器】 【Go语言的sync包】 【sync.Mutex】 sync.Mutex 底层原理 sync.Mutex 其它用法 【sync.RWMutex】 sync.RWMutex 实现原理 【sync.WaitGroup】 Go 并发编程中存在的难题&#xff1a;并发编程不像是传统的串行编程&#xff0c;程序的运行存在…

chatgpt批量生成网站文章-chatgpt批量生成自媒体的文章

怎么用chatgpt批量生成文章符合SEO优化的文章 ChatGPT是一款功能强大、智能化的自然语言处理模型&#xff0c;可以用于生成符合SEO优化的文章。以下是一些建议&#xff1a; 确定主题和关键词&#xff1a;在开始生成文章之前&#xff0c;需要先确定文章的主题和关键词。这有助于…

张益唐直播报告学术报告,零点猜想问题终于被解决(文末可获取论文原文)

原创 | 文BFT机器人 8日上午9点&#xff0c;张益唐教授带着一支黑笔、一块白板现身b站直播&#xff0c;全网超10万人在线观看&#xff0c;从直播消息放出开始&#xff0c;大家就早早端好了小板凳等着教授精彩开讲&#xff01; 直播40分钟一堂课的时长&#xff0c;知识点一个接…

《人月神话》译文修订明细(1)-读者可以对照修改

DDD领域驱动设计批评文集>> 《软件方法》强化自测题集>> 《软件方法》各章合集>> 《人月神话》译文修订如下&#xff0c;读者可以对照自己手上的书修改。 相关阅读 这回真要动刀子-征集《人月神话》中译本的翻译修正>> 第一章 原译文 它们最后都…

金山办公的WPS AI将引入大模型能力(LLM)到表格、文字、演示和PDF四大组件

&#x1f680; 金山办公的WPS AI将引入大模型能力&#xff08;LLM&#xff09;到表格、文字、演示和PDF四大组件&#xff0c;并支持桌面电脑和移动设备。 金山办公的WPS AI将引入大模型能力&#xff08;LLM&#xff09;到表格、文字、演示和PDF四大组件&#xff0c;并支持桌面…

MySQL双写机制

MySQL双写机制的目的是什么&#xff1f;是如何实现的&#xff1f; 一、双写的目的 为了解决 partial page write 问题。 InnoDB 的Page Size一般是16KB&#xff0c;其数据校验也是针对这16KB来计算的&#xff0c;将数据写入到磁盘是以Page为单位进行操作的。而计算机硬件和操…

PCB——功放pcb设计

地线干扰 电子产品的地线设计是极其重要的&#xff0c;无论低频电路还是高频电路都必须要个遵照设计规则。高频、低频电路地线设计要求不同&#xff0c;高频电路地线设计主要考虑分布参数影响&#xff0c;一般为环地&#xff0c;低频电路主要考虑大小信号地电位叠加问题&#x…

拿下多个定点/比亚迪要上!这项技术要「降维打击」单目感知

2008年&#xff0c;斯巴鲁在全球首次推出了搭载有立体视觉摄像头的主动安全解决方案&#xff0c;并具有紧急制动功能的“EyeSight”。2010年&#xff0c;斯巴鲁推出升级版的“EyeSight”&#xff0c;成为世界上首个可以在全车速范围内避免碰撞的量产技术系统。 2014年&#xff…

自助式数据分析工具:jvs-sdw数据智仓-数据服务配置

配置化数据服务 数据服务是将JVS-SDW内部加工分析生成的数据集通过API的方式 开放给其他系统使用。 界面介绍 进入数据服务界面&#xff0c;左侧是展示系统内部已经配置完成的数据服务目录&#xff0c;右侧是展现的对应数据服务的详细配置情况。 目录新增&#xff0c;如下图所…

详解c++STL—容器deque

目录 1、deque容器的基本概念 1.1、功能 1.2、deque与vector区别 1.3、deque内部工作原理 2、deque构造函数 2.1、功能描述 2.2、函数原型 2.3、示例 3、deque赋值操作 3.1、功能描述 3.2、函数原型 3.3、示例 4、deque大小操作 4.1、功能描述 4.2、函数原型 4…

数据分析10——Pandas中格式化/分组聚合

0、前言&#xff1a; numpy是生成和处理array类型矩阵数据的工具&#xff0c;而pandas中的series&#xff08;一维矩阵&#xff09;和dataframe&#xff08;二维矩阵&#xff09;数据类型可以来自numpy生成的数据&#xff0c;pandas的重要之处在于他可以导入和处理多种格式类型…

GPT大语言模型Alpaca-lora本地化部署实践【大语言模型实践一】 | 京东云技术团队

模型介绍 Alpaca模型是斯坦福大学研发的LLM&#xff08;Large Language Model&#xff0c;大语言&#xff09;开源模型&#xff0c;是一个在52K指令上从LLaMA 7B&#xff08;Meta公司开源的7B&#xff09;模型微调而来&#xff0c;具有70亿的模型参数&#xff08;模型参数越大…