历史上的今天
返回首页

历史上的今天

今天是:2024年09月20日(星期五)

正在发生

2018年09月20日 | stm32f407之数字滤波(操作寄存器)

2018-09-20 来源:eefocus

数字滤波


为了对stm32f4的ADC和DAC有更多的了解,我决定做一个实用性比较强的实验。就是数字滤波实验,利用stm32f4的DAC可以产生噪声的特点,利用它的一路DAC产生叠加噪声的信号作为原始信号。然后用ADC测量,把结果经过滤波处理后用DAC的另一通道把结果输出,用双踪示波器观察。



一阶惯性滤波器及其数字化


一阶惯性滤波器的传递函数为:



利用一阶差分法离散化,可以得到一阶惯性数字滤波算法:


其中T为采样周期,为滤波时间常数。T和必须根据信号频谱来选择。



编程实现:


a.     设定一个1024点正弦波表,用DAC1叠加噪声输出


b.     配置定时器6更新频率为1M


c.     DAC的时钟为TIM6更新事件,1024点,频率大概为0.5M


d.     在TIM6的更新中断中启动一次AD转换


e.     AD转换中断中做滤波处理,然后把数值送DAC2,启动一次DAC2




程序:



[plain] view plaincopy

/************************************  

    标题:数字滤波实验  

    软件平台:IAR for ARM6.21  

    硬件平台:stm32f4-discovery  

    主频:168M  

  

    描述:用DAC1产生一路叠加了噪声的信号  

          用ADC通道11测量上面产生的信号  

          对ADC的测量结果进行滤波处理  

          用DAC2把滤波后的结果输出  

      

    author:小船  

    data:2012-02-17  

*************************************/  

  

#include   

#include "MyDebugger.h"  

#include "sintable.h"   

  

/*********变量声明********/  

uint16_t Y0, Y1;//滤波器输出值  

float T = 0.000001;//采样周期  

float C = 0.00003; //滤波常数  

  

/*********函数声明********/  

void timer6_Init(void);  

void ADC3_IN11_Config(void);  

void DAC_channel2_Config(void);  

void Generate_SinSignal_with_Noise(void);  

  

void main ()  

{     

  

  SCB->AIRCR = 0x05FA0000 | 0x400;  //中断优先级分组 抢占:响应=3:1  

   

  MyDebugger_Init();  

   

  ADC3_IN11_Config();  

  Generate_SinSignal_with_Noise();  

  DAC_channel2_Config();    

  timer6_Init();   

  

  while(1)  

  {  

  };  

}  

  

/**************************************  

  函数名:timer6_Init  

  参数:无  

  返回值:无  

  功能:设置定时器6更新频率为1M  

        定时器6更新事件为DAC1、2时钟  

        更新中断启动ADC检测  

**************************************/  

void timer6_Init(void)  

{  

  /***定时器设置***/  

  RCC->APB1ENR |= (1<<4);//打开TIM6时钟  

  TIM6->PSC = 0;   

  TIM6->ARR = 83;  //使得更新事件频率为1m  

  TIM6->CR2 |=  0x00000020;//更新事件输出  

  TIM6->DIER |= 1; //使能中断  

  TIM6->CR1 |= 1; //开始计时  

}  

  

/**************************************  

  函数名:Generate_SinSignal_with_Noise  

  参数:无  

  返回值:无  

  功能:用DAC1产生一路叠加了噪声的信号  

***************************************/  

void Generate_SinSignal_with_Noise(void)  

