七、重定向標準輸入輸出
以上實現了串口驅動,我們現在來實現串口重定向標準輸入輸出以方便后面的調試,處于資源和效率考慮,我們這里移植小型的xprintf而不是使用printf。添加xprintf.c xprintf.h到工程src下xprintf.h中使能以下宏
左右滑動查看完整內容
#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"
設置收發接口
左右滑動查看完整內容
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);
測試
左右滑動查看完整內容
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

八、命令行實現
以上實現了串口重定向,我們現在實現簡單的命令行,以便后面進行交互操作。設計思想是,定義命令字符串和實現函數的對應表,標準輸入讀一行,搜索對應表和字符串匹配,匹配則執行對應的函數。

實現代碼見shell.c shell.h shell_func.c shell_func.h測試輸入help回車打印如下:

使用如下麥克風采集模塊ADC采集信號。

參考電壓為3.3V

配置ADC配置P001為ADC的CH1

添加相關代碼

配置屬性



生成工程
? 添加adc.c和adc.h代碼測試
#include"adc.h"
初始化
左右滑動查看完整內容
adc_init();
staticuint16_tadcbuffer[1024]={0};
循環調用
左右滑動查看完整內容
adc_read(adcbuffer, 1024);
for(uint32_ti=0;i<1024;?i++)??
???????????{???????????xprintf("/*%d*/
",adcbuffer);??
???????????}

也可以添加命令行采集Shell_func.h中
void ADCFun(void* param);
Shell_func.c中
左右滑動查看完整內容
#include "adc.h"
{ (const uint8_t*)"adc", ADCFun, "adc"}, /*ADC采集*/
十、ADC可視化(虛擬示波器)
通過串口將采集的數據發送到PC,PC端使用可視化上位機進行可視化,即實現了虛擬示波器的應用。


添加DSP算法庫使用的是CMSIS-DSP的算法庫

添加的代碼如下

十二、FFT諧波分析(電能質量分析)
12.1FFT算法
我們可以使用fft算法對原始數據盡心分析,得到諧波,直流量,相位,頻率,幅值等信息,以進行電能質量分析,噪聲分析等各種應用。
12.2添加命令行
添加命令行參數Shell_func.h中
void FftFun(void* param);
Shell_func.c中
左右滑動查看完整內容
#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測試
上位機輸入fft 10即進行10次采樣分析效果如下

十三、噪聲檢測與分析
我們也可以將開發板打造為噪聲監測分析儀,對于噪聲首先關心的就是其大小,我們可以實時采集聲音并通過算法檢測出極大值,最終換算成相對基準功率的噪聲分貝值。同時也可以通過命令行控制何時進行采樣分析,和其他功能是獨立的,可以單獨調用,集成在一起作為工具集供調用。當然也可以進行噪聲的諧波等分析,和前面的點那個質量諧波分析等一樣。
13.1 極大值檢測算法
極大值檢測算法參見:
https://www.mdpi.com/1999-4893/5/4/588/htm
13.2 添加命令行
添加命令行參數Shell_func.h中
void MaxFun(void* param);
Shell_func.c中
左右滑動查看完整內容
#include "max.h"
{ (const uint8_t*)"max", MaxFun, "max"}, /*極值檢測*/
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 測試
上位機輸入max 10即進行10次采樣分析可視化顯示如下,黃色線是極大值檢測結果,藍色線是原始數據。

十四、數字濾波器
14.1 IIR濾波器
DSP算法庫中提供了很多濾波算法,我們這里將IIR添加到我們的工具集中進行演示。
14.2 添加命令行
添加命令行參數Shell_func.h中
voidIirFun(void*param);
Shell_func.c中
左右滑動查看完整內容
#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測試
上位機輸入iir 10即進行10次采樣分析可視化顯示如下,黃色線濾波結果,藍色線是原始數據。

十五、相位頻率幅值分析(頻率計等)
15.1相位分析
FFT計算結果,幅值最大的橫坐標對應信號頻率,縱坐標對應幅度。幅值最大的為out[m]=val;則信號頻率f0=(Fs/N)m ,信號幅值Vpp=val/(N/2)。N為FFT的點數,Fs為采樣頻率。相位Pha=atan2(a, b)弧度制,其中ab是輸出虛數結果的實部和虛部。
15.2添加命令行
添加命令行參數Shell_func.h中
VoidFrqFun(void*param);
Shell_func.c中
左右滑動查看完整內容
#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 測試
上位機輸入frq 10即進行10次采樣分析

十六、總結
本開發板性能資源比較豐富,特別適合開發和驗證等。本文基于該開發板實現了信號處理前端,實現了虛擬示波器、噪聲分析儀、電能質量分析儀、數字濾波器等功能的集合,并且可以方便的快速添加更多的應用。可以基于CLI調用方便腳本化使用,可以使用上位機可視化,是一個瑞士軍刀類型的工具集。目前支持的CLI命令如下,可以快速擴展更多應用。

審核編輯:湯梓紅
-
信號處理
+關注
關注
49文章
1143瀏覽量
105094 -
瑞薩
+關注
關注
37文章
22481瀏覽量
90852 -
移植
+關注
關注
1文章
414瀏覽量
29388 -
串口
+關注
關注
15文章
1618瀏覽量
82806 -
RA6M5
+關注
關注
0文章
7瀏覽量
550
發布評論請先 登錄
基于瑞薩RA6M5的信號處理工具集設計
評論