stm32学习总结:6、Proteus8+STM32CubeMX+MDK仿真蜂鸣器及ADC读取电压(Proteus标签整理原理图)

stm32学习总结:6、Proteus8+STM32CubeMX+MDK仿真蜂鸣器及ADC读取电压(Proteus标签整理原理图)

文章目录

  • stm32学习总结:6、Proteus8+STM32CubeMX+MDK仿真蜂鸣器及ADC读取电压(Proteus标签整理原理图)
    • 一、前言
    • 二、资料收集
    • 三、STM32CubeMX配置按键及蜂鸣器连接口
      • 1、按键及LED的IO口配置
      • 2、蜂鸣器IO口配置
      • 3、ADC口配置
    • 四、MDK工程代码
    • 五、Proteus增加元器件及布局配置
      • 1、新增元器件
      • 2、标签优化
      • 3、蜂鸣器和滑动变阻器配置
    • 六、仿真测试结果
    • 七、最后

一、前言

接下来我们在上一节的基础上增加一个蜂鸣器,当按下开机按钮时蜂鸣器滴响一声,关机时蜂鸣器滴滴滴响三声,并且通过ADC方式读取一下电压值。于此同时,我们发现线路变的越来越复杂了,线再怎么改,原理图都显得比较杂乱,因此我们需要调整一下原理图,通过Proteus的标签功能整理一下原理图,让它显得整洁一些。

二、资料收集

蜂鸣器:https://zh.wikipedia.org/zh-cn/%E8%9C%82%E9%B3%B4%E5%99%A8
https://blog.csdn.net/m0_69455439/article/details/124932955?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0-124932955-blog-92814535.235v39pc_relevant_3m_sort_dl_base3&spm=1001.2101.3001.4242.1&utm_relevant_index=3
https://blog.51cto.com/u_15909288/5928372
ADC:https://zh.wikipedia.org/zh-cn/%E9%A1%9E%E6%AF%94%E6%95%B8%E4%BD%8D%E8%BD%89%E6%8F%9B%E5%99%A8
https://blog.csdn.net/qq_50652615/article/details/123644039
https://blog.csdn.net/qq_41873311/article/details/119078754
Proteus标签相关:
https://www.labcenter.com/downloads/
https://labcenter.s3.amazonaws.com/downloads/vsmTutorialSpanish89.pdf
http://www.51hei.com/bbs/dpj-111690-1.html
https://blog.csdn.net/haigear/article/details/121029243

三、STM32CubeMX配置按键及蜂鸣器连接口

1、按键及LED的IO口配置

  • PA1将会外接开关按钮,配置为输出IO,使用默认配置即可,默认输出低电平,修改用户标签便于后续代码查找;
  • PA4-PA8为LED1-LED5,配置为输出IO,使用默认配置,默认输出低电平,修改用户标签便于后续代码查找;

image.png

2、蜂鸣器IO口配置

PA11引脚会接蜂鸣器三极管及电阻,蜂鸣器使用有源蜂鸣器(有源蜂鸣器控制较简单,一般的场景够用了),因此PA11默认拉高,当按下开关后设置对应IO拉低使蜂鸣器响一段时间再拉高就会让蜂鸣器发出’滴‘的一声;
image.png

3、ADC口配置

打开ADC1,我这里使用IN8,对应PB0,配置使用默认配置即可:
image.png
之后生成代码即可。

四、MDK工程代码

按键、日志等代码不变,不清楚的可以看上一节,这节新增加的内容就是在pwr.c中增加控制蜂鸣器和adc读取电压即可。

#include "pwr.h"
#include "log.h"
#include "gpio.h"
#include "adc.h"

void TurnOnLED(int flag) {
    switch (flag) {
        case 1:
            HAL_GPIO_WritePin(GPIOA, LED_1_Pin, GPIO_PIN_RESET);
            break;
        case 2:
            HAL_GPIO_WritePin(GPIOA, LED_2_Pin, GPIO_PIN_RESET);
            break;
        case 3:
            HAL_GPIO_WritePin(GPIOA, LED_3_Pin, GPIO_PIN_RESET);
            break;
        case 4:
            HAL_GPIO_WritePin(GPIOA, LED_4_Pin, GPIO_PIN_RESET);
            break;
        case 5:
            HAL_GPIO_WritePin(GPIOA, LED_5_Pin, GPIO_PIN_RESET);
            break;
    }
}

