基于STM32的频率计Proteus仿真教程
目录
- 前言
- 一、电路图设计
- 二、代码设计
- 三、测试结果
- 四、总结
前言
本教程是基于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仿真教程相关推荐
- 基于STM32指纹密码锁proteus仿真设计
基于STM32指纹密码锁proteus仿真设计. 有仿真,程序,原文. 功能: 1.六位密码,设定初始密码(123456) 2.Electronic Locks(电子密码锁) (等待输入密码,密码用* ...
- 【资料转发分享】基于STM32智能路灯灯光自动控制系统设计-基于STM32无刷电机BLDC速度控制器系统设计-基于STM32热释人体感应智能门禁报警系统设计-基于STM32居家加湿器控制仿真系统设计
1604基于STM32智能路灯灯光自动控制系统设计-毕设课设资料 实现的功能如下,下图是仿真原理图: 通过ARM内部的ADC采集光敏电阻电压,判断电压值 电压值低于设定的值,表示光强太弱,开路灯 光强 ...
- STM32电子钟万年历Proteus仿真_LCD1602显示
STM32电子钟万年历Proteus仿真_LCD1602液晶屏 (仿真+原理图+PCB+源码+报告) 仿真:protues 8.9 程序编译器:keil 5 编程语言:C语言 编号C0003 资料文件 ...
- 基于STM32风速风向检测仿真
目录 一.项目描述 二.仿真 三.程序 资料下载地址:基于STM32风速风向检测仿真 一.项目描述 获取风速风向值并在OLED液晶上显示. 二.仿真 系统未上电 系统上电 更改风速风向 ...
- 基于STM32可调时钟仿真
目录 一.项目功能概述 二.仿真 三.程序 资料下载地址:基于STM32可调时钟仿真 一.项目功能概述 1.LCD1602液晶屏实时显示当前时间 2.通过按键调整时间 二.仿真 定时使用stm32内部 ...
- 基于STM32单片机流水灯仿真与程序设计
STM32单片机流水灯仿真与程序设计 摘要 本次程序设计和仿真是基于Proteus和keil的环境对STM32F103系列单片机进行流水灯设计,通过配置STM32的GPIO工作模式,实现LED的点亮和 ...
- 基于STM32的MDK软件仿真输出PWM波形
文章目录 一.PWM相关 1.PWM是什么 2.PWM原理 3.PWM应用 4.PWM信号输出 二.实验相关 1.实验要求 2.实验过程 (1)实验代码 (2)Keil仿真设置 (3)实验结果 三.总 ...
- 基于STM32单片机的电子秤仿真设计
硬件设计 (末尾附文件) 代码设计 HX711: #include "bsp_hx711.h" #include "bsp_delay.h"#define CL ...
- 基于51单片机和Proteus仿真含代码和仿真图的路灯自动控制系统(光控)
代码如下: #include<reg51.h> sbit LED=P2^4; sbit k1=P1^7; #include <intrins.h> #define uchar ...
- 基于stm32的DHT11温湿度采集LCD显示Proteus仿真
*本设计:* 基于stm32温湿度采集Proteus仿真(仿真+程序) 仿真图protues 8.9 程序编译器:keil 5 编程语言:C语言 *设计编号:C0041* *功能描述:* 通过STM3 ...
最新文章
- 总量迈过90万亿元关口 中国经济交出稳健答卷
- archsummit2017见闻和思考
- js检测数据类型的方法你都掌握了几个?
- 区块链BaaS云服务(40) 泰岳联盟链
- [architecture]-ARMV8的ELx等级切换
- 用启明云端支持ESP32的GUI做了一个测温HMI交互界面
- CSS实现【表格内容超过一行的部分,用省略号代替】
- flex布局较之float布局的优点新发现
- 一个简单的txt读取与导出
- 精品谷歌浏览器chrome插件大汇总!值得收藏
- matlab2014如何获得hostid,关于如何修改hostid的问题
- 零成本、零流量,我是如何空手反套白狼?
- “电脑开的热点手机连接不上”的问题寻解过程记录
- 如何利用Python爬虫爬取小说网站并保存到txt文件
- 《动手学习深度学习》第二天
- CSP-S 2020 儒略日
- 民办二本计算机专业学生出路何在?
- 推荐系统论文:Personalized News Recommendation Based on ClickBehavior
- 娱乐弹弹弹——程序猿眼中的女人
- 微信公众号录音功能及录音文件下载到自己服务器 一