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

发布时间:2024-06-11  

【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值转换为光线强度并打印出来,可以实现对光敏电阻的测量。


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>