用标准库写stm32f103c8t6adc采集电压代码,并读取adc的值
时间: 2023-06-20 18:10:17 浏览: 98
STM32(F103)的ADC读取电压程序.rar
5星 · 资源好评率100%
以下是使用标准库写的stm32f103c8t6adc采集电压代码,并读取adc值的例子:
```c
#include "stm32f10x.h"
#include <stdio.h>
void ADC1_Init(void);
int main(void)
{
uint16_t adc_value;
float voltage;
ADC1_Init();
while(1)
{
ADC_SoftwareStartConvCmd(ADC1, ENABLE); // 启动ADC转换
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); // 等待转换完成
adc_value = ADC_GetConversionValue(ADC1); // 获取ADC值
voltage = (float)adc_value * 3.3 / 4096; // 计算电压值
printf("ADC Value:%d, Voltage:%.2fV\r\n", adc_value, voltage);
Delay(1000); // 延时1s
}
}
void ADC1_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1, ENABLE); // 打开GPIOA和ADC1时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // PA0连接ADC通道0
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
ADC_DeInit(ADC1); // 复位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);
ADC_Cmd(ADC1, ENABLE); // 使能ADC1
ADC_ResetCalibration(ADC1); // 复位校准寄存器
while(ADC_GetResetCalibrationStatus(ADC1)); // 等待校准复位完成
ADC_StartCalibration(ADC1); // 开始校准
while(ADC_GetCalibrationStatus(ADC1)); // 等待校准完成
}
```
在上面的代码中,我们首先定义了一个`ADC1_Init()`函数,用于初始化ADC1,然后在`main()`函数中调用该函数进行初始化。在`main()`函数中,我们使用`ADC_SoftwareStartConvCmd()`函数启动ADC转换,然后使用`ADC_GetFlagStatus()`函数等待转换完成,最后使用`ADC_GetConversionValue()`函数获取ADC值。我们还计算了电压值,并在串口上输出了ADC值和电压值。
请注意,由于我们使用了`printf()`函数打印输出,因此需要在代码中添加相应的库文件和初始化代码。此外,在上面的代码中,我们使用了一个名为`Delay()`的延时函数,您需要根据您的具体情况实现它。
阅读全文