STM32的ADC电压采集

时间记录:2024/2/9

一、ADC相关知识点

(1)STM32的ADC时钟不要超过14MHz,不然结果的准确率将下降

(2)ADC分为规则组和注入组,规则组相当于正常运行的程序,注入组相当于中断可以打断规则组的转换

(3)12位的数据,规则组最大可设置16个外部通道(序列),注入组最大可设置4个外部通道(序列)

(4)结果保存在16位数据寄存器中,可以设置数据左对齐或右对齐

(5)单次模式和连续模式,数据转化时,是否连续转化,单次模式,仅转化一次,连续模式,转化一次后从头开始重新转化

(6)扫描模式和非扫描模式,扫描模式,就是将序列中的数据从头到尾全部转化;非扫描模式,仅转化序列中的第一个

(7)几种转换模式介绍

1.单次非扫描模式:给出一个触发后会将序列1对应的通道数据进行转换,然后产生EOC中断,并且只转换1次

2.连续非扫描模式:给出一个触发后会将序列1对应的通道数据进行转换,数据转换完成后产生EOC中断,然后一直进行转换数据产生EOC中断的过程

3.单次扫描模式:给出一个触发后,开始从序列1开始向下转换对应的通道数据,全部序列的数据转换完毕后产生EOC中断,并且只转换1次

4.连续扫描模式:给出一个触发后,开始从序列1转换数据,全部转换完毕后产生EOC中断,然后继续开始转换数据产生EOC的过程

二、示例代码(单次、非扫描模式)

(1)头文件

c 复制代码
#ifndef __MYADC_H__
#define __MYADC_H__
#include "stm32f10x.h"

//adc初始化
void vAdcInit(void);
//获取电压值
float xAdcGetValue(void);

#endif

(2)源文件

c 复制代码
#include "my_adc.h"

void vAdcInit(void)
{
    //1.使能时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA,ENABLE);
    
    //2.配置初始化GPIO
    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;//模拟输入
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStruct);
    
    //3.设置ADC分频因子
    RCC_ADCCLKConfig(RCC_PCLK2_Div6);//ADC时钟72M/6=12M,不能超过14M
    
    //4.初始化ADC参数
    ADC_InitTypeDef ADC_InitStruct;
    ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;//数据对齐方式,右对齐
    ADC_InitStruct.ADC_ContinuousConvMode = DISABLE;//连续转换模式,非连续转换
    ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;//独立模式,只使用1个ADC时配置,ADC1和ADC2同时使用时配置为双重模式
    ADC_InitStruct.ADC_ScanConvMode = DISABLE;//扫描模式,非扫描模式
    ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//触发方式,外部触发、硬件或软件触发
    ADC_InitStruct.ADC_NbrOfChannel = 1;//转换的通道数
    ADC_Init(ADC1,&ADC_InitStruct);
    
    //5.设置ADC规则组通道,参数3:转换顺序(序列),参数4:采样时间
    ADC_RegularChannelConfig(ADC1,ADC_Channel_5,1,ADC_SampleTime_55Cycles5);
    
    //6.使能ADC
    ADC_Cmd(ADC1,ENABLE);
    
    //7.ADC校准
    ADC_ResetCalibration(ADC1);
    while(ADC_GetResetCalibrationStatus(ADC1) == SET);
    ADC_StartCalibration(ADC1);
    while(ADC_GetCalibrationStatus(ADC1));
}

float xAdcGetValue(void)
{
    uint16_t temp=0;
    ADC_SoftwareStartConvCmd(ADC1,ENABLE);//使能软件触发转换
    while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));//等待转换结束
    temp=ADC_GetConversionValue(ADC1);//获取电压值
    return (float)3.3*temp/4095;
}
相关推荐
scan15 小时前
单片机串口接收状态机STM32
stm32·单片机·串口·51·串口接收
Qingniu015 小时前
【青牛科技】应用方案 | RTC实时时钟芯片D8563和D1302
科技·单片机·嵌入式硬件·实时音视频·安防·工控·储能
Mortal_hhh7 小时前
VScode的C/C++点击转到定义,不是跳转定义而是跳转声明怎么办?(内附详细做法)
ide·vscode·stm32·编辑器
深圳市青牛科技实业有限公司7 小时前
【青牛科技】应用方案|D2587A高压大电流DC-DC
人工智能·科技·单片机·嵌入式硬件·机器人·安防监控
Mr.谢尔比8 小时前
电赛入门之软件stm32keil+cubemx
stm32·单片机·嵌入式硬件·mcu·信息与通信·信号处理
LightningJie8 小时前
STM32中ARR(自动重装寄存器)为什么要减1
stm32·单片机·嵌入式硬件
鹿屿二向箔8 小时前
STM32外设之SPI的介绍
stm32
西瓜籽@8 小时前
STM32——毕设基于单片机的多功能节能窗控制系统
stm32·单片机·课程设计
远翔调光芯片^1382879887211 小时前
远翔升压恒流芯片FP7209X与FP7209M什么区别?做以下应用市场摄影补光灯、便携灯、智能家居(调光)市场、太阳能、车灯、洗墙灯、舞台灯必看!
科技·单片机·智能家居·能源
极客小张12 小时前
基于STM32的智能充电桩:集成RTOS、MQTT与SQLite的先进管理系统设计思路
stm32·单片机·嵌入式硬件·mqtt·sqlite·毕业设计·智能充电桩