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,使用默认配置,默认输出低电平,修改用户标签便于后续代码查找;

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

2、蜂鸣器IO口配置

PA11引脚会接蜂鸣器三极管及电阻,蜂鸣器使用有源蜂鸣器(有源蜂鸣器控制较简单,一般的场景够用了),因此PA11默认拉高,当按下开关后设置对应IO拉低使蜂鸣器响一段时间再拉高就会让蜂鸣器发出’滴‘的一声;
stm32学习总结:6、Proteus8+STM32CubeMX+MDK仿真蜂鸣器及ADC读取电压(Proteus标签整理原理图)_第2张图片

3、ADC口配置

打开ADC1,我这里使用IN8,对应PB0,配置使用默认配置即可:
stm32学习总结:6、Proteus8+STM32CubeMX+MDK仿真蜂鸣器及ADC读取电压(Proteus标签整理原理图)_第3张图片
之后生成代码即可。

四、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%):
stm32学习总结:6、Proteus8+STM32CubeMX+MDK仿真蜂鸣器及ADC读取电压(Proteus标签整理原理图)_第4张图片
stm32学习总结:6、Proteus8+STM32CubeMX+MDK仿真蜂鸣器及ADC读取电压(Proteus标签整理原理图)_第5张图片
stm32学习总结:6、Proteus8+STM32CubeMX+MDK仿真蜂鸣器及ADC读取电压(Proteus标签整理原理图)_第6张图片

2、标签优化

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

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

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

六、仿真测试结果

然后和之前一样双击单片机导入编译好的hex文件,然后运行仿真即可,可以发现按下按键后日志打印出来了,LED灯亮灭变化,电脑也会发出”滴“的声音,滑动滑动变阻器后电压的打印值也会发生变化:
stm32学习总结:6、Proteus8+STM32CubeMX+MDK仿真蜂鸣器及ADC读取电压(Proteus标签整理原理图)_第10张图片

七、最后

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

你可能感兴趣的:(#,stm32,stm32,学习,proteus)