基于stm32f407的示波器+FFT频谱分析

这篇具有很好参考价值的文章主要介绍了基于stm32f407的示波器+FFT频谱分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 设计思路
基于stm32f407的示波器+FFT频谱分析

2 DMA传输ADC采样值
使用DMA直接将ADC->DR中的数据传输到ADC数据缓存区,节省cpu资源,高速AD采集,代码如下:

DMA_InitStructure.DMA_PeripheralBaseAddr=(u32)&ADC3->DR;//外设基地址 ADC3_DR
DMA_InitStructure.DMA_Memory0BaseAddr = mar;   //内存基地址

3 ADC定时器触发(可修改ADC采样率)
为了实现ADC采样率可调,我将AD的出发方式设置为定时器触发,使用TIM3来触发adc采集,首先初始化定时器,先预设几种初值存入数组内,初始化的时候根据需求修改定时器初值,修改adc采样率时直接调用adc初始化函数,装不同的初值,就能实现修改采样率的功能, 定时器代码如下(完整源码连接在文章末):

/********ADC TIM触发初始化********/
  TIM_Cmd(TIM3, DISABLE);
  TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); //初始化定时器
  
  TIM_TimeBaseStructure.TIM_Period = 168000000/g_SampleFreqTable[TimeBaseId][0] - 1;//计数值42MHz*2/1000/168=500Hz  
  TIM_TimeBaseStructure.TIM_Prescaler = g_SampleFreqTable[TimeBaseId][1]-1;     //预分频器1000分频
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;     //时钟输入1分频
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
  
  TIM_ARRPreloadConfig(TIM3, ENABLE); //允许TIM3定时重载
  TIM_SelectOutputTrigger(TIM3, TIM_TRGOSource_Update);  //选择TIM3的UPDATA事件更新为触发源

ADC初始化一定要选择外部触发源:
ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_T3_TRGO;//外部触发源 TIM3_TRGO

4 DSP库FFT运算
ADC采集完时域波形后,调用了ST官方DSP库(arm_cortexM4lf_math.lib),实现FFT运算将时域波形转为频域图形,调用其中做fft运算的函数接口,最后dis_fft_dat[]数组内就是计算出来的频域图形值,将该数组绘制在LCD屏上,简易的频谱显示就完成了,效果见文章末的效果图。

arm_cfft_radix4_init_f32(&scfft,FFTDorpLen,0,1); //初始化scfft结构体
arm_cfft_radix4_f32(&scfft,testInput_fft_256);	//FFT计算(基4)
arm_cmplx_mag_f32(testInput_fft_256,dis_fft_dat,FFTDorpLen);	//把运算结果复数求模得幅值

5 UCOS操作系统
为了实现多任务处理,代码中移植了ucos操作系统,在start任务内创建了4个任务,emwin绘图任务、按键任务、DSP任务、led闪烁任务,其中DSP任务主要负责adc数据采集和FFT运算,并且DSP任务的优先级必须最高,否则可能会出现波形失真。

void start_task(void *pdata)
{
	OS_CPU_SR cpu_sr;
	
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_CRC,ENABLE);	//开启CRC时钟				//在所有窗口上使用存储设备
	
	OSStatInit(); //初始化统计任务
	OS_ENTER_CRITICAL();  //进入临界区,关闭中断
	
	OSTaskCreate(emwin_maintask,(void*)0,(OS_STK*)&EMWINDEMO_TASK_STK[EMWINDEMO_STK_SIZE-1],EMWINDEMO_TASK_PRIO);//2D绘图任务
	OSTaskCreate(touch_task,(void*)0,(OS_STK*)&TOUCH_TASK_STK[TOUCH_STK_SIZE-1],TOUCH_TASK_PRIO); //按键任务
	OSTaskCreate(led0_task,(void*)0,(OS_STK*)&LED0_TASK_STK[LED0_STK_SIZE-1],LED0_TASK_PRIO); //LED0任务
	OSTaskCreate(dsp_task,(void*)0,(OS_STK*)&DSP_TASK_STK[DSP_STK_SIZE-1],DSP_TASK_PRIO); 		//DSP 任务
	
	OSTaskSuspend(OS_PRIO_SELF); //挂起start任务
	OS_EXIT_CRITICAL();  //退出临界区,开中断
}

6 Emwin绘制背景图
波形绘制和页面快速刷新显示使用了emwin图形库,为了快速刷新显示背景图,直接使用GUI_MEMDEV_CreateFixed,GUI_MEMDEV_Select函数接口将图像像素直接存入内存,
基于stm32f407的示波器+FFT频谱分析

需要显示时调用GUI_MEMDEV_WriteAt(DrawTimeMem,Tx1,Tx2);函数接口将画面显示到Tx1,Tx2坐标开始的位置上,使用该方法背景图片刷新只需要10ms左右。
7 Emwin绘制波形图
绘制波形图直接调用GUI_DrawGraph函数,在Tx1Tx2坐标开始绘制长度为WindowDropLen的DIS_da波形。(DIS_da是一个256元素的数组)

