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