GD32+ADC+DMA定时采集+acs712霍尔电流传感器

2023-10-27

GD32+ADC+DMA定时采集+acs712霍尔电流传感器

目的:本文使用定时器定时触发adc采样,并且通过dma搬运数据。

环境:KEIL

GD32F107vct6+ADC01_IN5(PA5)+TIMER3 CH3

时钟初始化

  rcu_periph_clock_enable(RCU_ADC0);
  rcu_periph_clock_enable(RCU_DMA0);
  rcu_periph_clock_enable(RCU_TIMER3);
  rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV8);

通过GD32F450+TIM定时器(1)可知,芯片使用外部晶振,时钟频率是108MHz。
在这里插入图片描述
在这里插入图片描述
APB2的频率= 108Mhz。

rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV8) 初始化adc的时钟频率为13Mhz。

io初始化

 rcu_periph_clock_enable(RCU_GPIOA);
 rcu_periph_clock_enable(RCU_AF);//打开复用时钟
 gpio_init(GPIOA,GPIO_MODE_AIN,GPIO_OSPEED_50MHZ, GPIO_PIN_5);  

定时器初始化

  timer_parameter_struct initpara;
  timer_oc_parameter_struct ocpara;
  
  timer_deinit(TIMER3);
  initpara.alignedmode = TIMER_COUNTER_EDGE;
  initpara.clockdivision = TIMER_CKDIV_DIV1;
  initpara.counterdirection = TIMER_COUNTER_UP;
  initpara.period = SAMPLE_TIME;
  initpara.prescaler = 107;
  initpara.repetitioncounter = 0;
  timer_init(TIMER3,&initpara);
  
  ocpara.ocidlestate = TIMER_OC_IDLE_STATE_LOW;
  ocpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW;
  ocpara.ocnpolarity = TIMER_OCN_POLARITY_LOW;
  ocpara.ocpolarity = TIMER_OC_POLARITY_HIGH;
  ocpara.outputnstate = TIMER_CCXN_DISABLE;
  ocpara.outputstate = TIMER_CCX_ENABLE;//通道使能
  timer_channel_output_config(TIMER3,TIMER_CH_3,&ocpara);
  timer_channel_output_mode_config(TIMER3,TIMER_CH_3,TIMER_OC_MODE_PWM0);//pwm模式
  timer_channel_output_pulse_value_config(TIMER3,TIMER_CH_3,50);
  timer_auto_reload_shadow_enable(TIMER3);

SAMPLE_TIME:ADC采集数据间隔

ADC初始化

  adc_deinit(ADC0);
  adc_mode_config(ADC_MODE_FREE);//ADC独立工作
  adc_special_function_config(ADC0,ADC_CONTINUOUS_MODE,DISABLE);//不连续转换  
  adc_special_function_config(ADC0,ADC_SCAN_MODE,DISABLE);//不扫描 
  adc_data_alignment_config(ADC0,ADC_DATAALIGN_RIGHT);//右对齐
  adc_channel_length_config(ADC0,ADC_REGULAR_CHANNEL,1);//1个通道转换  
  adc_regular_channel_config(ADC0,0,ADC_CHANNEL_5,ADC_SAMPLETIME_13POINT5);//第0个序列,采样时间
  adc_external_trigger_config(ADC0,ADC_REGULAR_CHANNEL,ENABLE);//规则组外部触发使能
  adc_external_trigger_source_config(ADC0,ADC_REGULAR_CHANNEL,ADC0_1_EXTTRIG_REGULAR_T3_CH3);
  adc_enable(ADC0);
  DelayMicroSeconds(1);
  adc_calibration_enable(ADC0);//复位并校准
  adc_dma_mode_enable(ADC0);
  adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL);//规则组转换开始 

因为是用定时器定时触发采样,所以采用不连续模式。只有一个ADC通道,所以不扫描。

注意:adc_enable(ADC0)和adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL)的顺序不能颠倒。
在这里插入图片描述
在这里插入图片描述
从手册里可知,adc_enable()只是唤醒ADC,并不是开启转换。adc_software_trigger_enable()是开启规则组转换。

ADC_SAMPLETIME_13POINT5:采样时间

总转换时间=采样时间+12.5 个 ADCCLK 周期 = 26个ADCCLK周期= 26/13000000s = 2us。

定时器采集间隔一定要大于转换时间。

