STM32实现扫频功能

2023-10-31

简介

我们都知道,在信号发生器中,有一个扫频模式:指信号发生器在指定的扫描时间内从起始频率到终止频率变化输出,扫频模式支持线性扫频、对数扫频、和步进扫频三种方式。

起始频率和终止频率

起始频率和终止频率是频率扫描的频率上限和下限。信号发生器总是从起始频率扫频到终止频率,然后又回到起始频率。
 当起始频率< 终止频率,信号发生器从低频向高频扫描。
 当起始频率> 终止频率,信号发生器从高频向低频扫描。
 当起始频率= 终止频率,信号发生器以固定频率输出。

修改“起始频率”或“终止频率”后,信号发生器将重新从指定的“起始频率”开始扫频输出。

扫频类型

扫频类型分为线性、对数、步进三种扫频类型。默认为线性扫频。

线性扫频

在线性扫频模式下,输出信号的频率以线性的方式变化,即每秒若干赫兹的方式改变输出频率,该变化由起始频率、终止频率和扫描时间控制。
在这里插入图片描述

对数扫频

在对数扫频方式下,仪器输出信号的频率以对数方式变化,即每秒倍频程或每秒十倍的方式改变输出频率,该变化由起始频率、终止频率、和扫描时间控制。

启用对数扫频时,用户可以设置以下几个参数:起始频率Fstart,终止频率Fstop和扫描时间 Tsweep。对数扫频的函数原型为:
在这里插入图片描述
Fcuurent 为当前输出的瞬时频率,参数P和T可用以上参数表示如下,
在这里插入图片描述
其中,t 为扫频开始所经历的时间,范围在 0 到 Tsweep之间。

在这里插入图片描述

步进扫频

在步进扫频方式下,仪器输出信号的频率从“起始频率”到“终止频率”之间以阶梯式“步进”,输出信号在每个频点上停留的时间长短由“扫描时间”和“步进数”控制。

在下图中,我们可以看到一条阶梯波,表明输出频率以阶梯式“步进”变化。
在这里插入图片描述

扫描时间

扫描时间默认为1S。范围可以设置1ms 到 500S。修改扫描时间后,信号发生器将重新从指定的“起始频率”开始扫频输出。

这个扫瞄时间与信号本身的频率并不冲突,如起始频率设置为10HZ(100ms),终止频率设置为1KHZ。扫描时间设置100ms。这个时候扫频时间影响的是各个频率点驻留的时间,如果扫瞄时间设置较大,频率变化就较小,如果扫描时间设置较小,频率变化就较大。

算法:

线性扫频

// 假设 扫频率 为: sampleRate 即为总时间内,频率需要变化多少次。

//扫频时间
this->totaltime = this->timeValue; // 时间以秒为单位,直接使用
//需要输出频率变化总数
this->totalsamples = (int) (this->totaltime * this->sampleRate); // 样品总数

//获得差值
double diff = endFreq - startFreq;
//输出频率
double omega;
//每个频率点的频率值
for(double i=0;i <= totalsamples;i++)
{
    t = (i / (double) this->totalsamples) * this->totaltime; // 现在的时间
    omega = startFreq + (diff * t / this->totaltime); 
}

简化后,即为:
omega = startFreq + (diff * i / this->totalsamples);

定时1ms中断服务函数中实现:

 //TIMER3中断  1ms一次
