為了對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測量后不經過濾波直接輸出:
經過濾波的輸出:
結論:經過濾波后,很好地把噪聲濾除了,但相位有一定的滯后,幅值會變小。
上一篇:stm32f407之CAN控制器(操作寄存器)
下一篇:STM32一個Timer輸出4路不同頻率、可調占空比的PWM
推薦閱讀
史海拾趣
公司成立與拆分:Agilent Technologies是一家跨國科技公司,成立于1999年。它是惠普公司(Hewlett-Packard,HP)的分拆部門,旨在將惠普的測試與測量、半導體業務分離出來,形成獨立的實體。這一舉措旨在使惠普更專注于其核心業務,同時為Agilent提供更大的發展空間。
產品創新與多元化:Agilent Technologies以其廣泛的產品組合而聞名,涵蓋了測試與測量、生命科學、化學分析和電子產品等多個領域。該公司不斷推出創新的產品和解決方案,滿足客戶在科研、制造和市場應用中的需求。例如,Agilent的測試與測量儀器被廣泛應用于電子、通信、航空航天等行業,為客戶提供精準的測試和分析。
全球化布局與市場拓展:作為一家全球性企業,Agilent Technologies在全球范圍內設有研發、生產和銷售網絡。公司在美國、歐洲、亞洲等地都設有重要的研發中心和生產基地,以滿足不同地區客戶的需求。此外,Agilent通過收購和合作等方式擴大了其產品線和市場份額,進一步加強了其在全球電子行業的地位。
科研與創新投入:Agilent Technologies將大量資源投入到科研與創新領域,不斷推動技術的發展和應用。公司與學術界、行業組織以及其他企業建立了緊密的合作關系,共同開展前沿技術研究和開發。Agilent的研究團隊不斷探索新的領域和解決方案,推動了科學技術的進步,為客戶提供了更加先進和可靠的產品和服務。
社會責任與可持續發展:作為一家全球企業,Agilent Technologies注重社會責任和可持續發展。公司積極參與慈善事業和社區服務,支持教育、環保、健康等多個領域的項目和活動。此外,Agilent致力于推動綠色技術和環保生產,采取了一系列措施減少對環境的影響,提高資源利用效率,助力實現可持續發展目標。
阿爾特拉(Altera Corporation)是一家以可編程邏輯器件(FPGA)和相關技術為主的半導體公司,成立于1983年,總部位于美國加利福尼亞州的圣塔克拉拉。以下是關于阿爾特拉公司發展的五個相關故事:
創立與早期發展:阿爾特拉公司由Robert Hartmann和Michael Magranet等人于1983年創立,最初致力于設計和制造電可擦除可編程只讀存儲器(EEPROM)。1984年,公司推出了業界第一個商用FPGA產品,即EP300系列,標志著阿爾特拉在FPGA領域的開創性突破。隨后,公司不斷擴大產品線,加大研發投入,逐步成為FPGA領域的領軍企業之一。
FPGA技術創新:阿爾特拉公司在FPGA技術方面持續進行創新。1992年,公司推出了基于靜態隨機存儲器(SRAM)的FPGA器件,使得FPGA在速度和靈活性方面有了顯著提升。此后,阿爾特拉不斷推出新的器件系列和工具軟件,以滿足客戶對于性能和可編程性的不斷提升的需求。
與競爭對手的競爭:在FPGA市場,阿爾特拉與Xilinx是兩大主要競爭對手。兩家公司之間展開了激烈的競爭,包括技術研發、產品性能、市場份額等方面。為了在市場上取得優勢,阿爾特拉不斷加大研發投入,推出了一系列領先的產品和解決方案,并通過全球銷售網絡拓展市場。
收購與合并:阿爾特拉公司在發展過程中進行了多次收購與合并,以擴大市場份額和提升技術實力。2015年,英特爾公司以約160億美元的價格收購了阿爾特拉,將其并入英特爾旗下成為其子公司。這一收購使得英特爾得以整合阿爾特拉的FPGA技術和產品,進一步鞏固了其在半導體行業的地位。
公司發展與創新:作為英特爾的子公司,阿爾特拉繼續致力于技術創新和業務拓展。公司不僅持續改進現有產品的性能和功能,還積極投入到新興領域的研發與應用,如數據中心、人工智能、物聯網等。阿爾特拉通過不斷推出創新產品和解決方案,保持了在半導體行業的領先地位。
以上是關于阿爾特拉公司發展的五個相關故事,這些故事展示了阿爾特拉從創立初期到被英特爾收購的發展歷程,以及其在FPGA技術領域的技術創新、市場競爭和業務拓展等方面的重要進展。
在80年代,Electroswitch迎來了一個重要的技術突破期。公司成功開發了一系列符合MIL規格的旋轉開關,這些產品憑借其堅固耐用和高品質的特性,迅速贏得了市場的認可。同時,Electroswitch還積極適應新的生產線,不斷擴大在工業和電氣實用市場的份額。此外,公司還成功收購了西屋電氣開關部,進一步增強了其在電力行業中的競爭力。
2021年,弘凱光電在江蘇南通投資建設了集成智慧光源項目,總投資額高達10億元。這一項目的建成,不僅大幅提升了公司的產能和效率,更為汽車照明、智能家居、3C電子等LED高端應用領域提供了高品質的產品。項目的成功投產,標志著弘凱光電在光電半導體領域的技術實力和市場地位得到了進一步提升。
進入21世紀后,隨著新能源汽車產業的興起,FORYARD敏銳地捕捉到了這一市場機遇。公司開始將研發重心轉向汽車電子領域,特別是新能源汽車的電池管理系統(BMS)和電機控制器(MCU)等關鍵技術。通過持續的技術創新和研發投入,FORYARD成功開發出了一系列高性能、高可靠性的汽車電子產品,并成功應用于多家知名新能源汽車制造商的車型中。這一舉措不僅為公司帶來了新的增長點,也推動了新能源汽車產業的快速發展。
Dialog Semiconductor自2000年成立以來,就致力于技術創新。公司在早期階段就專注于電源管理技術的研發,推出了多款高效能、低功耗的電源管理芯片,這些芯片被廣泛應用于智能手機、可穿戴設備等移動設備中。隨著物聯網(IoT)的興起,Dialog Semiconductor進一步拓展了產品線,增加了藍牙和射頻(RF)芯片等連接性解決方案,以滿足市場對低功耗無線通信的需求。這些技術創新使Dialog Semiconductor在電子行業中建立了穩固的地位。
首先要說明的是,這是轉載的文章,放在這里是想跟大家一起學習一下。 我在咱們論壇搜了一下文章名字,論壇好像還沒有這篇文章,但也有可能我搜索的不夠細致。如果論壇已有這個文章,請管理員刪除此貼。 &n ...… 查看全部問答∨ |
|
AT89C2051串口通訊,設備的協議上寫的停止位是1/2,我應該怎樣設置? /* 晶振11059200,波特率9600,誤差最精確 */ void initUart(void) { TMOD |= 0x20; SCON = 0x50; TH1 = 0xfd; TL1 = 0xfd; TR ...… 查看全部問答∨ |
|
買芯片時,發現同一個型號,比如說LM3S1150的,還有好多種,什么LM3S1150-IQC50-A2 ,LM3S1150-IBZ50-A2 ,LM3S1150-IBZ50-A2T ,LM3S1150-EQC50-A2 ……之間有什么區別嗎?希望高手解釋下哈!謝謝了!… 查看全部問答∨ |
設計資源 培訓 開發板 精華推薦
- STM32一文通(6) 外部中斷
- ESP32玩轉MicroPython(一) 燒入固件, 初識
- ESP32玩轉MicroPython(二) 連接WIFI網絡 webperl文件傳輸
- ESP32玩轉MicroPython(三) 延時、計時 和GPIO操作
- 玩轉 ESP32 + Arduino (一) 開發環境搭建
- 玩轉 ESP32 + Arduino (四) 電容按鍵 霍爾傳感器 外部中斷 延時 脈沖檢測
- 玩轉 ESP32 + Arduino (五) platformIO引入類庫 自開發庫 串口打印字符串
- 玩轉 ESP32 + Arduino (六) 硬件定時器, IIC, SPI
- 玩轉 ESP32 + Arduino (八) U8G2驅動OLED
- 有獎直播:英飛凌 MERUS™ D 類音頻放大器的多電平技術及其優勢
- 有獎直播:英飛凌工業半導體在電機驅動行業中的應用 2020年4月21日 上午10:00-11:30 準時開啟!
- 等值現金懸賞,等你揭榜!
- 有獎直播|英飛凌OBC解決方案深度詳解 報名中!
- 打卡最后一周,解鎖TI汽車解決方案。解鎖的數量決定獎品的質量!
- 有獎評測:平頭哥RISC-V低功耗板——RVB2601
- 國產FPGA安路科技研討會-北京站 火熱報名中,參會贏京東卡!
- Microchip最新SAM 以及 PIC32單片機軟件開發平臺-- MPLAB® Harmony V3介紹 ”
- 有獎直播|Nexperia針對車聯網應用的高效ESD解決方案