STM32-ADC电压采样实验(寄存器版)

2023-11-11

STM32F10X系列支持三路ADC,其ADC通道及对应IO口如下表所示:

其能接受的电压输入范围一般为0-3.3V(VREF- ≤ VIN ≤ VREF+),因此,如果需要测量超出0-3.3v量程范围的电压数据,需要在外围硬件增加分压电阻,将电路转换到0-3.3V量程范围内再进行采集。

引脚配置

这里用于做ADC采集的引脚使用单片机的PC1,将引脚配置为模拟输入模式。

void ADC_GPIO_INIT(void)
{
    SET_BIT(RCC->APB2ENR,RCC_APB2ENR_IOPCEN);//开GPIOC端口时钟
    GPIOC->CRL &= ~(0xf<<4);//模拟输入模式 PC1
}

ADC采样与中断配置

本次实验使用中断进行对ADC的连续采样操作,采样使用规则通道。配置ADC CR2寄存器的EOCIE位,在转换完成后产生中断。(在实际运用场景中,为了避免频繁产生中断影响程序其他功能运行,通常采用定时器+DMA传输方式进行,为了简洁实验,这里使用中断进行采集电压数据)

具体配置代码如下:

CR1初始化时,直接将所有位清0,因此在配置时可以忽略部分功能的配置,减少了代码量。具体寄存器对应位参考stm32f10x手册。

static void ADCx_Mode_Config(void)
{
SET_BIT(RCC->APB2ENR,RCC_APB2ENR_ADC1EN);//开ADC1外设时钟
SET_BIT(RCC->CFGR,RCC_CFGR_ADCPRE_DIV6);//设置ADC分频因子,6分频,72/6=12MHZ

ADC1->CR1=0;//初始化

SET_BIT(ADC1->CR2,ADC_CR2_CONT);//配置连续转换模式
SET_BIT(ADC1->CR1,ADC_CR1_EOCIE);//开EOC中断
    
ADC1->CR2|=7<<17; //软件控制转换
ADC1->CR2|=1<<20; //使用用外部触发(SWSTART)

ADC1->CR2&=~(1<<11); //右对齐

ADC1->SQR1&=~(0XF<<20);
ADC1->SQR1|=0<<20; //1 个转换
//设置通道 11 的采样时间
ADC1->SMPR1&=~(3*1); //通道 11 采样时间清空
ADC1->SMPR1|=7<<(3*1); //通道 11 239.5 周期,提高采样时间可以提高精确度

ADC1->CR2|=1<<0; //开启 AD 转换器
ADC1->CR2|=1<<3; //使能复位校准
while(ADC1->CR2&1<<3); //等待校准结束
ADC1->CR2|=1<<2; //开启 AD 校准
while(ADC1->CR2&1<<2); //等待校准结束

ADC1->SQR3&=0XFFFFFFE0;//初始化ADC转换通道
ADC1->SQR3|=ADC_Channel_11;//配置通道为11
ADC1->CR2|=1<<22; //开启转换

NVIC_SetPriority(ADC1_2_IRQn, 1);//配置中断优先级
NVIC_EnableIRQ(ADC1_2_IRQn);//开中断
}

中断执行函数

由于状态寄存器SR中的EOC标志位规定,在读取DR寄存器的值后,EOC中断将自动清除,因此这里不需要手动清除标志位

