stm32利用adc采集光敏电阻电压的代码
时间: 2024-12-18 09:07:43 浏览: 70
STM32利用ADC采集光敏电阻电压的一般步骤涉及初始化ADC、设置通道配置和读取值。这里是一个简单的示例代码片段,假设我们使用的是STM32F103系列单片机,并且光敏电阻连接到ADC的AIN0通道:
```c
#include "stm32f1xx_hal.h"
// 定义ADC通道
#define ADC_CHANNEL_LIGHT_SENSOR 0
// 光敏电阻采样时间
#define ADC_TIMEOUT 1000 // 单位:毫秒
// 初始化ADC
void ADC_Init(void) {
GPIO_InitTypeDef GPIO_InitStructure;
ADC_HandleTypeDef hadc;
// 配置光敏电阻的GPIO输入
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_PIN_0; // AIN0
GPIO_InitStructure.GPIO_Mode = GPIO_MODE_INPUT;
GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_FREQ_LOW;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 初始化ADC
hadc.Instance = ADC1;
hadc.Init.ClockPrescaler = ADC_CLOCKPRESCALER_DIV2; // 分频系数选择
hadc.Init.Resolution = ADC_RESOLUTION_12B;
hadc.Init.ScanConvMode = DISABLE; // 单次转换模式
hadc.Init.ContinuousConvMode = DISABLE;
hadc.Init.DiscontinuousConvMode = DISABLE;
hadc.Init.NbrOfConversion = 1; // 只转换一次
hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;
HAL_ADC_Init(&hadc);
// 开启ADC
HAL_ADC_Start(&hadc); // 发起转换
}
// 读取并处理ADC值
float ReadLightSensorVoltage(void) {
uint16_t rawValue;
float voltage;
// 等待转换完成
if (HAL_ADC_PollForConversion(&hadc, ADC_TIMEOUT) == HAL_OK) {
rawValue = HAL_ADC_GetValue(&hadc); // 获取ADC结果
// 将模拟值转换为电压值,假设VREFINT = 3.3V
voltage = ((float)rawValue * (3.3F / 4095)) * 1000; // 转换范围从0V到3.3V,单位:毫伏
} else {
voltage = -1; // 如果超时则返回错误值
}
return voltage;
}
int main(void) {
ADC_Init();
while (1) {
float lightVoltage = ReadLightSensorVoltage();
// 打印或处理光敏电阻电压值
printf("当前光敏电阻电压: %.2f mV\n", lightVoltage);
delay_ms(1000); // 每秒采集一次
}
return 0;
}
```
阅读全文