{  

  /***GPIO设置***/  

  RCC->AHB1ENR |= (1<<0); //打开GPIOA时钟  

  GPIOA->MODER |= 0x00000F00;//PA4、5模拟模式  

  GPIOA->PUPDR &= 0xfffff0ff;//无上拉无下拉     

    

  /***DAC设置***/  

  RCC->APB1ENR |= (1<<29); //使能DAC时钟  

  DAC->CR &= 0xffff0000;  

  /*  

  使能DMA堵塞中断  

  使能通道1触发  

  叠加噪声  

  */  

  DAC->CR |= ( (1<<13) | (1<<2) | 0x00000040 | 0x00000800);    

  NVIC->IP[54] = 0xA0;  

  NVIC->ISER[1] |= (1<<(54-32));  

   

  /***DMA设置***/  

  RCC->AHB1ENR |= (1<<21); //使能DMA1时钟  

  DAC->CR &= ~(1<<12);//DAC dma发送模式除能  

  DMA1_Stream5->CR &= 0xFFFFFFFE; //除能DMA1_Stream5  

  while(DMA1_Stream5->CR & 0x00000001);//确保DMA可以被设置   

  DMA1->HIFCR |= 0x000004f0;//传送前清空DMA1_Stream5所有中断标志   

  DMA1_Stream5->PAR = (uint32_t)&DAC->DHR12R1;//设置外设地址  

  DMA1_Stream5->M0AR = (uint32_t)SinTable; //设置内存地址  

  DMA1_Stream5->CR |= 0x0002800;//16位数据  

  DMA1_Stream5->NDTR = 1024; //设置dma传输数据的数量  

  /*  

    设置dma通道7,即DAC1  

    优先级Medium  

    传输方向内存到外设  

    内存递增模式  

    循环模式  

  */  

  DMA1_Stream5->CR |= ( 0x0e000000 | 0x00010000 | (1<<6)  

                        | (1<<10) | (1<<8) );   

    

  DMA1_Stream5->CR |= 1; //DMA数据流5使能  

    

  DAC->CR |= (1<<0);   //DAC通道1使能  

  

  DAC->CR |= (1<<12);//DAC dma发送模式使能  

}  

  

/**************************************  

  函数名:ADC3_IN11_Config  

  参数:无  

  返回值:无  

  功能:用ADC通道11测量上面产生的信号  

***************************************/  

void ADC3_IN11_Config(void)  

{  

    /***GPIO设置***/  

  RCC->AHB1ENR |= (1<<2); //打开GPIOC时钟  

  GPIOC->MODER &= 0xfffffff3;//PC1模拟模式  

  GPIOC->MODER |= 0x0000000C;  

  GPIOC->PUPDR &= 0xfffffff3;//无上拉无下拉     

    

  /***ADC3设置***/  

  RCC->APB2ENR |= (1<<10); //使能ADC3时钟  

  ADC3->SQR1 = 0x00000000;//转换一个通道  

  ADC3->SQR3 = 0x0000000B;//第一个通道为ADC3_in11  

  ADC3->CR1 &= 0x00000000;   

  ADC3->CR2 &= 0x00000000;    

 //单次转换  

  ADC3->CR1 |= (1<<5);//使能转换完成中断  

  NVIC->IP[18] = 0xc0;  

  NVIC->ISER[0] |= (1<<18);   

}  

  

/**************************************  

  函数名:DAC_channel2_Config  

  参数:无  

  返回值:无  

  功能:用DAC2把滤波后的结果输出  

***************************************/  

void DAC_channel2_Config(void)  

{  

  /***DAC设置***/  

  RCC->APB1ENR |= (1<<29); //使能DAC时钟  

  DAC->CR &= 0x0000ffff;  

  /*  

  使能通道2触发   

  配置为软件触发  

  */  

  DAC->CR |= ( (1<<18) | (0x00380000) );   

    

  DAC->CR |= (1<<16);   //DAC通道2使能  

}  

  

void TIM6_DAC_IRQHandler(void)  

{  

  if( DAC->SR & (1<<13) )  

  {  

    MyDebugger_LEDs(red, on);//亮红灯指示DAC1的DMA传输数据错误  

    DAC->SR &= ~(1<<13);   

  }  

    

  if(TIM6->SR)  

  {      

    ADC3->CR2 |= (1<<0);   //开启AD转换    

    ADC3->CR2 |= (1<<30); //规则通道转换开始  

      

    TIM6->SR &= ~(0x0001);   

  }  

}  

   