void ADC1_2_IRQHandler(void)
{   
    if (READ_BIT(ADC1->SR, ADC_SR_EOC)) 
    {
        ADC_ConvertedValue = ADC1->DR;
    }

主循环

每一次ADC转换完成后,将产生中断,在中断中读取DR的值,由计算公式计算出实际电压值

计算公式参考野火:

    while (1)
    {
        ADC_ConvertedValueLocal =(float) ADC_ConvertedValue/4096*3.3; 
    
        printf("\r\n The current AD value = 0x%04X \r\n", 
               ADC_ConvertedValue); 
        printf("\r\n The current AD value = %f V \r\n",
               ADC_ConvertedValueLocal); 
        printf("\r\n\r\n");
        Delay(0xffffee);  
    }

实验结果

通过扭动开发板上的滑动变阻器,能够实时采样到改变的电压值,实验通过。

踩雷笔记

  1. STM32F10X中文常考手册中对于ADC校准的说明

手册提到,校准前ADC必须处于关电状态,这里存在错误,根据英文手册:

应该为在ADON开启并稳定后再进行adc的校准。校准的值将储存在DR寄存器中。如果没有进行校准,采样的ADC将存在误差。

  1. STM32中断函数名是有固定命名的,只有设置正确的中断函数名,程序才可以正常进入中断执行程序中,具体中断函数名列表在STM32F10X.H中查阅。

  1. 配置转换通道及开启转换需要在ADON启动并稳定后进行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32-ADC电压采样实验(寄存器版) 的相关文章

随机推荐

  • Android Studio创建无图标应用 Default Activity not fount

    在Android Studio开发 如果你想创建一个没有没有应用图标的应用 你会发现 修改category修改为default 项目中没有一个Activity是Laucnher的话 没法运行 直接报Default Activity not
  • NLP学习(十二)-NLP实战之LSTM进行文本情感分析-tensorflow2+Python3

    情感分析简介 文本情感分析 Sentiment Analysis 是自然语言处理 NLP 方法中常见的应用 也是一个有趣的基本任务 尤其是以提炼文本情绪内容为目的的分类 它是对带有情感色彩的主观性文本进行分析 处理 归纳和推理的过程 本文将
  • JavaWeb——邮件发送原理及实现

    邮件发送原理及实现 一 邮件发送原理图 张三通过smtp协议连接到Smtp服务器 然后发送一封邮件给网易的邮件服务器 网易分析发现需要去QQ的邮件服务器 通过Smtp协议将邮件转投给QQ的Smtp服务器 QQ将接收到的邮件存储在456789
  • 【动手学习pytorch笔记】37.4 BERT微调数据集

    BERT微调数据集 自然语言推断任务 主要研究 假设 hypothesis 是否可以从前提 premise 中推断出来 其中两者都是文本序列 换言之 自然语言推断决定了一对文本序列之间的逻辑关系 这类关系通常分为三种类型 蕴涵 entail
  • 算法中的双指针思想及常见应用

    算法中的双指针思想及常见应用 最近在刷leetcode 碰到了许多双指针类的题目 题目是根据githubCyC大佬 在这里总结下 所谓双指针 指的是在遍历对象的过程中 不是普通的使用单个指针进行访问 而是使用两个相同方向或者相反方向的指针进
  • mybatis执行自定义SQL语句

    在mybatis中执行自定义SQL语句 本次仍使用spring boot 其中关于引入mybatis和数据库配置不再说明 UserInfoMapper xml 映射文件
  • 404 not found是什么意思

    相信很多人都会遇到404 也有很多人遇到404不知道是什么意思 也不知道怎么解决 下面我们php中文网就为大家全面解答一下404 not found是什么意思 打造全网web前端全栈资料库 总目录 看完学的更快 掌握的更加牢固 你值得拥有
  • Qt窗口间信号发送和槽函数返回值

    新建工程 Qt Widgets Application 类名为Widget 在这个基础上新建Qt设计师界面类 类名Dialog widget ui和dialog ui里分别拉入一个QPushbutton widget ui里再拉入一个QLi
  • Java中NIO,BIO,AIO的原理以及区别

    在今天的面试中 遇到一个复旦大学计算机博士 这确实牛逼一直问Java底层 问的我直冒汗 今天把问道我的分享出来 今天问到了NIO BIO AIO之间的原理和关系 我只知道阻塞和非阻塞之类的 具体的区别不是很清楚 所以查询资料好好复习下他们之
  • 用于分析脉冲类信号的二阶瞬态提取变换研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 文献来源 该文提出一种高分辨率时频分析方法
  • 非线性优化-matlab函数库-optimset

    创建或编辑一个最优化参数选项 句法规则 options optimset param1 value1 param2 value2 设置所有参数及其值 未设置的为默认值 options optimset optimfun 设置与最优化函数有关
  • pikvm系统主要软件包解析备忘

    PI KVM让普通家用PC也有能够像数据中心机房里面的IP KVM一样的功能 详细信息参考官网 PiKVM HandbookOpen and cheap DIY IP KVM on Raspberry Pihttps docs pikvm
  • 架构基础概念

    系统 系统泛指一群有 关联 的个体组成 根据某种 规则 运作 能完成个别元件不能单独完成 的工作群体 子系统 其实子系统也是由一群有关联的个体所组成的系统 多半是更大系统中的一部分 模块 软件模块是一套一致而互相有紧密关联的软件组织 它分别
  • 深度学习模型试跑(七):SETR(Swin-Transformer-Semantic-Segmentation版)

    文章目录 一 前言 二 环境搭建 1 安装cuda和对应的cudnn 2 安装vs2019 3 安装pytorch 4 安装mmcv 和 mmsegmentation 5 拷贝MMSegmentation 三 测试 四 训练 一 前言 源码
  • WordPress给博客文章页添加个性名片

    食用教程 本文以子比主题为例 插入HTML代码 进入主题设置 gt 文章 列表 gt 文章页面 gt 文章插入内容 gt 在文章内容后 插入内容 gt 粘贴HTML代码 div class business center div class
  • ReID专栏(二)多尺度设计与应用

    前言 多尺度流层可以更有效地提取多尺度信息 而基于显著性的学习融合层有利于重要特征通道的自动选择 因此MuDeep在学习鉴别模式方面很强大 其实这也是目前大多数深度学习任务发表论文的趋势 即多尺度 显著性特征的表示 本教程禁止转载 同时 本
  • STATE模式

    STATE模式 有限状态自动机 FSM 是一种抽象 为了将复杂问题简单化 容易理解 并且易于实现和修改 使用有限状态自动机的好处是 即使是复杂系统 也可以清晰的展现系统状态的变化 并且对于各种状态的变化不容易遗漏 1 问题描述 分布式系统中
  • 屏幕后处理特效

    Unity Shader入门精要学习笔记 第12章 屏幕后处理效果 屏幕后处理效果 screen post processing effects 是游戏中实现屏幕特效的常见方法 在本 章中 我们将学习如何在 Unity 中利用渲染纹理来实现
  • [指针五]指针做参数传递--使用详解

    void myMalloc char s 我想在函数中分配内存 再返回 s char malloc 100 void main char p NULL myMalloc p 这里的p实际还是NULL p的值没有改变 为什么 if p fre
  • STM32-ADC电压采样实验(寄存器版)

    STM32F10X系列支持三路ADC 其ADC通道及对应IO口如下表所示 其能接受的电压输入范围一般为0 3 3V VREF VIN VREF 因此 如果需要测量超出0 3 3v量程范围的电压数据 需要在外围硬件增加分压电阻 将电路转换到0