当前位置: 首页 > news >正文

【蓝桥杯嵌入式】ADC模数转换的原理图解析与代码实现(以第十一届省赛为例)——STM32G4

🎊【蓝桥杯嵌入式】专题正在持续更新中,原理图解析✨,各模块分析✨以及历年真题讲解✨都在这儿哦,欢迎大家前往订阅本专题,获取更多详细信息哦🎏🎏🎏

🪔本系列专栏 -  蓝桥杯嵌入式_勾栏听曲_0的博客

🍻欢迎大家  🏹  点赞👍  评论📨  收藏⭐️

📌个人主页 - 勾栏听曲_0的博客📝

🔑希望本文能对你有所帮助,如有不足请指正,共同进步吧🏆

🎇君子之道,暗然而日章;小人之道,明然而日亡。📈

目录

原理图解析

 设置STM32CubeMX

 手搓代码

实例运用


原理图解析

        从图中可以看出,模拟输出的引脚分别为PB15和PB12。

 设置STM32CubeMX

        打开STM32CubeMX后,找到PB15和PB12,并把他们设置为ADC输入模式。PB15的为ADC2_IN15,PB12的为ADC1_IN11。

         然后在左侧的Analog中设置ADC,如我们设置刚刚配置给PB12的ADC1,通道为IN11设置为slingle ended,PB15的ADC2的通道IN15前打勾。这样ADC在STM32CubeMX的设置就完成了。

 手搓代码

        利用STM32CubeMX生成号代码后,我们新建两个文件来单独写ADC的代码,但是要注意的是,新文件不能命名为adc.c和adc.h,因为用STM32CubeMX会生成adc.c和adc.h的库文件,为例使命名不冲突,就想要命名为其他名字。

        如下所示,ADC的有效代码只有4行,而且也没什么难点,等一下我们直接以十一届省赛左例子来使用一下,这里我们来讨论一下这四行代码中的最后一句,这个算式为什么这样写呢。

        我们通过HAL_ADC_GetValue();这个函数获取的是一个电压值,而存储这个电压值是12位的空间,也就是说这个函数理论上取出来的电压值在0~4095之间。3.3是这个电位器的实际最大电压为3.3。因此我们除以4096再乘3.3就知道这个电压值对应的真实电压数值是多少啦。

double getADC(ADC_HandleTypeDef *pin)
{uint adc;HAL_ADC_Start(pin);adc = HAL_ADC_GetValue(pin);return adc*3.3/4096;
}

实例运用

题目

        这里要求使用PB0来检测电位器R37的电压信号,我们在STM32CubeMX上的PB0接口选择ADC_IN15就可以啦,这里我们改一下题目,将两个电位器都测一下

        使用STM32微控制器ADC通道(PB15和PB12)分别测量竞赛板电位器R37与R38输出的模拟电压信号。并在LCD屏中显示出来。

代码实现

aadc.c中依旧是我们上面提到的获取ADC的函数

double getADC(ADC_HandleTypeDef *pin)
{uint adc;HAL_ADC_Start(pin);adc = HAL_ADC_GetValue(pin);return adc*3.3/4096;
}

        在lcd.c中调用getADC并显示,getADC(&hadc1)获取的是R38电位器的模拟电压信号,getADC(&hadc2)获取的是R37电位器的模拟电压信号。

void disp_proc()
{char text[30];sprintf(text,"      Para   ");LCD_DisplayStringLine(Line4, (uint8_t *)text);sprintf(text,"    V: %.2f",getADC(&hadc1));LCD_DisplayStringLine(Line6, (uint8_t *)text);sprintf(text,"    V: %.2f",getADC(&hadc2));LCD_DisplayStringLine(Line7, (uint8_t *)text);
}

http://www.lryc.cn/news/39186.html

相关文章:

  • Matlab表示 CDF 时间值
  • 基于Halcon的条码定位与识别【包含 一维码 和 二维码 】
  • 每天学一点之多线程
  • 自动化测试必会的数据驱动测试你真的学会了吗?
  • cpp之十大排序算法
  • java-正装照换底色小demo-技术分享
  • (枚举)(模拟)(二位前缀和)99. 激光炸弹
  • vue3+vite项目移动端适配:postcss-pxtorem和amfe-flexible
  • sin x和cos x的导数
  • html下自动消失的提示框jQuery实现
  • 第27篇:Java日期处理总结(一)
  • Linux入门教程——VI/VIM 编辑器
  • 第十四届蓝桥杯三月真题刷题训练——第 10 天
  • 软件测试之jira
  • 传统方式实现SpringMVC
  • RS232/RS485信号接口转12路模拟信号 隔离D/A转换器LED智能调光控制
  • 聊一聊代码重构——封装集合和替换算法的代码实践
  • FPGA解码4K分辨率4line MIPI视频 OV13850采集 提供工程源码和技术支持
  • Map接口及遍历方式
  • 一步步构建自己的前端项目
  • VMware搭建Mac OS环境
  • 【Maven】什么是Maven?Maven有什么用?
  • 【JavaSE】类和对象的详解
  • 2023年中职组“网络安全”赛项广西自治区竞赛任务书
  • 简单的自定义录屏工具
  • 数据结构与算法基础(王卓)(17):KMP算法详解(精讲(最简单、直接、有效的思路方法,答案以及代码原理)
  • 【java基础】HashMap源码解析
  • 实现异步的8种方式,你知道几个?
  • 二叉树的三种遍历
  • 我,30岁程序员被裁了,千万别干全栈