STM32通过ADC1读取光敏电阻的值转换光照强度

发布者:NatureLover最新更新时间:2024-06-11 来源: elecfans关键字:STM32  ADC1  光敏电阻  光照强度 手机看文章 扫描二维码
随时随地手机看文章

【1】光敏电阻的原理

光敏电阻是一种半导体元件,它的电阻值会随着照射在其表面的光线强度的变化而发生改变。当光线越强,光敏电阻的电阻值就越小;当光线较弱或没有光照射时,电阻值就会增大。


光敏电阻广泛应用于光电控制、光度计、自动调节亮度灯等领域。



常见的光敏电阻有硫化镉(CdS)光敏电阻和硒化铟(InSb)光敏电阻等。


与其他传感器相比,光敏电阻具有以下优点:


灵敏度高:对光线强度的变化非常敏感。

响应速度快:一般情况下响应时间只需几毫秒。

易于集成:小巧轻便,易于安装和集成到各种设备中。

价格低廉:相对于其他光电传感器,光敏电阻的价格较为低廉。

但是,光敏电阻也有其缺点。由于光敏电阻本身的特性,其输出不太稳定,精度较低,并且受环境光线干扰较大。因此,在实际应用中,需要根据具体情况进行选择并对其输出信号进行适当的处理和滤波才能得到准确的测量结果。


【2】STM32采集光敏电阻值的代码

以下是一个基于STM32F103C8T6和光敏电阻的示例代码,它可以采集光敏电阻的数据并通过串口打印出来。请注意,此示例使用了HAL库和CubeMX配置工具。


cCopy Code#include 'main.h'

#include 'stdio.h'

#include 'string.h'

ADC_HandleTypeDef hadc1;

UART_HandleTypeDef huart1;

float LightIntensity;

int main(void)

{

 HAL_Init();

 SystemClock_Config();

 MX_GPIO_Init();

 MX_ADC1_Init();

 MX_USART1_UART_Init();

 while (1)

  {

  // 启动ADC转换

  HAL_ADC_Start(&hadc1);

  // 等待转换完成

  HAL_ADC_PollForConversion(&hadc1, 100);

  // 获取ADC转换结果

  uint16_t adc_value = HAL_ADC_GetValue(&hadc1);

  // 将ADC转换结果转换为光线强度

  LightIntensity = (float)adc_value / 4095 * 100;

  // 将数据打印到串口

  char msg[50];

  sprintf(msg, 'Light intensity: %.2f%%n', LightIntensity);

  HAL_UART_Transmit(&huart1, (uint8_t*)msg, strlen(msg), 1000);

  // 延迟一段时间再次采集

  HAL_Delay(5000);

  }

}

void SystemClock_Config(void)

{

 RCC_OscInitTypeDef RCC_OscInitStruct = {0};

 RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

 /** Configure the main internal regulator output voltage 

 */

 __HAL_RCC_PWR_CLK_ENABLE();

 __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

 /** Initializes the RCC Oscillators according to the specified parameters

 * in the RCC_OscInitTypeDef structure.

 */

 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;

 RCC_OscInitStruct.HSEState = RCC_HSE_ON;

 RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;

 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;

 RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;

 RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;

 if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)

  {

  Error_Handler();

  }

 /** Initializes the CPU, AHB and APB buses clocks

 */

 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK

               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;

 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;

 RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;

 RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;

 RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

 if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)

  {

  Error_Handler();

  }

}

static void MX_ADC1_Init(void)

{

 ADC_ChannelConfTypeDef sConfig = {0};

 /** Common config 

 */

 hadc1.Instance = ADC1;

 hadc1.Init.ScanConvMode = DISABLE;

 hadc1.Init.ContinuousConvMode = ENABLE;

 hadc1.Init.DiscontinuousConvMode = DISABLE;

 hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;

 hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;

 hadc1.Init.NbrOfConversion = 1;

 if (HAL_ADC_Init(&hadc1) != HAL_OK)

  {

  Error_Handler();

  }

 /** Configure Regular Channel 

 */

 sConfig.Channel = ADC_CHANNEL_1;

 sConfig.Rank = ADC_REGULAR_RANK_1;

 sConfig.SamplingTime = ADC_SAMPLETIME_13CYCLES_5;

 if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)

  {

  Error_Handler();

  }

}