void TurnOffLED(int flag) {
    switch (flag) {
        case 1 :
            HAL_GPIO_WritePin(GPIOA, LED_1_Pin, GPIO_PIN_SET);
            break;
        case 2 :
            HAL_GPIO_WritePin(GPIOA, LED_2_Pin, GPIO_PIN_SET);
            break;
        case 3 :
            HAL_GPIO_WritePin(GPIOA, LED_3_Pin, GPIO_PIN_SET);
            break;
        case 4 :
            HAL_GPIO_WritePin(GPIOA, LED_4_Pin, GPIO_PIN_SET);
            break;
        case 5 :
            HAL_GPIO_WritePin(GPIOA, LED_5_Pin, GPIO_PIN_SET);
            break;
    }
}

void ADC_TO_VOL() {
    HAL_ADC_Start(&hadc1);
    int ADC_Value;
    if (HAL_ADC_PollForConversion(&hadc1, 10) == HAL_OK) {
        ADC_Value = HAL_ADC_GetValue(&hadc1);
    }
    LOG(LOG_DEBUG, "ADC Sample value:%d,voltage value:%.4fV", ADC_Value, ADC_Value * 3.3f / 4096);
}

void PWROn(void) {
    LOG(LOG_DEBUG, "set buzzer one");
    HAL_GPIO_WritePin(GPIOA, BUZZER_Pin, GPIO_PIN_RESET);
    HAL_Delay(200);
    HAL_GPIO_WritePin(GPIOA, BUZZER_Pin, GPIO_PIN_SET);

    LOG(LOG_DEBUG, "PWROn LED blink...");
    for (int i = 1; i < 6; i++) {
        HAL_Delay(100);
        TurnOnLED(i);
    }

    LOG(LOG_DEBUG, "read volume...");
    ADC_TO_VOL();
}

void PWROff(void) {
    LOG(LOG_DEBUG, "PWROn LED off...");
    for (int i = 1; i < 6; i++) {
        HAL_Delay(100);
        TurnOffLED(i);
    }

    LOG(LOG_DEBUG, "set buzzer three");
    for (int i = 0; i < 3; i++) {
        HAL_GPIO_WritePin(GPIOA, BUZZER_Pin, GPIO_PIN_RESET);
        HAL_Delay(200);
        HAL_GPIO_WritePin(GPIOA, BUZZER_Pin, GPIO_PIN_SET);
        HAL_Delay(200);
    }

    LOG(LOG_DEBUG, "read volume...");
    ADC_TO_VOL();
}

#ifndef __PWR_H
#define __PWR_H

#include "main.h"

void PWROn(void);

void PWROff(void);

#endif

五、Proteus增加元器件及布局配置

1、新增元器件

除了之前的按钮、LED-RED、COMPIM、虚拟终端外,这节新增三极管PNP、蜂鸣器BUZZER、滑动电阻POT-HG(调整精度为1%):
image.png
image.png
image.png

2、标签优化

于此同时,我们发现线路变的越来越复杂了,线再怎么改,原理图都显得比较杂乱,因此我们需要调整一下原理图,查了一下发现通过Proteus的标签功能就可以很方便的实现原理图美化,通过标签可以减少接线,将本身要接线的位置通过标签关联起来,操作也很简单,引入一段线后选中这段线然后右键选择添加网络标号即可:
image.png
比如我这里给要连接button按钮的线添加了标号BUTTON,然后在另一个位置放入按钮,按钮右侧连线的部分也添加线并添加网络标号,这个标号也设置为BUTTON就相当于这两端引脚接到一起了,相当于通过标签把这两端关联起来了,不需要像原来那样实线连接起来了。
其它的接口都这么去设置一下,最终布局如下,看起来没有那么多线,要整洁很多:
image.png

3、蜂鸣器和滑动变阻器配置