DMA初始化

  uint16_t rev_data[PER_NUM] = {0};
  dma_deinit(DMA0,DMA_CH0);
  init_struct.direction = DMA_PERIPHERAL_TO_MEMORY;//外设到寄存器
  init_struct.memory_addr = (uint32_t)(&rev_data);//存储器地址 
  init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;//地址自增
  init_struct.memory_width = DMA_MEMORY_WIDTH_16BIT;//16位
  init_struct.number = PER_NUM;//1个通道 PER_NUM个数据
  init_struct.periph_addr = (uint32_t)(&ADC_RDATA(ADC0));//外设地址
  init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;//外设不增
  init_struct.periph_width = DMA_PERIPHERAL_WIDTH_16BIT;//16位  取决于存储数据的类型
  init_struct.priority = DMA_PRIORITY_HIGH;//优先级
  dma_init(DMA0,DMA_CH0,&init_struct);
  dma_circulation_enable(DMA0,DMA_CH0);//循环模式
  nvic_irq_enable(DMA0_Channel0_IRQn, 1, 1);
  dma_interrupt_enable(DMA0,DMA_CH0,DMA_INT_FTF);//全部数据转换完成中断
  dma_channel_enable(DMA0,DMA_CH0);
  timer_enable(TIMER3);//放到底下

在这里插入图片描述
PER_NUM :每次采集数据数目。

通过手册可知ADC0对应DMA0_CH0。

数据处理

通过DMA中断可以知道是否转换完成。所用器件是acs712霍尔电流传感器。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
公式为:Vout (V)= 0.5Vcc+IP*0.1。通过ADC采集电压就能知道电流了。

总结:

以上仅为个人理解,如果有误,请大家多多指正,谢谢!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GD32+ADC+DMA定时采集+acs712霍尔电流传感器 的相关文章

  • 在 Ubuntu18 上打开 Spyder3 时缺少依赖项导致密钥环错误?

    我对编程之类的东西相当陌生 我正在尝试使用 Spyder3 但不断收到此错误 如下 我使用的是Geforce 1080ti Ubuntu 18 04 01 python3 3 6 python2没有安装 我尝试了 pip3 install
  • Delphi预定义环境变量

    谁能告诉我在哪里可以找到 RAD Studio 中可用的 伪 环境变量列表 例如 Platform Config 等 具体来说 我想要一个能够为我提供 RTL 版本的版本 以便我可以将编译单元 dcu 放入正确的目录中 即 XE为D15 X
  • 在 Codeblocks 中启用编译器输出窗格

    This is probably a really noob question but the fact of the matter is that my Code blocks wouldn t show me errors when i
  • IntelliJ Idea 15 显示依赖包和项目包

    IntelliJ Idea 15 CE 在项目的包视图中显示来自库 依赖项的包 仅当项目的根包与某些依赖项的根包相同时才会发生这种情况 对于前 我的项目的根包是org 所以所有的依赖关系也有org包状org apache logging也被
  • “完美”的 Python 调试器具有哪些功能? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 请告诉我您希望当前的 Python 调试器具有哪些功能 我正在创建一个新的 Python IDE 调试器 并期待着具有挑战性的请求 请原谅我无耻
  • pytorch 的 IDE 自动完成

    我正在使用 Visual Studio 代码 最近尝试了风筝 这两者似乎都没有 pytorch 的自动完成功能 这些工具可以吗 如果没有 有人可以推荐一个可以的编辑器吗 谢谢你 使用Pycharmhttps www jetbrains co
  • Kendo 有 GUI 设计师吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 Kendo 有没有像 Sencha Architect for Ext JS 这样的控件布局设计工具
  • 如何在 IDE 中输入提示上下文?

    我在用Closure call http php net manual en closure call php http php net manual en closure call php 在类上下文中调用外部闭包 这是一个简单的重现 c
  • 在 Eclipse 中突出显示修改的行

    在 netbeans 中 如果我打开一个受版本控制的文件 则修改的行会在左侧突出显示 绿色表示新行 蓝色表示修改行 在Eclipse中是否可以得到类似的效果 打开首选项窗口 搜索 差异 选择快速差异 将 使用此参考源 更改为 SCM 提供程
  • Emacs:在缓冲区求值期间将参数传递给下级 Python shell

    最近我开始使用 Emacs 作为 Python IDE 它不太直观 我现在遇到的问题是当使用 C c C c 评估缓冲区时如何将命令行参数传递给下级 python shell 感谢帮助 这似乎并不容易实现 管理的劣质流程python el模
  • vs2008中的线程窗口在哪里

    我试图在 VS 2008 中找到描述的线程窗口here http www wintellect com cs blogs jrobbins archive 2007 08 01 neat new multithreaded debuggin
  • Spyder 未检测到导入的 python 文件中的更改

    我正在使用 Spyder 3 2 4 Python 3 6 Spyder 不会检测导入的 python 文件中的更改 例如 测试2 py def func return 5 测试1 py import test2 a test2 func
  • R 编程常用工具

    如果已经以不同的方式问过这个问题 我深表歉意 但我找不到任何达到我想要的东西 我真的是从其他软件包 SPSS 开始接触 R 的 当我了解真正可以做什么时 我意识到我还需要其他 工具 这让我想到了我的问题 您有哪些用于开发 R 代码的设置 我
  • Eclipse:C/C++ 插件下载链接?

    我下载了 Eclipse 3 5 1 的 Java EE 版本 我现在可以使用它通过适当的插件来编辑 C C 吗 我去了Help gt gt 安装新软件但我不知道使用哪个 URL 来获取 C C 插件 我在 Eclipse 网站上也找不到它
  • Eclipse:对 Java 1.7 的失望(未绑定库)

    我在全新安装的 Eclipse 中处理全新项目时遇到问题 重现步骤 下载此版本的 Eclipse http www eclipse org downloads packages eclipse ide java developers hel
  • 适用于非 Web 应用程序的带有 Docker + IDE 的 Python 工作流程

    我目前正在尝试将 Docker 插入我的非 Web 应用程序的 Python 开发工作流程中 当前使用 Docker 和 IDE 进行 Python 开发的最佳实践是什么 我需要能够使用 Docker 隔离我的环境并调试我的代码 在网上我发
  • 在硬件不足的情况下进行编码

    我目前正在使用 C 中的 SIMD 指令进行编码 并尝试使用 IDE 在实时编码时显示错误 拼写错误等 问题是 我使用的是 AVX512 指令 我的硬件不支持这些指令 只有我用于编译的服务器支持 有没有一种方法可以在 IDE 中进行错误检查
  • 是否可以配置CLion来独立编译项目中的源文件?

    我目前正在使用 JetBrains CLion IDE 用 C 语言进行一些 Project Euler 挑战 当我用 Python 和 Java 分别用 PyCharm 和 IntelliJ 完成这些任务时 我总是能够创建一个名为 Pro
  • 如何成功使用 VIM 作为 Code::Blocks 的外部编辑器?

    我真的很喜欢 Code Blocks 的构建系统和单步调试能力 也就是说 我真的很喜欢使用 gcc gdb 的包装器 而不是从 Makefile 或命令行使用它们 问题是 多年来使用 VIM 使我的大脑受到了严重损伤 或者有些人可能会说被宠
  • Delphi 2009 IDE结构视图折叠功能

    现在有谁知道折叠 Delphi 2009 IDE 结构视图中的所有项目吗 我不知道折叠所有项目 这使我很难从视图中找到我的课程 Thanks 选择根节点 类 并按数字键盘上的 除号 那会让一切崩溃 然后按数字键盘上的 加号 键 第一级将展开

