七、重定向標(biāo)準(zhǔn)輸入輸出
以上實(shí)現(xiàn)了串口驅(qū)動(dòng),我們現(xiàn)在來實(shí)現(xiàn)串口重定向標(biāo)準(zhǔn)輸入輸出以方便后面的調(diào)試,處于資源和效率考慮,我們這里移植小型的xprintf而不是使用printf。添加xprintf.c xprintf.h到工程src下xprintf.h中使能以下宏
左右滑動(dòng)查看完整內(nèi)容
#define XF_USE_OUTPUT 1 /* 1: Enable output functions */ #define XF_CRLF 1 /* 1: Convert ==> in the output char */ #define XF_USE_DUMP 1 /* 1: Enable put_dump function */ #define XF_USE_LLI 1 /* 1: Enable long long integer in size prefix ll */ #define XF_USE_FP 1 /* 1: Enable support for floating point in type e and f */ #define XF_DPC '.' /* Decimal separator for floating point */ #define XF_USE_INPUT 1 /* 1: Enable input functions */ #define XF_INPUT_ECHO 1 /* 1: Echo back input chars in xgets function */hal_entry.c中
#include "xprintf.h"
設(shè)置收發(fā)接口
左右滑動(dòng)查看完整內(nèi)容
void xprintf_output(int ch) { uint8_t val = (uint8_t)ch; drv_uart_write(&val,1); } int xprintf_input(void) { uint8_t val; while(drv_uart_read(&val,1) <= 0); return (int)val; } xdev_out(xprintf_output); xdev_in(xprintf_input);
測(cè)試
左右滑動(dòng)查看完整內(nèi)容
xprintf("%d ", 1234); /* "1234" */ xprintf("%6d,%3d%% ", -200, 5); /* " -200, 5%" */ xprintf("%-6u ", 100); /* "100 " */ xprintf("%ld ", 12345678); /* "12345678" */ xprintf("%llu ", 0x100000000); /* "4294967296" */ xprintf("%lld ", -1LL); /* "-1" */ xprintf("%04x ", 0xA3); /* "00a3" */ xprintf("%08lX ", 0x123ABC); /* "00123ABC" */ xprintf("%016b ", 0x550F); /* "0101010100001111" */ xprintf("%*d ", 6, 100); /* " 100" */ xprintf("%s ", "abcdefg"); /* "abcdefg" */ xprintf("%5s ", "abc"); /* " abc" */ xprintf("%-5s ", "abc"); /* "abc " */ xprintf("%.5s ", "abcdefg"); /* "abcde" */ xprintf("%-5.2s ", "abcdefg"); /* "ab " */ xprintf("%c ", 'a'); /* "a" */ xprintf("%12f ", 10.0); /* " 10.000000" */ xprintf("%.4E ", 123.45678); /* "1.2346E+02" */ for(;;) { char buffer[64]; char* p = buffer; long a; long b; long c; xprintf("please input int a and int b "); xgets(buffer,sizeof(buffer)); xatoi(&p,&a); xatoi(&p,&b); c = a + b; xprintf("%d + %d = %d ",a,b,c); }
輸入1空格2回車打印1 + 2 = 3
八、命令行實(shí)現(xiàn)
以上實(shí)現(xiàn)了串口重定向,我們現(xiàn)在實(shí)現(xiàn)簡單的命令行,以便后面進(jìn)行交互操作。設(shè)計(jì)思想是,定義命令字符串和實(shí)現(xiàn)函數(shù)的對(duì)應(yīng)表,標(biāo)準(zhǔn)輸入讀一行,搜索對(duì)應(yīng)表和字符串匹配,匹配則執(zhí)行對(duì)應(yīng)的函數(shù)。
實(shí)現(xiàn)代碼見shell.c shell.h shell_func.c shell_func.h測(cè)試輸入help回車打印如下:
使用如下麥克風(fēng)采集模塊ADC采集信號(hào)。
參考電壓為3.3V
配置ADC配置P001為ADC的CH1
添加相關(guān)代碼
配置屬性
生成工程 ? 添加adc.c和adc.h代碼測(cè)試
#include"adc.h"
初始化
左右滑動(dòng)查看完整內(nèi)容
adc_init(); staticuint16_tadcbuffer[1024]={0};
循環(huán)調(diào)用
左右滑動(dòng)查看完整內(nèi)容
adc_read(adcbuffer, 1024); for(uint32_ti=0;i<1024;?i++)?? ???????????{???????????xprintf("/*%d*/ ",adcbuffer);?? ???????????}
也可以添加命令行采集Shell_func.h中
void ADCFun(void* param);
Shell_func.c中
左右滑動(dòng)查看完整內(nèi)容
#include "adc.h" { (const uint8_t*)"adc", ADCFun, "adc"}, /*ADC采集*/
十、ADC可視化(虛擬示波器)
通過串口將采集的數(shù)據(jù)發(fā)送到PC,PC端使用可視化上位機(jī)進(jìn)行可視化,即實(shí)現(xiàn)了虛擬示波器的應(yīng)用。
添加DSP算法庫使用的是CMSIS-DSP的算法庫
添加的代碼如下
十二、FFT諧波分析(電能質(zhì)量分析)
12.1FFT算法
我們可以使用fft算法對(duì)原始數(shù)據(jù)盡心分析,得到諧波,直流量,相位,頻率,幅值等信息,以進(jìn)行電能質(zhì)量分析,噪聲分析等各種應(yīng)用。
12.2添加命令行
添加命令行參數(shù)Shell_func.h中
void FftFun(void* param);
Shell_func.c中
左右滑動(dòng)查看完整內(nèi)容
#include "fft.h" {(constuint8_t*)"ft",FftFun,"fft"},/*fft分析*/ void FftFun(void* param) { int num; if(1 == sscanf(param,"%*s %d",&num)) { while(num--) { fft_test(); } } }
12.3代碼
Fft.c fft.h見git
12.4測(cè)試
上位機(jī)輸入fft 10即進(jìn)行10次采樣分析效果如下
十三、噪聲檢測(cè)與分析
我們也可以將開發(fā)板打造為噪聲監(jiān)測(cè)分析儀,對(duì)于噪聲首先關(guān)心的就是其大小,我們可以實(shí)時(shí)采集聲音并通過算法檢測(cè)出極大值,最終換算成相對(duì)基準(zhǔn)功率的噪聲分貝值。同時(shí)也可以通過命令行控制何時(shí)進(jìn)行采樣分析,和其他功能是獨(dú)立的,可以單獨(dú)調(diào)用,集成在一起作為工具集供調(diào)用。當(dāng)然也可以進(jìn)行噪聲的諧波等分析,和前面的點(diǎn)那個(gè)質(zhì)量諧波分析等一樣。
13.1 極大值檢測(cè)算法
極大值檢測(cè)算法參見:
https://www.mdpi.com/1999-4893/5/4/588/htm
13.2 添加命令行
添加命令行參數(shù)Shell_func.h中
void MaxFun(void* param);
Shell_func.c中
左右滑動(dòng)查看完整內(nèi)容
#include "max.h" { (const uint8_t*)"max", MaxFun, "max"}, /*極值檢測(cè)*/ void MaxFun(void* param) { int num; if(1 == sscanf(param,"%*s %d",&num)) { while(num--) { max_test(); } } }
13.3 代碼
Max.c max.h詳見git
13.4 測(cè)試
上位機(jī)輸入max 10即進(jìn)行10次采樣分析可視化顯示如下,黃色線是極大值檢測(cè)結(jié)果,藍(lán)色線是原始數(shù)據(jù)。
十四、數(shù)字濾波器
14.1 IIR濾波器
DSP算法庫中提供了很多濾波算法,我們這里將IIR添加到我們的工具集中進(jìn)行演示。
14.2 添加命令行
添加命令行參數(shù)Shell_func.h中
voidIirFun(void*param);
Shell_func.c中
左右滑動(dòng)查看完整內(nèi)容
#include "iir.h" { (const uint8_t*)"iir", IirFun, "iir"}, /*濾波分析*/ void IirFun(void* param) { int num; if(1 == sscanf(param,"%*s %d",&num)) { while(num--) { iir_test(); } } }
14.3代碼
Iir.c iir.h詳見git
14.4測(cè)試
上位機(jī)輸入iir 10即進(jìn)行10次采樣分析可視化顯示如下,黃色線濾波結(jié)果,藍(lán)色線是原始數(shù)據(jù)。
十五、相位頻率幅值分析(頻率計(jì)等)
15.1相位分析
FFT計(jì)算結(jié)果,幅值最大的橫坐標(biāo)對(duì)應(yīng)信號(hào)頻率,縱坐標(biāo)對(duì)應(yīng)幅度。幅值最大的為out[m]=val;則信號(hào)頻率f0=(Fs/N)m ,信號(hào)幅值Vpp=val/(N/2)。N為FFT的點(diǎn)數(shù),F(xiàn)s為采樣頻率。相位Pha=atan2(a, b)弧度制,其中ab是輸出虛數(shù)結(jié)果的實(shí)部和虛部。
15.2添加命令行
添加命令行參數(shù)Shell_func.h中
VoidFrqFun(void*param);
Shell_func.c中
左右滑動(dòng)查看完整內(nèi)容
#include "frq.h" { (const uint8_t*)"frq", FrqFun, "frq"}, /*相位分析*/ void FrqFun(void* param) { int num; if(1 == sscanf(param,"%*s %d",&num)) { while(num--) { Frq_test(); } } }
15.3 代碼
Frq.c frq.h詳見git
15.4 測(cè)試
上位機(jī)輸入frq 10即進(jìn)行10次采樣分析
十六、總結(jié)
本開發(fā)板性能資源比較豐富,特別適合開發(fā)和驗(yàn)證等。本文基于該開發(fā)板實(shí)現(xiàn)了信號(hào)處理前端,實(shí)現(xiàn)了虛擬示波器、噪聲分析儀、電能質(zhì)量分析儀、數(shù)字濾波器等功能的集合,并且可以方便的快速添加更多的應(yīng)用。可以基于CLI調(diào)用方便腳本化使用,可以使用上位機(jī)可視化,是一個(gè)瑞士軍刀類型的工具集。目前支持的CLI命令如下,可以快速擴(kuò)展更多應(yīng)用。
審核編輯:湯梓紅
-
信號(hào)處理
+關(guān)注
關(guān)注
48文章
1055瀏覽量
103912 -
瑞薩
+關(guān)注
關(guān)注
36文章
22370瀏覽量
87734 -
移植
+關(guān)注
關(guān)注
1文章
394瀏覽量
28578 -
串口
+關(guān)注
關(guān)注
14文章
1584瀏覽量
78646 -
RA6M5
+關(guān)注
關(guān)注
0文章
7瀏覽量
454
原文標(biāo)題:【瑞薩RA MCU創(chuàng)意氛圍賽作品賞析】項(xiàng)目11——基于瑞薩RA6M5的信號(hào)處理工具集(下)
文章出處:【微信號(hào):瑞薩MCU小百科,微信公眾號(hào):瑞薩MCU小百科】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
基于瑞薩RA6M5/RA2L1和百度語音云的語音識(shí)別控制與無線通信控制系統(tǒng)

基于RA6M5的智能煙霧感應(yīng)吸除系統(tǒng)設(shè)計(jì)

評(píng)論