滑动变阻器和一般的电阻接入比较相似,只不过滑动部分加入stm32的IO口即可,其余两端一段接电源,一端接地。
蜂鸣器器件一般都是一个统一的模块,和三极管是结合起来的,这块具体三极管驱动蜂鸣器发出声音的原理不做深入说明,感兴趣的可以去了解一下,我们暂时记住这么去配置给IO口拉低就可以让蜂鸣器发出声音,有源直流蜂鸣器需要的电压为3.3-5v,涉及到压电效应等很多东西,简单讲也讲不明白。
因此,还需要双击蜂鸣器后配置电压为3.3-5V,否则接线正常,拉低IO口也还是可能不响。
image.png

六、仿真测试结果

然后和之前一样双击单片机导入编译好的hex文件,然后运行仿真即可,可以发现按下按键后日志打印出来了,LED灯亮灭变化,电脑也会发出”滴“的声音,滑动滑动变阻器后电压的打印值也会发生变化:
GIF.gif

七、最后

接下来学习一下I2C总线,利用其控制一下显示屏,就可以做一些带屏的项目了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/294908.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

智能革命:揭秘AI如何重塑创新与效率的未来

1.AI技术的发展与应用 1.1 AI技术的发展 人工智能&#xff08;AI&#xff09;的概念最早可以追溯到20世纪40年代和50年代&#xff0c;当时的计算机科学家开始探索如何创建能模仿人类智能的机器。最初的AI研究集中在问题解决和符号逻辑上&#xff0c;但随着时间的推移&#xf…

若依前后端分离版关联字典值查询数据工具类使用

场景 若依管理系统导出Excel时添加没有的列和关联码表显示中文进行导出&#xff1a; 若依管理系统导出Excel时添加没有的列和关联码表显示中文进行导出_若依的导出添加额外的字段信息-CSDN博客 上面通过关联表的方式实现查询字典值&#xff0c;若依本身提供了查询redis中缓存…

透明OLED屏的稳定性:从技术角度及应用案例解析

在显示技术日新月异的今天&#xff0c;透明OLED屏以其独特的透明特性和出色的显示效果&#xff0c;吸引了众多关注。然而&#xff0c;对于这种新型技术的稳定性&#xff0c;人们难免会有所疑虑。作为一名专注于OLED技术研发的工程师&#xff0c;尼伽小编将从专业角度出发&#…

阿里云大模型「让照片跳舞」刷屏朋友圈,有哪些信息值得关注?

介绍 大家好&#xff0c;我分享聊聊阿里通义千问APP中全民舞王功能。 网络热舞结合AI视频&#xff0c;这是以后不用学习跳舞&#xff1f; 可以尝试下效果&#xff0c;一张图片生成视频。 APP快速使用 搜索下载通义千问APP 打开APP&#xff0c;选中一张照片来跳舞。 这里…

css单位介绍

当我们在编写网页或应用程序时&#xff0c;选择合适的单位来描述元素的尺寸是非常重要的。在CSS中&#xff0c;我们常常会使用像素(px)、相对像素(rpx)、字号单位(em)、根元素字号单位(rem)、百分比(%)和视口百分比(vh、vw)等单位来描述元素的大小。 像素(px)是最常见的单位&a…

Unity中Shader序列帧动画(U、V方向的走格)

文章目录 前言一、U方向的走格1、 要实现移动的效果&#xff0c;我们就会想到使用_Time2、使用floor向下取整3、把x、y缩小为原函数的 Column倍4、使用_Sequence的z控制帧动画U方向上的速度 二、U方向的走格三、最终效果1、亚丝娜2、小蓝帽3、火4、最终代码 前言 在上一篇文章…

没有一家车企能绕开「数据闭环」

作者 |张祥威 编辑 |德新 2023年&#xff0c;在比亚迪那次公布智驾数据规模后&#xff0c;智能化下半场的战斗就正式打响了。 如今&#xff0c;自动驾驶正在沿着特斯拉提出的「BEVTransformer」急速推进&#xff0c;这条技术路线短短几年就得到了验证&#xff0c;随着智驾起较…

软件测试|弄懂GROUP BY看这一篇文章就够了

