目录

  • 前言
  • 一、电路图设计
  • 二、代码设计
  • 三、测试结果
  • 四、总结

前言

本教程是基于STM32的嵌入式仿真大作业。
使用 Proteus 仿真32单片机,实现了可以测量正弦波、方波、正弦波和锯齿波等波形频率的 频率计,测量误差在1%以内

一、电路图设计

前端处理电路由LM324运算放大器组成迟滞比较器电压跟随器,迟滞特性一定程度上解决了噪声扰动的问题,且可将任意固定频率的信号转化为脉冲,便于单片机的后续处理,而电压跟随器可增强其带载能力。


单片机最小系统如下图所示,也可删除右侧电路,在Proteus中不受影响

二、代码设计

新建一个f103R6Tx的工程,先开启外部高速晶振


在Clock Configuration中将SYSCLK时钟配置最低,为16MHz,APB2总线频率配置最低,为1MHz,后面解释为何这样配置。


将PA6引脚配置为外部中断引脚,使能串口1,并更改波特率为9600。打开左边的TIM2定时器,选择Clock Source的时钟源为Internal Clock,并且配置分频系数为0,即1分频,自动装载值为999,此时定时器每1ms进入一次外部中断。

打开左边的NVIC,使能定时器中断和外部中断,并配置抢占优先级分别为1和2

选择添加工程路径,并将工具链设置为MDK-ARM

勾上.c/.h文件

打开生成的MDK工程,在主函数中添加如下代码

HAL_TIM_Base_Start_IT(&htim2);//开启定时器2中断
while(1)
{HAL_Delay(500);printf("频率:%dHz\r\n",freq);
}


在tim.c文件里面添加如下代码:

/* USER CODE BEGIN 1 */
uint16_t exitTimes = 0;
//每1ms进入一次定时器中断
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if (htim == (&htim2)){exitTimes++;if(exitTimes > 500){freq = pluseCount * 2;pluseCount = 0;exitTimes = 0;}}
}
/* USER CODE END 1 */

在gpio.c中添加如下代码

/* USER CODE BEGIN 2 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{if(GPIO_PIN_6){pluseCount++;//每检测到一个脉冲的下降沿就进入一次外部中断,即pluseCount变量加1}
}
/* USER CODE END 2 */

编译通过,打开Proteus工程,双击单片机,弹出下载对话框,两个最重要的参数如图所示。

  • 第一个参数是编译通过的hex文件的路径,若无法找到hex文件,可自行百度 Keil如何生成hex文件
  • 第二个参数关乎整个系统功能的实现,极其重要!!!
    该参数是stm32的SYSCLK的系统时钟,并非晶振频率!!!若与keil配置的系统时钟不符,则无法实现代码功能。在此设置为16MHz。

下载运行即可

三、测试结果

正弦波测试结果如下,此时你会发现,仿真速度很慢,甚至到最后无法实现后续功能,串口没有输出频率。

proteus仿真有如下规律:

  • 函数信号发生器设置的输出频率越大,仿真速度越慢
  • 单片机定时器时钟频率越大,仿真速度越慢,故而我在配置时钟时将systick时钟和定时器时钟都设置为最小值。否则奇慢无比,具体仿真时长可以查看仿真界面下方的ANIMATING提示
  • 单片机的Crystal Frequency参数需要与keil配置的SYSCLK时钟一致,否则串口打印出乱码,甚至无法仿真
  • 串口无法连续打印数据,代码如下:
 while(1)
{HAL_Delay(500);printf("频率:%dHz\r\n",freq);printf("周期:%fHz\r\n",1.0/freq);
}

此代码打印一次频率后便不再打印输出,此代码仿真存在问题。

可能遇到的问题:

  • 串口持续打印0Hz的情况:可能是信号源设置信号的Vpp或者运放输出的电压较小,无法达到数字电路高电平的标准
  • 没有任何输出的情况:可能是原始信号频率过高(远超过1kHz),导致Proteus仿真极慢,最终计算量过大,无法输出

四、总结

  • 由于大作业必须使用仿真的缘故,故而第一次使用Proteus仿真STM32功能。特别是在使用定时器功能时,Proteus仿真显得极其鸡肋。
  • 我曾使用输入捕获功能计算脉冲个数,在检测脉冲时需要不断更新捕获极性,记录捕获比较寄存器的CCR值,并加上中断溢出的计数值可得到定时器总的计数值。
    经过一天的debug测试发现,在引脚检测脉冲上升沿或者下降沿的时候,程序始终无法进入中断回调函数。实物测试可行但proteus仿真无法实现功能,若有大佬实现了输入捕获的仿真功能,欢迎私信交流。基于输入捕获功能的频率计仿真下载链接如下:基于输入捕获的stm32频率计的Proteus仿真
  • 本例程采取了外部中断计算脉冲数目的方法,最终可实现频率计的所有功能,迫于Proteus仿真速度和计算力,测试频率最大可达1kHz左右。
  • 测频有多种方法,包括外部中断、PWM输入模式、输入捕获、使用外部时钟计数器、ADC采样测量等方法,每种方法各有优缺点,具体可参考这篇文章:使用 STM32 测量频率和占空比的几种方法。这也是为何15年电赛会将数字频率计作为出题点