static void MX_USART1_UART_Init(void)

{

 huart1.Instance = USART1;

 huart1.Init.BaudRate = 115200;

 huart1.Init.WordLength = UART_WORDLENGTH_8B;

 huart1.Init.StopBits = UART_STOPBITS_1;

 huart1.Init.Parity = UART_PARITY_NONE;

 huart1.Init.Mode = UART_MODE_TX_RX;

 huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; 

 huart1.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart1) != HAL_OK) { Error_Handler(); }

}

static void MX_GPIO_Init(void) 

{

    GPIO_InitTypeDef GPIO_InitStruct = {0};

    /* GPIO Ports Clock Enable */

    __HAL_RCC_GPIOA_CLK_ENABLE();

    /*Configure GPIO pin : PA1 */

    GPIO_InitStruct.Pin = GPIO_PIN_1;

    GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;

    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

}

void Error_Handler(void) 

{

    while(1);

}

#ifdef  USE_FULL_ASSERT

void assert_failed(uint8_t *file, uint32_t line) 

{

}

#endif

在此代码中,PA1被配置成了模拟输入通道,并在ADC采样时使用。通过将采集到的ADC值转换为光线强度并打印出来,可以实现对光敏电阻的测量。


关键字:STM32  ADC1  光敏电阻  光照强度 引用地址:STM32通过ADC1读取光敏电阻的值转换光照强度

上一篇:【驱动方案】基于STM32的300W无刷直流电机驱动方案
下一篇:STM32入门学习笔记之MPU6050传感器解析实验1

推荐阅读最新更新时间:2024-11-01 21:31