GUI_SetColor(GUI_YELLOW);//设置颜色
GUI_DrawGraph(DIS_da,WindowDropLen,Tx1,Tx2+100);//绘制波形图

在stm32F407VET6 mini开发板上运行的效果
基于stm32f407的示波器+FFT频谱分析
基于stm32f407的示波器+FFT频谱分析
附源码连接(无需积分免费下载):https://download.csdn.net/download/weixin_40751800/85522977?spm=1001.2014.3001.5501

代码有不足的地方,多多评论交流文章来源地址https://www.toymoban.com/news/detail-446307.html

到了这里,关于基于stm32f407的示波器+FFT频谱分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于STM32的简易示波器项目(含代码)——HAL库

            前言: 本文基于STM32的 简易示波器项目 ,示波器作为 嵌入式开发 中必不可少的器件,其使用方式和工作原理是必须被掌握的。巧妙利用STM32可以实现 媲美度非常高 的示波器,本文中的简易示波器主要是为了简单实现了示波器的功能,主要利用了 ADC+DMA 去快速读

    2024年02月02日
    浏览(74)
  • STM32示波器设计

    目录 前言 1、硬件模块 2、示波器基础知识 2.1 当头一棒就是,波形的概念 2 .2 第二就是需要观察的波形参数 2.3 第三就是示波器参数 2.3.1 采样率 2.3.2 带宽 2.3.4 刷新率 3、ADC采集和DAC输出 3.1 ADC 采集实现 3.1.1 配置ADC采集为定时触发DMA采集模式 3.1.2 配置ADC关联的定时器 3.1.3 转

    2023年04月14日
    浏览(88)
  • 基于STM32F407的智能门锁

            在消费升级渗透在各个领域的今天,国民消费发生着巨大的变化,与每个人息息相关的家居行业也是如此。现今,越来越多的智能家居产品出现在普通老百姓的生活中,智能照明、智能窗帘、智能扫地机器人等各种智能产品都给人们的生活带来了极大的便利。智能

    2024年02月11日
    浏览(57)
  • stm32毕设 示波器设计与实现(源码+硬件+论文)

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月06日
    浏览(42)
  • 搭建STM32F407的Freertos系统(基于STM32CubeMX)

           本人长期开发Linux、Windows上应用软件,一直以来MCU开发有所接触,但较少(最近项目需要,小公司么,都得会,被逼的),好在有STM32CubeMX这样工具,貌似就是我想要的工具。         本次demo目标立下:         1. 搭建或移植FreeRTOS到STM32上,毕竟对于长期在Linux环境

    2024年02月10日
    浏览(51)
  • 基于STM32F407实现超声波测距(SR04)

    今天要实现的功能是超声波测距,这一功能在很多的地方都能用到,比如:在智能小车上可以添加超声波避障功能。今天需要用到SR04超声波模块,在使用这一模块的时候我很会接触到时序图。 模块如图所示: 模块有四个引脚 VCC 供 5V电源, GND 为地线, TRIG 触 发 控 制 信 号

    2024年02月11日
    浏览(46)
  • STM32CubeMX生成C代码及时钟树配置(基于stm32f407)

    近来对于stm32单片机编程中,HAL库逐渐取代标准库成为主流的库。标准库支持的芯片型号有限,而且目前已经停止支持,而HAL库支持所有类型的芯片,可移植性也很高,再加上有神器STM32Cube可以生成工程模板,越来越多的编程开始从使用标准库转到使用HAL库。 新建工程后,在

    2024年02月15日
    浏览(51)
  • 基于STM32F407的俄罗斯方块小游戏的设计

        本文讲述的是基于STM32F407的俄罗斯方块小游戏的设计思路和测试结果,具体的代码分析见文章 基于STM32F407的俄罗斯方块游戏代码分析_钻仰弥坚的博客-CSDN博客 1.1 可行性分析 可行性分析能够对新系统进行各方面的分析与研究,确定新系统是否具有开发的可行性和必要性

    2024年02月11日
    浏览(41)
  • stm32f407探索者开发板(二)——新建工程(基于固件库)

    说实话,我非常不想这篇文章,因为太长太长了,我看视频写都写了一个下午(虽然我下午一直在摸鱼,啊啊啊啊啊)害,不管了,赶紧开始写吧,不然今晚是写不完了,呜呜呜…… 把这个里面的文件放先给下好,我这里是没有光盘的,所以需要从百度网盘上下载好,这里面

    2023年04月08日
    浏览(72)
  • 从STM32F407到AT32F407(一)

    雅特力公司的MCU有着性能超群,价格优越的巨大优势,缺点是相关资料少一些,我们可以充分利用ST的现有资源来开发它。 我用雅特力的STM32F437开发板,使用原子 stm32f407的开发板自带程序,测试串口程序,原设定串口波特率为115200,但是输出乱码,波特率改成230400,串口输

    2024年02月02日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包