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值的时候也发生过类似的情况,当时的解决方案是读两次,那这个的话,可以做适当的延时,但是我不知道为啥,我自己写这个程序的时候一写就成功了,没有位置交换的问题,所以,有位置交换了的问题的,可以在读取的时候做适当延时哈哈。

  • 0
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wu小燕呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值