STM32窗口看门狗(警犬)
二、窗口看门狗 独立看门狗主要用来监测硬件,窗口看门狗主用来监测软件。 窗口看门狗通常被用来监测,由外部干扰或不可预见的逻辑条件(程序)造成的应用程序背离正常的运行序列而产生的软件故障。除非递减计数器的值在T6位变成0前被刷新,看门狗电路在达到预置的时间周期时,会产生一个MCU复位。如果在递减计数器达到窗口寄存器值之前刷新控制寄存器中的7位递减计数器值,也会产生MCU复位。这意味着必须在限定的时间窗口内刷新计数器(即喂狗)。 窗口看门狗 (WWDG) 时钟由 APB1 时钟经预分频后提供,通过可配置的时间窗口来检测应用程序非正常的过迟或过早的操作。 1、主要特性 窗口看门狗跟独立看门狗一样,也是一个递减计数器不断的往下
[单片机]
<font color='red'>STM32</font>窗口看门狗(警犬)
STM32系统嘀嗒定时器实现1ms中断事件
int main() { //系统定时器实现周期性1000hz中断事件,即1ms SysTick_Config(SystemCoreClock / 1000); } void SysTick_Handler(void) { static uint32_t cnt=0; cnt++;//记500次之后,=500ms,点灯 if(cnt =500) { cnt=0; 灯亮; } } 最大的定时时间: 如果是168MHZ, 2^24 ÷ 168000000=99.86ms
[单片机]
官方STM32的NUCLEO开发板使用
概述:因工作需求,先买了stm32的NUCLEO开发板做测试板,本人使用的是L073RZ这块板子,也是第一次接触stm32,摸索状态。这里记录一下使用过程,做笔记的同时希望也可以对别人有点帮助。 1,准备 既然要使用这块板子,那么对这块板子我们肯定是需要基本了解一下的,怎么测试,如何测试,供电问题,调试问题我们都需要看看官方文档。 这里贴一个NUCLEO开发板手册下载地址http://www.stmcu.org/document/detail/index/id-214946.里面详细的说了开发板的功能,如何使用,原理图等,有不懂的不明白的查查这手册。 在手册的5.1节,就说了如何开始使用。我把原文贴下,顺便简单翻译
[单片机]
官方<font color='red'>STM32</font>的NUCLEO开发板使用
基于STM32的RA8806控制器LCD设计
0 引言 在现代电子设备中,触摸屏的应用使电子设备更智能化、人性化。在手机、导航仪、电子仪器、咨询终端等设备中,作为信息交流的媒介,触摸屏具有界面编程灵活、反应速度快、功耗低、体积小的特点。 RA8806是一个文字与绘图模式相结合的点矩阵液晶显示控制器,最大能驱动640×240或320×480分辨率的LCD液晶触摸屏,可以显示文字、图片、符号等复杂信息,支持文字、图片混合显示和区域卷动,支持90°,180°,270°的文字旋转显示,支持4/8 b的8080和6800系列两种MPU接口,提供4×8或8×8的键盘扫描接口,提供使用者自行创建字型及符号的功能,可以进行文字对齐、设置粗体字、设置行间距和LCD对比度、背光调节。
[单片机]
基于<font color='red'>STM32</font>的RA8806控制器LCD设计
stm32 Flash读写
通过对stm32内部的flash的读写可以实现对stm32的编程操作。 stm32 的内置可编程Flash在许多场合具有十分重要的意义。如其支持ICP特性使得开发人员对stm32可以警醒调试开发,可以通过JTAG和SWD接口对stm32进行程序烧写;支持IAP特性使得开发人员可以在stm32运行程序的时候对其内部程序进行更新操作。对一些对数据安全有要求的场合,可编程FLASH可以结合stm32内部唯一的身份标识实现各种各样的防破解方案。并且stm32的FLASH在一些轻量级的防掉电存储方案中也有立足之地。 stm32的FLASH分为主存储块和信息块。主存储块用于保存具体的程序
[单片机]
STM32定时器学习笔记
TIMx是由16位计数器,预分频器,自动装载寄存器构成 计数器:16位(0-65535) 预分频器16位(寄存器控制的计数器) 预分频为1是每一个时间脉冲计数器加1,预分频为2每两个时间脉冲计1. 自动装载寄存器:每次溢出事件的自动装载设置的计数值。 深度剖析:、 计数器的范围(0-65535) 预分频器的范围(0-65535) 由于STM32F103最大支持的频率是72Mhz,所以设置的时候应该注意二者之间的,一般自动装载计数器设置较大若设置10000-1,将预分频书设置为72-1,可以实现1s的计时。可以理解为每72个时钟脉冲计数器加1,计数器加到10000-1的时候定时器产生一次溢出事件。
[单片机]
STM32裸机编程的基础知识(3)
MCU 启动和向量表 当 STM32F429 MCU 启动时,它会从 flash 存储区最前面的位置读取一个叫作 “向量表” 的东西。“向量表” 的概念所有 ARM MCU 都通用,它是一个包含 32 位中断处理程序地址的数组。对于所有 ARM MCU,向量表前 16 个地址由 ARM 保留,其余的作为外设中断处理程序入口,由 MCU 厂商定义。越简单的 MCU 中断处理程序入口越少,越复杂的 MCU 中断处理程序入口则会更多。 STM32F429 的向量表在数据手册表 62 中描述,我们可以看到它在 16 个 ARM 保留的标准中断处理程序入口外还有 91 个外设中断处理程序入口。 在向量表中,我们当前对前
[单片机]
<font color='red'>STM32</font>裸机编程的基础知识(3)
STM32 UART2程序
USART1程序很多,看看USART2程序。注意红色部分,首先要使能相关端口的时钟。 因为USART2可以映射成不同的端口,所以要端口映射。 结合你自己的开发板,设置正确的映射口.(正点原子的是PA03PA02.) STM32F103ZE默认的USART2就是PA03PA02,如果配置映射,USART2端口是PD05PD06了。 程序在正点原子开发板SRAM中调试通过,开发环境IAR5.30. void USART2_Initialise( u32 bound ) { GPIO_InitTypeDef GPIO_InitStructure;//I/O¿ú3õê¼»ˉ½á11ìå NVIC_InitTypeDef N
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved