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实现扫频功能 的相关文章

  • 如何更改闪存的起始地址?

    我正在使用 STM32F746ZG 和 FreeRTOS Flash的起始地址是0x08000000 但我想把它改成0x08040000 我通过谷歌搜索了这个问题 但没有找到解决方案 我更改了链接器脚本 如下所示 MEMORY RAM xr
  • 以字符串形式接收数字(uart)

    我正在尝试通过 uart 接收一个包装为字符串的数字 我发送数字 1000 所以我得到 4 个字节 空字符 但是 当我使用 atoi 将数组转换为数字并将整数与 1000 进行比较时 我并不总是得到正确的数字 这是我用于接收号码的中断处理函
  • 在 MCU 内部 FLASH 中从一个固件跳转到另一个固件

    我目前正在开发针对 STM32F030C8 的引导加载程序固件应用程序 我在分散文件中指定引导加载程序应用程序将占用主内存位置 0x08000000 到 0x08002FFF 扇区 0 到扇区 2 我还编写了一个主固件应用程序 存储在0x0
  • STM32 F072上的软件如何跳转到bootloader(DFU模式)?

    STM32应用笔记2606对此进行了讨论 但没有简单的代码示例 该答案已使用 IAR EWARM 在 STM32F072 Nucleo 板上进行了测试 这个答案使用 STM32标准外设库 仅此而已 请注意 验证您是否成功进入引导加载程序模式
  • 优化 ARM Cortex M3 代码

    我有一个 C 函数 它尝试将帧缓冲区复制到 FSMC RAM 这些函数将游戏循环的帧速率降低至 10FPS 我想知道如何分析反汇编的函数 我应该计算每个指令周期吗 我想知道CPU把时间花在哪里 在哪个部分 我确信该算法也是一个问题 因为它的
  • 物联网网关

    物联网网关是 连接物联网设备和互联网的重要桥梁 它负责将物联网设备采集到的数据进行处理 存储和转发 使其能够与云端或其它设备进行通信 物联网网关的作用是实现物联网设备与云端的无缝连接和数据交互 物联网网关功能 数据采集 物联网网关可以从物联
  • SHT10温湿度传感器——STM32驱动

    实验效果 硬件外观 接线 3 3V供电 IIC通讯 代码获取 查看下方 END
  • 串口通讯第一次发送数据多了一字节

    先初始化IO再初始化串口 导致第一次发送时 多出一个字节数据 优化方案 先初始化串口再初始化IO 即可正常通讯
  • 毕设开题分享 单片机智能教室系统(智能照明+人数统计)

    1 简介 Hi 大家好 今天向大家介绍一个学长做的单片机项目 单片机智能教室系统 智能照明 人数统计 大家可用于 课程设计 或 毕业设计 项目分享 https gitee com feifei1122 simulation project
  • Freertos低功耗管理

    空闲任务中的低功耗Tickless处理 在整个系统运行得过程中 其中大部分时间都是在执行空闲任务的 空闲任务之所以执行 因为在系统中的其他任务处于阻塞或者被挂起时才会执行 因此可以将空闲任务的执行时间转换成低功耗模式 在其他任务解除阻塞而准
  • CMSIS & STM32,如何开始? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想在 STM32 上使用 CMSIS 启动项目 网上一搜 没找到具体的教程 有些使用 SPL 开始项
  • Arm:objcopy 如何知道 elf 中的哪些部分要包含在二进制或 ihex 中?

    我正在开发一个项目 其中涉及解析arm elf 文件并从中提取部分 显然 elf 文件中有很多部分没有加载到闪存中 但我想知道 objcopy 到底如何知道要在二进制文件中包含哪些部分以直接闪存到闪存中 以arm elf文件的以下reade
  • 嵌入式开发--STM32G4系列片上FLASH的读写

    这个玩意吧 说起来很简单 就是几行代码的事 但楞是折腾了我大半天时间才搞定 原因后面说 先看代码吧 读操作 读操作很简单 以32位方式读取的时候是这样的 data IO uint32 t 0x0800F000 需要注意的是 当以32位方式读
  • 特殊寄存器

    特殊寄存器 文章目录 前言 一 背景 二 2 1 2 2 总结 前言 前期疑问 STM32特殊寄存器到底是什么 特殊寄存器怎么查看和调试代码 本文目标 记录和理解特殊寄存器 一 背景 最近在看ucosIII文章是 里面提到特殊寄存器 这就进
  • Cortex-M3与M4权威指南

    处理器类型 所有的ARM Cortex M 处理器是32位的精简指令集处理器 它们有 32位寄存器 32位内部数据路径 32位总线接口 除了32位数据 Cortex M处理器也可以有效地处理器8位和16位数据以及支持许多涉及64位数据的操作
  • 嵌入式 C++11 代码 — 我需要 volatile 吗?

    采用 Cortex M3 MCU STM32F1 的嵌入式设备 它具有嵌入式闪存 64K MCU固件可以在运行时重新编程闪存扇区 这是由闪存控制器 FMC 寄存器完成的 所以它不像a b那么简单 FMC 获取缓冲区指针并将数据刻录到某个闪存
  • STM32 上的 ADC 单次转换

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

    考虑以下 Contiki 程序 include
  • 使用 STM32F0 ADC 单独读取不同的输入

    STM32F072CBU 微控制器 我有多个 ADC 输入 并且希望单独读取它们 STMcubeMX 生成样板代码 假设我希望按顺序读取所有输入 但我无法弄清楚如何纠正这个问题 这篇博文 http blog koepi info 2015
  • stm32l0: 执行MI命令失败。使用 vFlashErase 数据包擦除闪存时出错

    我正在使用 Nucleo STM32L031 和 AC6 STM32 工作台 eclipse 我编写应用程序并进入调试模式 一切正常 直到我在应用程序中添加另一个功能 我注意到当我删除 评论 新函数 软件可以再次进入调试模式 但是当我添加

随机推荐

  • 管理 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实现扫频功能

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