简介 在SQL&#xff08;结构化查询语言&#xff09;中&#xff0c;GROUP BY子句是一个强大的工具&#xff0c;用于对查询结果进行分组和聚合操作。通过使用GROUP BY子句&#xff0c;可以根据指定的列或表达式对数据进行分组&#xff0c;并对每个分组应用聚合函数&#xff0c;从…

VSCode安装 PlatformIO 插件指南

公众号阅读&#xff1a; 前言 在前几次发的文章中多次提到PlatformIO这个VSCode插件&#xff0c;很多同学私信我说非常难安装&#xff0c;希望我继续分享如何在国内快速安装PlatformIO。其实PlatformIO官网提供了详细的安装文档和PIO的使用手册。大家可以参考官网文档。本文将…

第十课:计算机心理学、教育科技及奇点,天网,计算机的未来

第十课&#xff1a;计算机心理学、教育科技及奇点&#xff0c;天网&#xff0c;计算机的未来 第三十八章&#xff1a;计算机心理学0、计算机中用到的心理学原理1、易用度2、颜色强度排序和颜色排序3、分组更好记4、直观功能5、认出VS回想6、让机器有一定的情商以及Facebook的研…

案例094:基于微信小程序的图书馆自习室座位预约管理系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

Unraid APP下载慢解决方法

1.首先你的APP商城能够打开 这里我已下载Jellyfin为例 使用APP查找镜像,是为了获取下面的配置模板 2.修改地址 默认的地址是 lscr.io/linuxserver/jellyfin服务器在国外,被墙了.下载具慢 我们需要把这个下载源修改成国内的 有很多国内的源,但是我觉得阿里的比较快 3.获…

低代码UI构件程序设计基础实训一

步骤一 低代码在线调试工具 网址 低代码在线调试工具 步骤二 D盘建一个文件夹&#xff0c;文件夹下建两个文件夹ico和js 网上找一些图片&#xff0c;后缀.png&#xff0c;编号从0开始&#xff0c;图片另存到ico文件夹下 下载&#xff08;右键另存为&#xff09;以下四个页面…

discard long time none received connection

使用DruidDataSource 做数据源时,如果创建的连接在长时间得不到调用后会报如题所示的错误 discard long time none received connection. ,jdbcUrl : jdbc:mysql://localhost:3306/test?autoReconnecttrue&useUnicodetrue&characterEncodingutf8&serverTimezoneC…

C语言编译器(C语言编程软件)完全攻略(第三部分:Windows下的编译器有哪些?如何选择?)

介绍常用C语言编译器的安装、配置和使用。 三、Windows下的编译器有哪些&#xff1f;如何选择&#xff1f; 安装编译器或者 IDE&#xff08;集成开发环境&#xff09;&#xff0c;也叫搭建开发环境。Windows 下的C语言 IDE 众多&#xff0c;多如牛毛&#xff0c;初学者往往不…

信号强度功能 界面、逻辑和图标(免费)

信号强度 需求 vue项目&#xff0c;需要实时监控系统信号&#xff0c;要求&#xff1a; 1.共五格信号&#xff1b; 2.信号0-100为满值&#xff0c;信号100-500为四格&#xff0c;信号500-1000为三格&#xff0c;信号1000-5000为两格&#xff0c;信号5000-20000为一格&#x…

Python学习笔记(五)函数、异常处理

目录 函数 函数的参数与传递方式 异常处理 函数 函数是将代码封装起来&#xff0c;实现代码复用的目的 函数的命名规则——同变量命名规则&#xff1a; 不能中文、数字不能开头、不能使用空格、不能使用关键字 #最简单的定义函数 user_list[] def fun(): #定义一个函数&…

微软 Power Platform 使用Power Automate发送邮件以Dataverse作为数据源的附件File Column

微软Power Platform使用Power Automate发送邮件添加Power Apps以Dataverse作为数据源的附件File Column方式 目录 微软Power Platform使用Power Automate发送邮件添加Power Apps以Dataverse作为数据源的附件File Column方式1、需求背景介绍2、附件列File Column介绍3、如何在Po…