void OS_TASK_IRQHandler(void)
{
    static uint8_t s_state = 0;

    static uint32_t s_outFrequency = 0;
	
	static uint32_t s_timeCnt = 0;
	
    //差值频率
    double diff = tMasterBoardData.Flash_StopFreq - tMasterBoardData.Flash_StartFreq;


	// u8 i = 0;
	if (RESET != TIM_GetITStatus(OS_TASK_TIM,TIM_IT_Update))//检查TIM3更新中断发生与否
	{
		TIM_ClearITPendingBit(OS_TASK_TIM,TIM_IT_Update);
			
		/* 全局运行时间每1ms增1 */
		g_iRunTime++;
		if (g_iRunTime == 0x7FFFFFFF)	/* 这个变量是 int32_t 类型,最大数为 0x7FFFFFFF */
		{
			g_iRunTime = 0;
		}
		
        switch (s_state)
        {
        /* 递增环节 */
        case 0:
            //频率改变,占空比不变
            if(tMasterBoardData.Flash_SweepMode & (1<<0))
            {
                if(tMasterBoardData.Flash_RiseTime > g_iRunTime)
                {
                    s_outFrequency = tMasterBoardData.Flash_StartFreq + diff * g_iRunTime / tMasterBoardData.Flash_RiseTime;
                    tMasterBoardData.ActualFrequenct = s_outFrequency;      
					Set_TIM_PWM_Update(TIM1,4,tMasterBoardData.ActualFrequenct,tMasterBoardData.Flash_StartDuty*100);
                }   
                else
                {
                    g_iRunTime = 0;
                    s_state = 1;
                }                    
            }   
            break;

        /* 保持环节 */
        case 1:
            if(tMasterBoardData.Flash_SweepMode & (1<<0))
            {
                if(tMasterBoardData.Flash_HodeTime > g_iRunTime)
                {
                    s_outFrequency = tMasterBoardData.Flash_StopFreq;
                    tMasterBoardData.ActualFrequenct = s_outFrequency;      
					Set_TIM_PWM_Update(TIM1,4,tMasterBoardData.ActualFrequenct,tMasterBoardData.Flash_StartDuty*100);
                }   
                else
                {
                    g_iRunTime = 0;
                    s_state = 2;
                }                    
            } 
            break;
        
        /* 递减环节 */
        case 2:
            if(tMasterBoardData.Flash_SweepMode & (1<<0))
            {
                if(tMasterBoardData.Flash_FallTime > g_iRunTime)
                {
                    s_outFrequency = tMasterBoardData.Flash_StopFreq - diff * g_iRunTime / tMasterBoardData.Flash_FallTime;
                    tMasterBoardData.ActualFrequenct = s_outFrequency;					
					Set_TIM_PWM_Update(TIM1,4,tMasterBoardData.ActualFrequenct,tMasterBoardData.Flash_StartDuty*100);
                }   
                else
                {
                    g_iRunTime = 0;
                    s_state = 0;
                }                    
            } 
            break;
        default:
            break;
        }
     
	}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32实现扫频功能 的相关文章

  • 处理器指令周期执行时间

    我的猜测是 no operation 内在 ARM 指令应花费 1 168 MHz 来执行 前提是每个NOP在一个时钟周期内执行 我想通过文档验证这一点 有关处理器指令周期执行时间的信息是否有标准位置 我试图确定 STM32f407IGh6
  • 初始化 ST-Link 设备时出错 - 无法连接到设备

    我目前正在使用 ST Link 调试器对我的 STM32F3 Discovery 板进行编程 我使用的IDE是Atollic TrueStudio 5 5 2 现在我面临一个非常奇怪的问题 那就是我不断收到消息 初始化 ST Link 设备
  • 如何让printf在STM32F103上工作?

    我是 STM32F103 世界的新手 我有一个STM32F103的演示代码 我正在使用arm none eabi来编译它 我尝试了在谷歌上可以找到的内容 但到目前为止没有任何效果 我已经花了三天时间来解决这个问题 任何人都可以给我一个运行良
  • STM32F103

    提示 来源正点原子 参考STM32F103 战舰开发指南V1 3PDF资料 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 提示 这里可以添加本文要记录的大概内容 开发环境硬件普中科技 接线图在g
  • STM32超声波——HC_SR04

    文章目录 一 超声波图片 二 时序图 三 超声波流程 四 单位换算 五 取余计算 六 换算距离 七 超声波代码 一 超声波图片 测量距离 2cm 400cm 二 时序图 1 以下时序图要先提供一个至少10us的脉冲触发信号 告诉单片机我准备
  • STM32 GPIO工作原理详解

    STM32 GPIO介绍 1 STM32引脚说明 GPIO是通用输入 输出端口的简称 是STM32可控制的引脚 GPIO的引脚与外部硬件设备连接 可实现与外部通讯 控制外部硬件或者采集外部硬件数据的功能 以STM32F103ZET6芯片为例
  • SHT10温湿度传感器——STM32驱动

    实验效果 硬件外观 接线 3 3V供电 IIC通讯 代码获取 查看下方 END
  • 在 Atollic TrueStudio、STM32CubeMX 中导入 C 库

    我目前正在开发 STM32F767ZI Nucleo 板和一个小安全芯片 microchip atecc508a 通过 i2c 连接进行连接 该芯片有一个可用的库加密验证库 https github com MicrochipTech cr
  • 跟着野火学FreeRTOS:第一段(任务定义,切换以及临界段)

    在裸机系统中 系统的主体就是 C P U CPU CP U 按照预先设定的程序逻辑在 m a i n
  • 最终启动顺序错误 - STM32L476 的 Eclipse System Workbench 调试

    我正在尝试调试和运行 STM32L476 的简单汇编代码 我已经设置了 Eclipse Oxygen 在 Eclipse 中安装了最新版本的 System Workbench 插件并安装了 ST Link 驱动程序 IDE 成功构建了程序
  • 串口通讯第一次发送数据多了一字节

    先初始化IO再初始化串口 导致第一次发送时 多出一个字节数据 优化方案 先初始化串口再初始化IO 即可正常通讯
  • STM32 暂停调试器时冻结外设

    当到达断点或用户暂停代码执行时 调试器可以停止 Cortex 中代码的执行 但是 当皮质停止在暂停状态下执行代码时 调试器是否会冻结其他外设 例如 DMA UART 和定时器 您只能保留时间 r 取决于外围设备 我在进入主函数时调用以下代码
  • STM32F207 I2C 测试失败

    我正在使用 STM32F207 微控制器在 STM3220G EVAL 板上学习嵌入式开发 我尝试通过连接同一芯片上的两个 I2C2 和 I2C3 模块并发送 接收字符来测试 I2C 接口 这是我当前编写的代码 使用 mdk arm 5 i
  • CMSIS & STM32,如何开始? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想在 STM32 上使用 CMSIS 启动项目 网上一搜 没找到具体的教程 有些使用 SPL 开始项
  • STM32H5 Nucleo-144 board开箱

    文章目录 开发板资料下载 目标 点亮LD1 绿 LD2 黄 和LD3 红 三个LED灯 开箱过程 博主使用的是STM32CubeMX配置生成代码 具体操作如下 打开STM32CubeMX File gt New project 选择开发板型
  • systick定时器

    systick定时器 文章目录 前言 一 前期疑惑 二 解答 1 关于systick是阻塞的吗 2 非阻塞 三 软件编写 总结 前言 这边记录systick相关知识点 一 前期疑惑 在学习systick志气啊 其实对于systick还是一脸
  • Cortex-M3与M4权威指南

    处理器类型 所有的ARM Cortex M 处理器是32位的精简指令集处理器 它们有 32位寄存器 32位内部数据路径 32位总线接口 除了32位数据 Cortex M处理器也可以有效地处理器8位和16位数据以及支持许多涉及64位数据的操作
  • STM32 上的 ADC 单次转换

    我正在研究 STM32 F103x 上的 ADC 编程 并从最简单的情况 单次转换开始 测量内部温度传感器 连接到 ADC1 的值 并使用 USART 将其发送到 COM 端口 目标似乎很明确 但是当我尝试将源代码下载到闪存时 它不会向 C
  • STM32F0、ST-link v2、OpenOCD 0.9.0:打开失败

    我在用着发射台 http www ti com ww en launchpad about htmlgcc arm none eabi 4 9 2015q2 为 STM32F0 进行编译 现在我想使用该集合中的 arm none eabi
  • 移动数组中的元素

    我需要一点帮助 我想将数组中的元素向上移动一个元素 以便新位置 1 包含位置 1 中的旧值 new 2 包含 old 1 依此类推 旧的最后一个值被丢弃 第一个位置的新值是我每秒给出的新值 我使用大小为 10 的数组 uint32 t TE

随机推荐

  • 管理 Python 依赖项

    有几种不同的方法来管理 Python 依赖项 最常见的方法是使用 requirements txt 文件 其中列出了所有项目依赖项及其版本 然后 您可以通过运行 pip install r requirements txt 为您的项目安装所
  • 玩家传递信息

    小 A 和 ta 的小伙伴们玩传信息游戏 游戏规则如下 有 n 名玩家 所有玩家编号分别为 0 n 1 其中小朋友 A 的编号为 0 每个玩家都有固定的若干个可传信息的其他玩家 也可能没有 传信息的关系是单向的 比如 A 可以向 B 传信息
  • X210核心板、底板原理图、数据手册导读

    1 有用的资料 写代码时需要查阅和参考的资料有 核心板原理图 底板原理图 相应硬件的数据手册 S5PV210数据手册 2 原理图 PCB图 丝印图各自是什么 原理图是电路原理设计图 各个电路中的部件的逻辑连接图 原理图可能会影响软件编写 P
  • python 按文件名批量移动文件至指定文件夹

    做猫狗分类任务 要求数据集划分为训练集 training dataset 和验证集 validation dataset 均包含dogs和cats两个目录 且每个目录下包含与目录名类别相同的RGB图 数据集共25000张照片 其中训练集猫狗
  • k8s之工作负载控制器的应用

    k8s之工作负载控制器的应用 1 k8s工作负载控制器是什么 2 Deployment介绍 2 1 deployment的资源清单文件 2 2 Deployment 滚动升级 2 3 Deployment 水平扩容 2 4 Deployme
  • rsync 时提示 skipping non-regular file。。。。。 的问题

    在执行 rsync 时会提示 skipping non regular file 的内容 原因是原文件夹中包含软链接导致 可以忽略 rsync rvtO delete media u2 downloads media uu2 downloa
  • windows10+vscode+anaconda+python3.7配置LiDAR-MOS动态物体点云开源项目

    之前用c 开发较多 最近开始尝试深度学习方面的工作 用到python合pytorch 经过4天的探索 终于能把测试代码跑起来了 记录下遇到的坑 1安装anaconda 这个不是本文重点 网上教程很多 2创建python虚拟环境 2 1使用v
  • STM32F103 USB虚拟成U盘功能

    STM32F103 USB虚拟成U盘功能 还在学习 中
  • 蓝桥杯省赛模拟题-智能门锁

    本文是对 坊间流传的 蓝桥杯省赛模拟题 智能门锁 的一种解法和思路 用的是蚂蚁科技的底层代码 其中有一个BUG虽然解决 但仍然不清除原因 数码管显示6个数组字符就会出问题 最多4个稳定 但是加入超声波底层就会都正常 不清楚这是什么原因造成的
  • yolo5 训练无人人机识别系统

    环境搭建 安装驱动 点击鼠标右键 如果出现NVIDIA图标 点开 出现如下图片 我的显卡是1650 根据显卡的型号去官网找相应的驱动下载就好了 驱动官网 安装好之后 打开命令行cmd 输入如下指令 nvidia smi 显示出如下数据即为安
  • 电机驱动的三种脉冲模式

    电机驱动的三种脉冲模式 脉冲 方向 脉冲 脉冲 A B正交脉冲
  • TLS certificate verification has been disabled

    git push 推送仓库报错 缺少了安全认证 所以解决方法是重启安全认证 git config global http sslVerify true
  • 电机控制常用PID控制算法

    本文分享自己在电机控制仿真中的建模方法 敬请批评指正 同名B站链接 Timer sir 电机控制常用PID控制算法 PID控制原理 位置式PID 增量式PID 抗饱和PID PID控制仿真 仿真模型 仿真结果 PID控制原理 将偏差的比例
  • 记一次ThreadLocal的使用注意点(线程池)

    Threadlocal的作用就不用多讲了 主要是一个map用于线程间的数据隔离 正常情况下 线程回收 那么这个线程对应的map值也会被回收 是ThreadLocal中被移除并非值本身被移除 如果是对象并且任然被引用 它是不会被回收的 基于上
  • SpringBoot使用Nacos作为配置中心服务和服务注册中心

    简介 从spring开始 所有的配置文件都放在项目中 如果需要修改配置文件内容 则需要登陆服务器重启服务 想象一下如果你有一百台服务的需要修改 那是不可想象的工作量 目前已有的配置中心 携程开源的Apollo 数据保存在mysql中 支持命
  • 【航空和卫星图像中检测建筑物】使用gabor特征和概率的城市区域和建筑物检测研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 文献来源 从甚高分辨率 VHR 航空和卫星
  • 快速实现 WIFI MQTT通信详解

    WIFI MQTT接入ONE NET云平台 一 本例程实现功能介绍 二 云平台操作流程 三 硬件接线图 材料清单 四 完整代码 代码解析 五 代码实验现象 前言 MQTT是一种基于TCP的物联网通信协议 在物联网领域应用非常广泛 基本上所有
  • kafka/bin/kafka-run-class.sh: line 342: exec: java: not found

    本来jps看了下 kafka和zookeeper都起来了 手痒 非要换宝塔的进程守护管理器 选目录为 home kafka 命令为 home kafka bin zookeeper server start sh home kafka co
  • 投票同款特效样式

    先看效果 再看代码 查看更多
  • STM32实现扫频功能

    简介 我们都知道 在信号发生器中 有一个扫频模式 指信号发生器在指定的扫描时间内从起始频率到终止频率变化输出 扫频模式支持线性扫频 对数扫频 和步进扫频三种方式 起始频率和终止频率 起始频率和终止频率是频率扫描的频率上限和下限 信号发生器总