STM32F103CBT6 ADC电压采样C代码
时间: 2024-06-23 12:01:56 浏览: 101
基于STM32F103的 ADC内部单路电压采集C代码.rar
STM32F103CBT6微控制器的ADC(Analog-to-Digital Converter)模块用于将模拟电压信号转换为数字信号。以下是一个简单的示例,展示如何配置并进行电压采样:
```c
#include "stm32f10x.h" // 包含STM32F103系列库头文件
// ADC初始化配置
ADC_HandleTypeDef hadc1; // ADC1初始化结构体
ADC_InitTypeDef adc_config;
// 配置ADC通道
uint16_t channel = ADC_CHANNEL_0; // 选择你要采样的通道,例如0号引脚
void ADC_Config(void)
{
// 初始化ADC1
hadc1.Instance = ADC1; // 设置ADC实例
hadc1.Init.ClockPrescaler = ADC_CLOCKPRESCALER_DIV2; // 分频系数,根据系统时钟调整
hadc1.Init.Resolution = ADC_RESOLUTION12B;
hadc1.Init.ScanConvMode = DISABLE; // 非扫描模式
hadc1.Init.ContinuousConvMode = DISABLE; // 非连续转换模式
hadc1.Init.DiscontinuousConvMode = DISABLE; // 非断续转换模式
hadc1.Init.NbrOfConversion = 1; // 只做一次转换
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; // 数据右对齐
hadc1.Init.DMAContinuousRequests = DISABLE; // 关闭DMA请求
HAL_ADC_Init(&hadc1); // 初始化ADC
// 配置单次转换
ADC_SoftwareStart(&hadc1); // 启动ADC
ADC箔(&hadc1, &channel); // 选择要转换的通道
}
int16_t ReadADCValue(void)
{
uint16_t adc_result; // 临时存储ADC转换结果
HAL_ADC_PollForConversion(&hadc1, ADC_TIMEOUT); // 等待转换完成
ADC_GetConversionValue(&hadc1, &adc_result); // 获取转换值
// 如果是12位分辨率,需要右移2位后除以4096得到电压值(假设VREF=3.3V)
float voltage = (float)(adc_result >> 2) * (3.3f / 4096.0f);
return voltage;
}
// 主程序中使用ADC
int main(void)
{
// 其他系统配置...
ADC_Config(); // 配置ADC
while (1)
{
float voltage_sample = ReadADCValue(); // 采样电压并打印
// 打印或处理电压值
printf("ADC Sample: %f V\n", voltage_sample);
}
}
阅读全文