最后,本例程的工程下载链接如下:基于STM32与Proteus的频率计仿真,码字不易,欢迎点赞。

基于STM32的频率计Proteus仿真教程相关推荐

  1. 基于STM32指纹密码锁proteus仿真设计

    基于STM32指纹密码锁proteus仿真设计. 有仿真,程序,原文. 功能: 1.六位密码,设定初始密码(123456) 2.Electronic Locks(电子密码锁) (等待输入密码,密码用* ...

  2. 【资料转发分享】基于STM32智能路灯灯光自动控制系统设计-基于STM32无刷电机BLDC速度控制器系统设计-基于STM32热释人体感应智能门禁报警系统设计-基于STM32居家加湿器控制仿真系统设计

    1604基于STM32智能路灯灯光自动控制系统设计-毕设课设资料 实现的功能如下,下图是仿真原理图: 通过ARM内部的ADC采集光敏电阻电压,判断电压值 电压值低于设定的值,表示光强太弱,开路灯 光强 ...

  3. STM32电子钟万年历Proteus仿真_LCD1602显示

    STM32电子钟万年历Proteus仿真_LCD1602液晶屏 (仿真+原理图+PCB+源码+报告) 仿真:protues 8.9 程序编译器:keil 5 编程语言:C语言 编号C0003 资料文件 ...

  4. 基于STM32风速风向检测仿真

    目录 一.项目描述 二.仿真 三.程序 资料下载地址:基于STM32风速风向检测仿真​​​​​​​ 一.项目描述 获取风速风向值并在OLED液晶上显示. 二.仿真 系统未上电 系统上电 更改风速风向 ...

  5. 基于STM32可调时钟仿真

    目录 一.项目功能概述 二.仿真 三.程序 资料下载地址:基于STM32可调时钟仿真 一.项目功能概述 1.LCD1602液晶屏实时显示当前时间 2.通过按键调整时间 二.仿真 定时使用stm32内部 ...

  6. 基于STM32单片机流水灯仿真与程序设计

    STM32单片机流水灯仿真与程序设计 摘要 本次程序设计和仿真是基于Proteus和keil的环境对STM32F103系列单片机进行流水灯设计,通过配置STM32的GPIO工作模式,实现LED的点亮和 ...

  7. 基于STM32的MDK软件仿真输出PWM波形

    文章目录 一.PWM相关 1.PWM是什么 2.PWM原理 3.PWM应用 4.PWM信号输出 二.实验相关 1.实验要求 2.实验过程 (1)实验代码 (2)Keil仿真设置 (3)实验结果 三.总 ...

  8. 基于STM32单片机的电子秤仿真设计

    硬件设计 (末尾附文件) 代码设计 HX711: #include "bsp_hx711.h" #include "bsp_delay.h"#define CL ...

  9. 基于51单片机和Proteus仿真含代码和仿真图的路灯自动控制系统(光控)

    代码如下: #include<reg51.h> sbit LED=P2^4; sbit k1=P1^7; #include <intrins.h> #define uchar ...

  10. 基于stm32的DHT11温湿度采集LCD显示Proteus仿真

    *本设计:* 基于stm32温湿度采集Proteus仿真(仿真+程序) 仿真图protues 8.9 程序编译器:keil 5 编程语言:C语言 *设计编号:C0041* *功能描述:* 通过STM3 ...

最新文章

  1. 总量迈过90万亿元关口 中国经济交出稳健答卷
  2. archsummit2017见闻和思考
  3. js检测数据类型的方法你都掌握了几个?
  4. 区块链BaaS云服务(40) 泰岳联盟链
  5. [architecture]-ARMV8的ELx等级切换
  6. 用启明云端支持ESP32的GUI做了一个测温HMI交互界面
  7. CSS实现【表格内容超过一行的部分,用省略号代替】
  8. flex布局较之float布局的优点新发现
  9. 一个简单的txt读取与导出
  10. 精品谷歌浏览器chrome插件大汇总!值得收藏
  11. matlab2014如何获得hostid,关于如何修改hostid的问题
  12. 零成本、零流量,我是如何空手反套白狼?
  13. “电脑开的热点手机连接不上”的问题寻解过程记录
  14. 如何利用Python爬虫爬取小说网站并保存到txt文件
  15. 《动手学习深度学习》第二天
  16. CSP-S 2020 儒略日
  17. 民办二本计算机专业学生出路何在?
  18. 推荐系统论文:Personalized News Recommendation Based on ClickBehavior
  19. 娱乐弹弹弹——程序猿眼中的女人
  20. 微信公众号录音功能及录音文件下载到自己服务器 一

热门文章

  1. 仿迅雷播放器教程 -- 提取exe资源
  2. 代管挂账业务,没有做代管挂账确认单是否可以暂估入账
  3. 52好压卸载不干净,解压时仍有52好压选项【彻底删除步骤,超详细】
  4. 刘鹏计算广告学听课笔记 第二章:合约广告系统(一)
  5. 电子设计自动化实验 实验三 频率计制作
  6. O2O营销方法有哪些 O2O营销模式的特点是什么?
  7. python 弹窗选择文件并获取文件路径
  8. sr650安装linux网卡驱动,SR650安装Windows2016添加RAID卡驱动
  9. 读书笔记《大数据时代》
  10. 计算机主机清洁维护,电脑主机日常维护保养