基于hal库用stm32f407写一份adc采样光敏电阻的代码,.c文件和.h文件分开
时间: 2024-03-23 08:41:04 浏览: 134
以下是基于HAL库用STM32F407写一份ADC采样光敏电阻的代码,分为.c文件和.h文件:
adc.h:
```
#ifndef __ADC_H
#define __ADC_H
#include "stm32f4xx_hal.h"
void ADC_Init(void);
uint16_t ADC_Read(void);
#endif /* __ADC_H */
```
adc.c:
```
#include "adc.h"
ADC_HandleTypeDef hadc;
void ADC_Init(void)
{
ADC_ChannelConfTypeDef sConfig;
__HAL_RCC_ADC1_CLK_ENABLE();
hadc.Instance = ADC1;
hadc.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;
hadc.Init.Resolution = ADC_RESOLUTION_12B;
hadc.Init.ScanConvMode = DISABLE;
hadc.Init.ContinuousConvMode = DISABLE;
hadc.Init.DiscontinuousConvMode = DISABLE;
hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc.Init.NbrOfConversion = 1;
hadc.Init.DMAContinuousRequests = DISABLE;
hadc.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
if (HAL_ADC_Init(&hadc) != HAL_OK)
{
Error_Handler();
}
sConfig.Channel = ADC_CHANNEL_0;
sConfig.Rank = 1;
sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;
sConfig.Offset = 0;
if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
{
Error_Handler();
}
}
uint16_t ADC_Read(void)
{
uint16_t ADC_Value = 0;
if (HAL_ADC_Start(&hadc) != HAL_OK)
{
Error_Handler();
}
if (HAL_ADC_PollForConversion(&hadc, 100) != HAL_OK)
{
Error_Handler();
}
ADC_Value = HAL_ADC_GetValue(&hadc);
return ADC_Value;
}
```
在这个例子中,我们假设光敏电阻的输出通过一个电位器连接到了ADC1的通道0上,采样时使用了3个时钟周期,采样结果以12位精度返回。
在main.c中调用ADC_Init()函数初始化ADC,并使用ADC_Read()函数读取ADC的采样结果,然后根据光敏电阻的特性将其转换成光线的强度。
注意:在使用ADC时需要先配置GPIO引脚的模式和速率,这里省略了GPIO的配置代码。
阅读全文