void ADC_IRQHandler(void)  

{  

  if( ADC3->SR & (1<<1))  

  {  

    Y0 = (uint16_t)( (float)(( T / C ) * ADC3->DR) //滤波公式  

                      + (float)(( 1 - T / C ) * Y1) );  

    Y1 = Y0;  

    DAC->DHR12R2 = Y0;  //DAC2输出滤波后的结果  

    DAC->SWTRIGR |= (1<<1);  

      

    ADC3->SR &= ~(1<<1);  

  }  

}  

输出的信号:




用AD测量后不经过滤波直接输出:




经过滤波的输出:


结论:经过滤波后,很好地把噪声滤除了,但相位有一定的滞后,幅值会变小。


推荐阅读

史海拾趣

Fairview Microwave Inc公司的发展小趣事

Fairview Microwave Inc公司成立于1992年,最初只是一个由几位工程师组成的小团队,他们致力于开发高质量的射频和微波组件。在当时,微波技术正逐渐在通信、雷达和卫星通信等领域得到广泛应用,但市场上缺乏高性能、可靠的组件供应商。Fairview Microwave看到了这个市场空白,决定从适配器、连接器和衰减器等基础组件入手,凭借精湛的技术和不断的创新,逐渐在行业内树立了良好的口碑。

Bomar公司的发展小趣事

近年来,随着物联网和人工智能技术的快速发展,智能化物流成为了电子行业的新趋势。Bomar公司敏锐地捕捉到了这一市场机遇,开始将业务范围拓展至智能化物流领域。通过与深兰科技等公司的合作,Bomar公司成功推出了智能化物流、仓储装备以及清洁机器人等产品,并成功销往欧洲市场。这些产品的推出不仅提升了Bomar公司的市场竞争力,也为公司的未来发展开辟了新的增长点。

AZM [Arizona Microtek, Inc]公司的发展小趣事

为了进一步提升公司的国际竞争力,AZM公司开始实施国际化战略。公司积极寻求与国际知名企业的合作机会,通过技术合作、市场合作等方式,共同开拓全球市场。同时,AZM公司还在海外设立了研发中心和生产基地,以便更好地了解当地市场需求和技术发展趋势,实现全球布局和资源整合。

请注意,这些故事是基于假设和推测构建的,并非AZM公司的真实发展历程。如果需要了解AZM公司的具体发展历程和故事,建议查阅该公司的官方网站、新闻报道或相关文献资料。

Helium公司的发展小趣事

Helium公司成立于2013年,由Shawn Fanning、Amir Haleem和Sean Carey共同创立。在创立初期,Helium专注于物联网无线网络技术的研究,但并未迅速获得市场关注。这一时期,电子行业正处于创新与转型阶段,物联网作为新兴领域展现出巨大潜力。Helium团队预见到了物联网的发展趋势,但由于缺乏明确的商业模式,其网络发展并未大规模铺开。然而,这段时期的积累为Helium后续的技术突破和市场拓展奠定了坚实基础。

Electronic Sensor + Resistor GmbH公司的发展小趣事

Electronic Sensor + Resistor GmbH(简称ESR公司)的创立源于两位电子工程师的远见卓识。他们发现市场上对于高精度电子传感器和定制电阻器的需求日益增长,但现有产品往往无法满足特定应用的性能要求。于是,ESR公司应运而生,专注于研发和生产高性能的电子传感器和电阻器。

在创业初期,ESR公司面临着资金、技术和市场的三重挑战。但凭借其卓越的研发实力和坚持不懈的市场推广,公司逐渐在市场上树立起高品质、高可靠性的品牌形象。通过与多家知名企业的合作,ESR公司的产品逐渐获得了市场的认可。