随机推荐

  • qt std::cout 中文乱码

    char out 输入操作 r n std cout lt lt out QString qOut 输入操作 r n std cout lt lt qOut toStdString std cout lt lt qOut toStdWStr
  • python3---情感分析(基于词典中文)

    写在前面 现有的情感分析比较常用的有两种 分别是基于词典的和机器学习 前者也属于非监督学习 后者自然一般属于监督学习 刚开始学情感分析 下面先从 基于词典的情感分析 开始进行 词典 我东搜西找找到了一些感觉是常用的字典 主要有 台湾大学NT
  • 2.NanoPi M1(全志H3)的GPIO控制总结(内核驱动)

    开发环境 VM Ubuntu 编译环境 linux3 4 交叉编译工具 arm linux gcc 4 4 3 GPIO内核驱动程序链接 https download csdn net download ddffyhg 11022291 用
  • ABAP DOI 下载SMW0的EXCEL和WORD模板

    用 FUNCTION SAP OI LOAD MIME DATA 下载SMW0的模板 用METHOD LR PROXY gt OPEN DOCUMENT FROM TABLE 打开模板 没找到和ole一样先下载 在打开的方法 SMWO上载模
  • 用正则表达式爬豆瓣电影数据

    学了正则表达式后 简单的用它来爬取豆瓣网的数据 import re from urllib request import urlopen def getPage url 获取网页的字符串 response urlopen url retur
  • STL_set——set::find

    Reference Returns an iterator addressing the location of an element in a set that has a key equivalent to a specified ke
  • 酷比魔方AI慧读器评测 – 实用,值,但不够智能

    转自 https post m smzdm com p ar07qo8x 前段时间在网上看到了酷比魔方AI慧读器的宣传 说是可以让孩子爱上阅读 还可以教会孩子正宗的伦敦腔英语 真的让人很好奇这是一款什么样的神奇产品 正好4月份是小侄子三岁的
  • 使用具有OpenCV和Tesseract的Raspberry Pi光学字符识别(OCR)

    了解如何使用Tesseract和OpenCV通过Raspberry Pi相机从PDF等图像中提取文本 在本教程中 我将向您展示如何使用光学字符识别通过Raspberry Pi相机和Raspberry Pi从图像中提取文本 Pi相机将捕获图像
  • CentOS6.8环境下,通过docker创建Anaconda3容器的基础使用

    目录 一 主要步骤 1 查找docker里评分最高的Anaconda 2 拉取下来 3 运行Anaconda虚拟容器 并挂载 4 进入容器后 创建虚拟环境 5 进入虚拟环境 6 进入虚拟环境后 就可以下载自己所需要的第三方库了 7 执行相关
  • 图形图像学习随笔:计算机图形学的一些基本概念

    本文内容摘抄于 计算机图形学的概念 一 计算机图形学的范畴 1 图形主要分为两类 一类是基于线条信息表示的 如工程图 等高线地形图 曲面的线框图等 另一类是明暗图 也就是通常所说的真实感图形 2 计算机图形学利用计算机建立图形所描述的场景和
  • Django小结02

    1 数据库设置 1 打开myproject settings py 配置mysql数据库 需要添加密码 默认端口3306 在myproject init py中 import pymysql pymysql install as MySQL
  • 自动化Playwright专题汇总

    文章目录 序言 一 特性 1 测试和自动化框架 2 支持所有主流浏览器 3 快速可靠的执行 4 强大的自动化功能 5 自动化工具对比 在这里插入图片描述 https img blog csdnimg cn 97189e12b617477a8
  • 多线程爬取百度关键字结果,并获取真实url

    项目目的 练习 项目要求 根据给定的关键字 检索百度的结果 将结果保存到文件中 遇到问题 1 python list取值问题 有些看不清晰的 用for index item in enumerate array 查看 2 选取想要的元素 两
  • Linux系统磁盘扩容

    本机为CentOS7 9 在虚拟机环境下给Linux系统磁盘扩容 直接添加硬盘无法使用 还需要在系统内部有磁盘挂载操作 给虚拟机添加磁盘 查看系统盘分区类型 root Para110 fdisk dev sda 列出系统分区 欢迎使用 fd
  • springboot框架主要用来做什么?

    Spring Boot是一个开源的Java框架 主要用于简化和加速基于Java的应用程序的开发 它提供了一套开发工具和约定 使得构建独立 可执行的 生产级别的Spring应用变得更加容易 Spring Boot的主要目标是简化Spring应
  • 华夏相机/臻识相机车牌识别器同LED屏幕语音对接以及javaDemo

    上篇文章说过在本地买的华夏相机T83因为当地的销售人员只懂安装 一点技术支持也给不了 导致语音 屏幕 均不能实现自己想要的功能 自定义修改文字 语音播放余额等 经过自己进一步的研究发现 这个led屏幕和语音只需要自己买一块几十块的主板更换上
  • java类总结_Java类的高级用法总结

    马上就要进入10月中旬了 距离开学已经过去整整一个半月了 想想大四的学长学姐们的忙碌的生活 我似乎也感受到了他们内心的躁动 但要淡定 学东西就是要沉住气 今天先来梳理梳理Java类的高级用法 主要内容 1 final关键字 2 抽象方法及抽
  • Maven手动安装ojdbc7.jar

    这篇文章介绍了Springboot项目中通过maven引入与安装外部jar的方法与踩坑 因为版权原因 oracle的ojdbc jar 无法直接从maven 的中央仓库下载 需要手动进行下载安装 下载后选择一个指定位置 我这边选择 opt
  • matplotlib 直方图绘制详解

    n bins patches plt hist datasets bins normed False facecolor None alpha None 函数说明 用于绘制多个数据集datasets的直方图 主要形参 datasets 数据
  • GD32+ADC+DMA定时采集+acs712霍尔电流传感器

    GD32 ADC DMA定时采集 acs712霍尔电流传感器 目的 本文使用定时器定时触发adc采样 并且通过dma搬运数据 环境 KEIL GD32F107vct6 ADC01 IN5 PA5 TIMER3 CH3 时钟初始化 rcu p