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

这篇具有很好参考价值的文章主要介绍了STM32-ADC电压采样实验(寄存器版)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

stm32交流电压采样程序,# STM32,stm32,单片机,Powered by 金山文档

其能接受的电压输入范围一般为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传输方式进行,为了简洁实验,这里使用中断进行采集电压数据)

stm32交流电压采样程序,# STM32,stm32,单片机,Powered by 金山文档

具体配置代码如下:

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

stm32交流电压采样程序,# STM32,stm32,单片机,Powered by 金山文档
stm32交流电压采样程序,# STM32,stm32,单片机,Powered by 金山文档
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中断将自动清除,因此这里不需要手动清除标志位

stm32交流电压采样程序,# STM32,stm32,单片机,Powered by 金山文档
void ADC1_2_IRQHandler(void)
{   
    if (READ_BIT(ADC1->SR, ADC_SR_EOC)) 
    {
        ADC_ConvertedValue = ADC1->DR;
    }

主循环

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

计算公式参考野火:

stm32交流电压采样程序,# STM32,stm32,单片机,Powered by 金山文档
    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);  
    }

实验结果

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

stm32交流电压采样程序,# STM32,stm32,单片机,Powered by 金山文档

踩雷笔记

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

stm32交流电压采样程序,# STM32,stm32,单片机,Powered by 金山文档

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

stm32交流电压采样程序,# STM32,stm32,单片机,Powered by 金山文档

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

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

  1. 配置转换通道及开启转换需要在ADON启动并稳定后进行。文章来源地址https://www.toymoban.com/news/detail-614974.html

到了这里,关于STM32-ADC电压采样实验(寄存器版)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32 入门 —— 寄存器与 GPIO

    STM32 总线构图: 什么是寄存器 根据百度百科介绍,寄存器是中央处理器内的组成部分。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和地址。简单来说,寄存器就是存放东西的东西,存放的东西是指令、数据或地址 存放数据的寄存器最容易理解,不同

    2024年02月04日
    浏览(27)
  • STM32存储器映射以及寄存器映射

    目录 1.STM32的寻址范围? 2.存储器映射 3.存储器功能划分(以STM32F1为例) 4.寄存器映射 1.32位单片机有32根地址线,每根地址线有两种状态,导通或者不导通。 2.单片机内存地址访问的存储单元是按字节编址的,而不是bit。 比如我们要访问0x01这个地址,访问的其实是一个字节的空

    2024年04月23日
    浏览(23)
  • STM32的GPIO操作(寄存器&HAL)

    (注:此为乐某学习记录,若有出错的地方欢迎各位指出!) 本人使用的开发板的芯片是STM32H743XIH6,所以外设也是根据此芯片来介绍。 在使用HAL库配置的时候,需要安装STM32CubeMX。此软件可在ST官网下载,剩下的安装步骤比较简单,不会单独出篇进行讲解。 STM32CubeMX下载网址

    2024年02月04日
    浏览(30)
  • STM32 寄存器配置笔记——GPIO配置输出

           本文主要介绍GPIO 作为输出时的寄存器配置。包括时钟配置,输出模式配置。以STM32F10xxx系列为例,配置PA8、PD2端口作为输出,输出高/低电平。         1)GPIO外设时钟          通过查找STM32F10xxx中文参考手册得知,GPIO PORT口的时钟配置在RCC_APB2ENR寄存器的第2~6位,

    2024年01月24日
    浏览(31)
  • 【STM32调试】寄存器调试不良问题记录持续版

    记录一些stm32调试过程中:不易被理解、存在使用误区、不清不楚、是坑、使用常识等方面的一些记录。本记录只包含stm32的内核以及外设等寄存器的调试,不包含业务方面。 使用低功耗功能前是否需要打开PWR时钟? 是需要先打开PWR时钟的,否则无法唤醒。 睡眠模式、停机模

    2024年01月18日
    浏览(23)
  • keil5 查看stm32 寄存器的值

    1 查看芯片内部寄存器的值,首先是在仿真状态下,首先仿真,程序运行。 2 点击菜单栏的 View - System viewer ,右侧便会出现芯片的所有寄存器(如果没有,需要添加),点击要查看的寄存器,便会出现在侧边栏上 可以查看值,也可以直接设置寄存器的值。 3 如果没有出现,如下

    2024年01月24日
    浏览(22)
  • STM32 寄存器操作 GPIO 与下降沿中断

    寄存器本质就是一个开关,当我们把芯片寄存器配置指定的状态时即可使用芯片的硬件能力。 寄存器映射表则是开关的地址说明。对于我们希望点亮 GPIO_B 的一个灯来说,需要关注以下的两个寄存器:   对于我们实现希望点亮一个灯的需求来说,不仅需要配置配置 GPIO_B 的时

    2024年02月20日
    浏览(28)
  • STM32微机系统框架、内存、存储器、寄存器

    大家好,我是 杰哥嵌入式开发 最近在出定时器系列, 但是线下班有一些学生在学习完C语言之后, 在51接触各种寄存器和对软件代码各种操作是如何在单片机系统中起到作用的感到非常的不解, 经过我的初步分析,是对嵌入式微机系统的大概雏形系统框架不熟悉导致。 所以

    2024年02月06日
    浏览(32)
  • 【STM32 CubeMX】HAL库的本质读写寄存器

    在嵌入式系统开发中,HAL(Hardware Abstraction Layer)库是一个重要的概念,它提供了一个抽象层,使开发者可以更容易地编写可移植的代码,而不必担心底层硬件的细节。STM32CubeMX是一款由STMicroelectronics提供的工具,用于生成STM32微控制器的初始化代码,其中包括了HAL库的使用。

    2024年02月20日
    浏览(25)
  • 【STM32】读写BKP备份寄存器&RTC实时时钟

    目录 BKP BKP简介 BKP基本结构 BKP测试代码 RTC RTC简介 RTC框图 RTC基本结构 硬件电路 RTC操作注意事项 接线图 初始化 使用BKP解决只初始化一次时间  初始化参考代码 RTC设置时间 RTC读取时间 完整代码 MyRTC.c MyRTC.h main.c BKP(Backup Registers)备份寄存器 BKP可用于存储用户应用程序数据

    2024年04月22日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包