Alliance Memory公司的发展小趣事

随着全球对环保和可持续发展的日益关注,ESR公司积极响应国家政策和市场趋势,致力于实现绿色生产和发展。公司引进先进的环保设备和技术,减少生产过程中的废弃物和污染排放;同时加强资源回收利用和节能减排工作,降低生产成本和能耗。

此外,ESR公司还积极参与环保公益活动和社会责任项目,为推动电子行业的绿色发展和可持续发展贡献自己的力量。这种对环保的关注和投入不仅提升了公司的社会形象也增强了公司的竞争力和可持续发展能力。

问答坊 | AI 解惑

C语言时钟程序在KEIL中提示出错

#include                         #define uchar unsigned char #define uint unsigned int char DATA_7SEG[10]={0xC0,0xF9,0xA4,0xB0,0x99,     ...…

查看全部问答>

多线程中使用WSAStartup和WSAClearup

我该在那里调用WSAStartup和WSAClearup呢,是每个线程在进入时调用一次WSAStartup、退出时调用一次WSAClearup呢,还是在主函数中调用一次WSAStartup和WSAClearup呢? 我现在有两个类,两个类都使用了网络,都开了一个线程,我现在的做法是在每个类 ...…

查看全部问答>

I2C的传输速度(比如100,400)要求严格吗?

我如果是模拟的I2C,速度打算为100Kbit/S,那么对应一个2进制位数据,延迟时间为10US,那么我在人为的拉高拉低SCL的时候是不是一定要保持频率为100K? 如果我输出了个比如80K,会不会出错,我还没有做实验,先听听大家的意见 谢谢…

查看全部问答>

【转载】房子我喜欢Q版,车子却偏爱大肚腩

前几天看到坛子里有兄弟贴出了B70的平均油耗,着实超出我的意料,没想到2.0MT的平均油耗能控制在8个油,这可是我买车首要参照的系数,不然就真是买车容易养车难了;此外,空间必须足够大,谁让咱的房子已经是Q版了,车子可不能在抠抠嗖嗖的了。 ...…

查看全部问答>

香版主:虚拟串口

香版主:STM32USB的虚拟串口怎么用?我下了这个"VCPDriver_V1.1_Setup"装上去怎么没反映?还有我在"um0424"上没有找到"Software Driver"文件夹,当然也没有inf文件.大家帮帮忙啊,  …

查看全部问答>

STM32 USB HID实现USB双向通信

STM32 和USB HID实现USB双向通信有什么作用??…

查看全部问答>

产生pwm 占空比可变 请问程序下进去没反映啊

#include #define uint unsigned int #define uchar unsigned char #define keyin    (P1IN & 0x0F) void delay(void); void main(void) {     uchar temp= 0;     uint PWM_T = 1000;   //占空 ...…

查看全部问答>

求助关于USB Host的问题

我现在手里有一个读卡器设备,作为USB Device。采用了CDC模式通信。现在我要用LM3S9B96作为USB Host,读取数据并通过网络上传到服务器。 以前没弄过USB Host相关的东西,请问这种情况下,我USB Host应该是工作在什么模式下?如果Device采用了CDC的 ...…

查看全部问答>

AD的困扰--AD采集的数据转换后比模拟量值偏小

最近用msp430f2013的SD16采集0.08v到0.4v的电压值,但是AD转换后的数据比模拟值要偏小,而且随着信号的增大,偏差越来越大。量程范围内,最大偏差10mv。各位大侠请指点下小弟,感激不尽。…

查看全部问答>

ARM Cortex-M0 LPC1114入门手册

奉献:ARM Cortex-M0 LPC1114入门手册 第一章 简介第二章 初识LPC1114   2.1 观引脚识功能   2.2 寄存器配置第三章 LPC1114开发环境建立与使用   3.1 安装开发软件   3.2 新建一个LPC1114工程  &nbs ...…

查看全部问答>