stm32f103 标准库ADC电压采集程序
时间: 2023-08-24 07:07:10 浏览: 103
以下是基于STM32F103标准库的ADC电压采集程序示例:
```c
#include "stm32f10x.h"
void ADC_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
// ADC GPIO 初始化
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 使能GPIOA时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; // PA1作为ADC通道1的输入信号
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; // 模拟输入模式
GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化GPIOA
// ADC 初始化
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); // 使能ADC1时钟
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; // 独立模式
ADC_InitStructure.ADC_ScanConvMode = DISABLE; // 单通道模式
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; // 单次转换模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // 转换触发源为软件触发
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; // 数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 1; // 转换通道数为1
ADC_Init(ADC1, &ADC_InitStructure); // 初始化ADC1
// ADC 通道配置
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_55Cycles5); // 通道1,采样时间为55.5个周期
// ADC 转换器校准
ADC_ResetCalibration(ADC1); // 复位ADC1校准寄存器
while(ADC_GetResetCalibrationStatus(ADC1)); // 等待复位完成
ADC_StartCalibration(ADC1); // 开始ADC1校准
while(ADC_GetCalibrationStatus(ADC1)); // 等待校准完成
}
u16 ADC_GetValue(void)
{
ADC_SoftwareStartConvCmd(ADC1, ENABLE); // 开始转换
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); // 等待转换完成
return ADC_GetConversionValue(ADC1); // 返回转换结果
}
float ADC_GetVoltage(u16 adcValue)
{
return (float)adcValue * 3.3 / 4096; // 根据电压分压原理计算电压值
}
```
在`main()`函数中,调用`ADC_Init()`函数进行ADC初始化,然后调用`ADC_GetValue()`函数获取ADC采集的原始值,最后调用`ADC_GetVoltage()`函数计算电压值。
示例代码中,PA1作为ADC通道1的输入信号,采样时间为55.5个周期,参考电压为3.3V。根据电压分压原理,如果输入电压不超过3.3V,则可以通过计算ADC采集的原始值得到输入电压的值。
阅读全文