光敏电阻传感器
原理图

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类似的情况也发生在值的时候。当时的解决方案是读两遍。在这种情况下,可以做适当的延迟,但我不知道为什么。当我自己写这个程序时,我成功地写了它。没有位置交换问题。因此,如果有位置交换问题,我可以在阅读时做适当的延迟。