资讯详情

STM32 光敏电阻传感器&两路AD采集

光敏电阻传感器

原理图

Tr_AO:从模拟输出到连续模拟信号Tr_AO引脚输出。

Tr_DO:调节RP7.通过比较光敏电阻的分压值Tr_DO输出0或1。

代码

Photo.c

#include "Photo.h"  uint32_t Get_Adc2(void) {  uint32_t adc_value;    HAL_ADC_Start(&hadc2);  if(HAL_ADC_PollForConversion(&hadc2,10) == HAL_OK)  {   adc_value = HAL_ADC_GetValue(&hadc2);  }  return adc_value; }   

Photo.h

#ifndef _PHOTO_H_ #define _PHOTO_H_  #include "main.h" #include "adc.h"  uint32_t Get_Adc2(void);  #endif

显示分压值

void Lcd_Proc(void) {  if(uwTick - lcd_uwTick < 200)   return;  lcd_uwTick = uwTick;    sprintf((char *)lcd_disp_string,"photo_value: %d ",Get_Adc2());  LCD_DisplayStringLine(Line3,lcd_disp_string);  //" R-P:%.2fK  ", Get_Adc2() / (4096. - Get_Adc2()) * 10  sprintf((char *)lcd_disp_string," R-P:%.2fK  ", Get_Adc2() / (4096. - Get_Adc2()) * 10);  LCD_DisplayStringLine(Line4,lcd_disp_string);    if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_3) == GPIO_PIN_SET)  {   sprintf((char *)lcd_disp_string,"  DO: high ");  }  else  {   sprintf((char *)lcd_disp_string,"  DO: low  ");  }  LCD_DisplayStringLine(Line5,lcd_disp_string); }

两路AD采集

不同的收集AD不同的通道仍然很容易。以下是收集相同的通道AD不同的通道。

原理图

前部是对的ADC2的初始化,后面是通道的配置,但我们使用的是同一个AD不同的通道只能单独配置一个通道,所以我们可以获得它ADC分别配置值函数,删除函数中的配置。

还要注意这里引脚的配置。

2AD.c

#include "2AD.h"  uint32_t Get_adc1(void) {  uint32_t adc1;    ADC_ChannelConfTypeDef sConfig = {0};    sConfig.Channel = ADC_CHANNEL_17;   sConfig.Rank = ADC_REGULAR_RANK_1;   sConfig.SamplingTime = ADC_SAMPLETIME_640CYCLES_5;   sConfig.SingleDiff = ADC_SINGLE_ENDED;   sConfig.OffsetNumber = ADC_OFFSET_NONE;   sConfig.Offset = 0;     if (HAL_ADC_ConfigChannel(&hadc2, &sConfig) != HAL_OK)   {     Error_Handler();   }  HAL_ADC_Start(&hadc2);    if(HAL_ADC_PollForConversion(&hadc2,10) == HAL_OK)  {   adc1 = HAL_ADC_GetValue(&hadc2);  }  return adc1; }  uint32_t Get_adc2(void) {  uint32_t adc2;    ADC_ChannelConfTypeDef sConfig = {0};    sConfig.Channel = ADC_CHANNEL_13;   sConfig.Rank = ADC_REGULAR_RANK_1;   sConfig.SamplingTime = ADC_SAMPLETIME_640CYCLES_5;   sConfig.SingleDiff = ADC_SINGLE_ENDED;   sConfig.OffsetNumber = ADC_OFFSET_NONE;   sConfig.Offset = 0;      if (HAL_ADC_ConfigChannel(&hadc2, &sConfig) != HAL_OK)   {     Error_Handler();   }  HAL_ADC_Start(&hadc2);    if(HAL_ADC_PollForConversion(&hadc2,10) == HAL_OK)  {   adc2 = HAL_ADC_GetValue(&hadc2);  }  return adc2; }  

2AD.h

#include "main.h" #include "adc.h"  uint32_t Get_adc1(void); uint32_t Get_adc2(void);   

显示电压值函数

void Lcd_Proc(void) {  if(uwTick - lcd_uwTick < 200)   return;  lcd_uwTick = uwTick;    sprintf((char *)lcd_disp_string,"   RP5_V: %.2fV  ",Get_adc1() * 3.3 / 4096);  LCD_DisplayStringLine(Line2,lcd_disp_string);    sprintf((char *)lcd_disp_string,"   RP6_V: %.2fV  ",Get_adc2() * 3.3 / 4096);  LCD_DisplayStringLine(Line3,lcd_disp_string); }

有些人在阅读时会颠倒这两个值的顺序。记得在15单片机读两个AD类似的情况也发生在值的时候。当时的解决方案是读两遍。在这种情况下,可以做适当的延迟,但我不知道为什么。当我自己写这个程序时,我成功地写了它。没有位置交换问题。因此,如果有位置交换问题,我可以在阅读时做适当的延迟。

标签: rp5n连接电缆10rp电阻

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

 锐单商城 - 一站式电子元器件采购平台  

 深圳锐单电子有限公司