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

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 【蓝桥杯嵌入式】ADC模数转换的原理图解析与代码实现(以第十一届省赛为例)——STM32G4

目录


原理图解析

设置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);
}
相关文章
|
5天前
|
自然语言处理 搜索推荐 数据安全/隐私保护
鸿蒙登录页面好看的样式设计-HarmonyOS应用开发实战与ArkTS代码解析【HarmonyOS 5.0(Next)】
鸿蒙登录页面设计展示了 HarmonyOS 5.0(Next)的未来美学理念,结合科技与艺术,为用户带来视觉盛宴。该页面使用 ArkTS 开发,支持个性化定制和无缝智能设备连接。代码解析涵盖了声明式 UI、状态管理、事件处理及路由导航等关键概念,帮助开发者快速上手 HarmonyOS 应用开发。通过这段代码,开发者可以了解如何构建交互式界面并实现跨设备协同工作,推动智能生态的发展。
69 10
鸿蒙登录页面好看的样式设计-HarmonyOS应用开发实战与ArkTS代码解析【HarmonyOS 5.0(Next)】
|
24天前
|
PHP 开发者 容器
PHP命名空间深度解析:避免命名冲突与提升代码组织####
本文深入探讨了PHP中命名空间的概念、用途及最佳实践,揭示其在解决全局命名冲突、提高代码可维护性方面的重要性。通过生动实例和详尽分析,本文将帮助开发者有效利用命名空间来优化大型项目结构,确保代码的清晰与高效。 ####
22 1
|
1月前
|
机器学习/深度学习 存储 人工智能
强化学习与深度强化学习:深入解析与代码实现
本书《强化学习与深度强化学习:深入解析与代码实现》系统地介绍了强化学习的基本概念、经典算法及其在深度学习框架下的应用。从强化学习的基础理论出发,逐步深入到Q学习、SARSA等经典算法,再到DQN、Actor-Critic等深度强化学习方法,结合Python代码示例,帮助读者理解并实践这些先进的算法。书中还探讨了强化学习在无人驾驶、游戏AI等领域的应用及面临的挑战,为读者提供了丰富的理论知识和实战经验。
59 5
|
1月前
|
JSON JavaScript 前端开发
蓝桥杯web组赛题解析和杯赛技巧
本文作者是一位自学前端两年半的大一学生,在第十五届蓝桥杯Web组比赛中获得省一和国三。文章详细解析了比赛题纲,涵盖HTML、CSS、JavaScript、Echarts和Vue等技术要点,并分享了备赛技巧和比赛经验。作者强调了多写代码和解题思路的重要性,同时提供了省赛和国赛的具体流程及注意事项。希望对参赛者有所帮助。
81 3
|
1月前
|
存储 安全 Java
系统安全架构的深度解析与实践:Java代码实现
【11月更文挑战第1天】系统安全架构是保护信息系统免受各种威胁和攻击的关键。作为系统架构师,设计一套完善的系统安全架构不仅需要对各种安全威胁有深入理解,还需要熟练掌握各种安全技术和工具。
146 10
|
1月前
|
前端开发 JavaScript 开发者
揭秘前端高手的秘密武器:深度解析递归组件与动态组件的奥妙,让你代码效率翻倍!
【10月更文挑战第23天】在Web开发中,组件化已成为主流。本文深入探讨了递归组件与动态组件的概念、应用及实现方式。递归组件通过在组件内部调用自身,适用于处理层级结构数据,如菜单和树形控件。动态组件则根据数据变化动态切换组件显示,适用于不同业务逻辑下的组件展示。通过示例,展示了这两种组件的实现方法及其在实际开发中的应用价值。
44 1
|
2月前
|
机器学习/深度学习 人工智能 算法
揭开深度学习与传统机器学习的神秘面纱:从理论差异到实战代码详解两者间的选择与应用策略全面解析
【10月更文挑战第10天】本文探讨了深度学习与传统机器学习的区别,通过图像识别和语音处理等领域的应用案例,展示了深度学习在自动特征学习和处理大规模数据方面的优势。文中还提供了一个Python代码示例,使用TensorFlow构建多层感知器(MLP)并与Scikit-learn中的逻辑回归模型进行对比,进一步说明了两者的不同特点。
107 2
|
2月前
|
SQL 监控 关系型数据库
SQL错误代码1303解析与处理方法
在SQL编程和数据库管理中,遇到错误代码是常有的事,其中错误代码1303在不同数据库系统中可能代表不同的含义
|
6月前
使用STM32F103标准库实现定时器控制LED点亮和关闭
通过这篇博客,我们学习了如何使用STM32F103标准库,通过定时器来控制LED的点亮和关闭。我们配置了定时器中断,并在中断处理函数中实现了LED状态的切换。这是一个基础且实用的例子,适合初学者了解STM32定时器和中断的使用。 希望这篇博客对你有所帮助。如果有任何问题或建议,欢迎在评论区留言。
492 2
|
5月前
stm32f407探索者开发板(十七)——串口寄存器库函数配置方法
stm32f407探索者开发板(十七)——串口寄存器库函数配置方法
824 0

推荐镜像

更多