基于OpenHarmony + 小凌派RK2206開(kāi)發(fā)板制作的簡(jiǎn)易示波器,實(shí)時(shí)采集波形,實(shí)時(shí)計(jì)算并實(shí)時(shí)顯示對(duì)應(yīng)的波形。OpenHarmony實(shí)時(shí)性較高,穩(wěn)定性好,瑞芯微RK2206芯片接口豐富,OpenHarmony芯片適配穩(wěn)定性好,做出來(lái)的簡(jiǎn)易示波器效果還不錯(cuò)。本文先做第一期的技術(shù)文檔,后續(xù)將持續(xù)完善功能和技術(shù)文檔更新。
1
項(xiàng)目簡(jiǎn)介
本文基于OpenHarmony操作系統(tǒng) + 小凌派RK2206開(kāi)發(fā)板而做的簡(jiǎn)易示波器開(kāi)發(fā)。
本開(kāi)發(fā)以瑞芯微RK2206芯片 + OpenHarmony 3.0LTS操作系統(tǒng) + 小凌派-RK2206開(kāi)發(fā)板為基礎(chǔ),以模數(shù)轉(zhuǎn)換芯片ADS1256為采集數(shù)據(jù)芯片實(shí)時(shí)采集,然后通過(guò)峰值檢測(cè)和fft變換算法處理采集數(shù)據(jù),最后將處理完成的數(shù)據(jù)輸送到LCD液晶屏上實(shí)時(shí)顯示。
項(xiàng)目實(shí)驗(yàn)視頻如下所示:
2
模塊介紹
1.ADS1256模塊
ADS1256是一款 24bit ADC轉(zhuǎn)換模塊。ADS1256可以通過(guò)SPI進(jìn)行訪問(wèn) 的高精度的轉(zhuǎn)換器。
上圖為ADS1256芯片結(jié)構(gòu)和引腳圖,從圖可以看出ADS1256的通道資源比較豐富,可以配置成8個(gè)單端ADC通道,也可以配置成4個(gè)差分通道。ADS1256的通信接口為串行接口,同時(shí)還有4個(gè)通用的IO口,不過(guò)這四個(gè)IO口不經(jīng)常用到。
ADS1256內(nèi)部有許多寄存器需要配置,相較于ADS1232用起來(lái)要復(fù)雜的多。
下面介紹一下ADS1256的初始化。
通過(guò)SPI通信配置ADS1256的參數(shù),增益以及轉(zhuǎn)換速率。
void ADS1256_CfgADC(uint8_t gain,uint8_t drate) // 初始化設(shè)置,設(shè)置增益以及轉(zhuǎn)換速率
{
uint8_t buf[4];
ADS1256_WriteCmd(CMD_RESET); // 寫(xiě)復(fù)位指令
ADS1256_WriteReg(REG_STATUS,0XF4); // 寫(xiě)狀態(tài),數(shù)據(jù)傳輸默認(rèn)高位在前,啟動(dòng)矯正,禁止使用緩沖
ADS1256_WriteCmd(CMD_SELFCAL); // 自校準(zhǔn)
ToyUdelay(20);
{
buf[0] = (0 << 3) | (1 << 2) | (0 << 1);
buf[1] = 0x08; //通道設(shè)置選擇
buf[2] = (0 << 5) | (0 << 3) | (gain << 0);
buf[3] = drate; // DRATE_10SPS; /* 選擇數(shù)據(jù)輸出速率 */
CS_L;
ADS1256_Send8Bit(CMD_WREG|0); // 寫(xiě)寄存器
ADS1256_Send8Bit(0x03); // 連續(xù)寫(xiě)入4個(gè)數(shù)據(jù)
ADS1256_Send8Bit(buf[0]); // 設(shè)置狀態(tài)寄存器
ADS1256_Send8Bit(buf[1]); // 設(shè)置輸入通道參數(shù)
ADS1256_Send8Bit(buf[2]); // 設(shè)置ADCON控制寄存器,增益
ADS1256_Send8Bit(buf[3]); // 設(shè)置數(shù)據(jù)速率
CS_H;
}
ToyUdelay(50);
}
(左右移動(dòng)查看全部?jī)?nèi)容)
然后選擇通道0,等待數(shù)據(jù)轉(zhuǎn)換完成后獲取他采集的AD值
uint32_t ADS1256_GetAdc(uint8_t channel)
{
uint32_t read;
uint16_t val = 0;
read = 0;
// while(DRDY); //當(dāng)DRDY變?yōu)榈碗娖綍r(shí),數(shù)據(jù)開(kāi)始傳輸
ADS1256_WriteReg(REG_MUX,channel); // 寫(xiě)入讀取的通道
ADS1256_WriteCmd(CMD_SYNC); //同步A/D轉(zhuǎn)換命令
// Delay_1us(1);
ADS1256_WriteCmd(CMD_WAKEUP); //完成SYNC并退出待機(jī)模式
GpioGetVal(DRDY, &val);
while(val==1) // 等待數(shù)據(jù)轉(zhuǎn)換完成
{
GpioGetVal(DRDY, &val);
}
CS_L; //片選拉低
ADS1256_Send8Bit(CMD_RDATA); //讀取數(shù)據(jù)命令
//連續(xù)接收3個(gè)數(shù)據(jù),高字節(jié)在前
read = ((uint32_t)ADS1256_Recive8Bit() << 16);
read +=( (uint32_t)ADS1256_Recive8Bit() << 8);
read += ADS1256_Recive8Bit() ;
CS_H;
return read;
}
(左右移動(dòng)查看全部?jī)?nèi)容)
2.LCD液晶屏模塊
本項(xiàng)目使用的是ST7789V, 用于單片驅(qū)動(dòng)262K色圖像TFT-LCD, 包含 720(240*3色) x 320 線(xiàn)輸出, 可以直接以SPI協(xié)議, 或者8位/9位/16位/18位并行連接外部控制器。ST7789V顯示數(shù)據(jù)存儲(chǔ)在片內(nèi)240x320x18 bits內(nèi)存中, 顯示內(nèi)存的讀寫(xiě)不需要外部時(shí)鐘驅(qū)動(dòng)。
具體接線(xiàn)如下圖所示:
其中,LCD液晶屏引腳功能描述,如下表5.3.1所示。
表5.3.1 LCD液晶屏引腳功能表:
其中,LCD液晶屏與小凌派-RK2206開(kāi)發(fā)板連接如下圖所示:
3
簡(jiǎn)易示波器功能的實(shí)現(xiàn)
1.峰值檢測(cè)
通過(guò)查找ad采集的數(shù)據(jù)內(nèi)的最大值和最小值,然后相減即得峰峰值。
float Get_Vpp(float arr[])
{
uint16_t i;
float MAX=0,MIN=3500,Vpp=0;
for(i=0;i
"" ="" 掃描adc數(shù)組,獲取最大值和最小值{
if(arr[i]>MAX)
MAX=arr[i];
if(arr[i]
MIN=arr[i];
}
Vpp=MAX-MIN;
return Vpp;
}
(左右移動(dòng)查看全部?jī)?nèi)容)
2.頻率檢測(cè)
通過(guò)fft變換,F(xiàn)FT變換的數(shù)據(jù)需要兩部分,實(shí)部和虛部,由于變換的是數(shù)據(jù)是AD采集的實(shí)數(shù)據(jù),所以只需將采集的值存入實(shí)部,虛部存入零即可。通過(guò)變換將時(shí)域信號(hào)轉(zhuǎn)換到頻域,然后通過(guò)取模排序,然后計(jì)算即可得到頻率。他的基本思想是把原始的 N 點(diǎn)序列,依次分解成一系列的短序列。充分利用 DFT 計(jì)算式中指數(shù)因子所具有的對(duì)稱(chēng)性質(zhì)和周期性質(zhì),進(jìn)而求出這些短序列相應(yīng)的 DFT 并進(jìn)行適當(dāng)組合,達(dá)到刪除重復(fù)計(jì)算,減少乘法運(yùn)算和簡(jiǎn)化結(jié)構(gòu)的目的。當(dāng)N是素?cái)?shù)時(shí),可以將 DFT算轉(zhuǎn)化為求循環(huán)卷積,從而更進(jìn)一步減少乘法次數(shù),提高速度。
(1)FFT變換函數(shù)
oid fft(const float real_in[], const float imag_in[], float real_out[], float imag_out[], const int n, int isign) {
if (isign != 1 && isign != -1) {//isign=1,正變換;isign=-1,逆變換
return;
}
const int Lv = mylog(n, 2);//蝶形級(jí)數(shù)
int L;//蝶形運(yùn)算級(jí)數(shù),用于循環(huán)
int N;//蝶形運(yùn)算數(shù)據(jù)量,用于循環(huán)
int distance;//蝶形運(yùn)算兩節(jié)點(diǎn)間的距離,用于循環(huán)(distance=N/2)
int group;//蝶形運(yùn)算的組數(shù)
float tmpr1, tmpi1, tmpr2, tmpi2;//臨時(shí)變量
int i, j, k;
for (i = 0; i < n; i++) {//數(shù)位倒讀
j = rev(i, Lv);
real_out[j] = real_in[i];
imag_out[j] = imag_in[i];
}
L = 1;
distance = 1;
N = 2;
group = n >> 1;
for (; L <= Lv; L++) {//蝶形循環(huán)
for (i = 0; i < group; i++) {//每級(jí)蝶形各組循環(huán)
for (k = 0; k < distance; k++) {//每組蝶形運(yùn)算
float theta = -2 * PI * k / N * isign;//旋轉(zhuǎn)因子,逆變換的角度與正變換相反
tmpr1 = real_out[N * i + k];
tmpi1 = imag_out[N * i + k];//X(k)
tmpr2 = mycos(theta) * real_out[N * i + k + distance] - mysin(theta) * imag_out[N * i + k + distance];
tmpi2 = mycos(theta) * imag_out[N * i + k + distance] + mysin(theta) * real_out[N * i + k + distance];//WN(k)*X(k+N/2)
real_out[N * i + k] = tmpr1 + tmpr2;
imag_out[N * i + k] = tmpi1 + tmpi2;//X(k)=X(k)+WN(K)*X(k+N/2)
real_out[N * i + k + distance] = tmpr1 - tmpr2;
imag_out[N * i + k + distance] = tmpi1 - tmpi2;//X(k+N/2)=X(k)-WN(K)*X(k+N/2)
if (isign == -1) {//逆變換結(jié)果需除以N,即除以Lv次2
real_out[N * i + k] *= 0.5;
imag_out[N * i + k] *= 0.5;
real_out[N * i + k + distance] *= 0.5;
imag_out[N * i + k + distance] *= 0.5;
}
}
}
N <<= 1;
distance <<= 1;
group >>= 1;
}
}
(左右移動(dòng)查看全部?jī)?nèi)容)
(2)取模運(yùn)算函數(shù)
void PowerMag(void)
{
uint16_t i=0;
float Y,X,Mag;
for (i=0; i < Ns/2; i++)
{
X =((float)y2r[i])/32768* Ns;
Y = ((float)y2i[i])/32768* Ns;
Mag = sqrt(X*X+ Y*Y)/Ns; // 先平方和,再開(kāi)方
y2[i] = (uint32_t)(Mag*65536);
}
y2[0] = y2[0]/2; //直流
}
(左右移動(dòng)查看全部?jī)?nèi)容)
(3)然后將FFT變換的幅值進(jìn)行排序,同時(shí)也對(duì)他們的下標(biāo)進(jìn)行了排序,以便后續(xù)的計(jì)算,即除了直流信號(hào)的第一個(gè)頻率點(diǎn)即為改信號(hào)的頻率。
void sorting (void)
{
uint16_t i,j;
uint32_t temp1;
for(i=0;i
2 ;i++) ="" ="" ="" 下標(biāo)賦初值{
xb[i]=i;
}
for(j=0;j<(Ns/2-1);j++) // 冒泡排序
{
for(i=1;i<(Ns/2-j-1);i++) //直流項(xiàng)不參與排序 從第二項(xiàng)開(kāi)始
{
if(y2[i]
1 ]){
temp1=y2[i]; //交換數(shù)據(jù)
y2[i]=y2[i+1];
y2[i+1]=temp1;
temp1=xb[i]; //交換下標(biāo)
xb[i]=xb[i+1];
xb[i+1]=temp1;
}
}
}
}
(左右移動(dòng)查看全部?jī)?nèi)容)
(4)通過(guò)計(jì)算即可得到頻率,采樣點(diǎn)數(shù)將采樣頻率進(jìn)行平分,通過(guò)排序取得的幅值最大的那個(gè)點(diǎn)的下標(biāo)進(jìn)行相乘即為頻率,1.47為補(bǔ)償系數(shù),因?yàn)锳DS1256采集數(shù)據(jù)后有延時(shí),導(dǎo)致進(jìn)行FFT變換后所對(duì)應(yīng)的幅值最大點(diǎn)的下標(biāo)前移,導(dǎo)致計(jì)算頻率時(shí)候會(huì)偏小。
fre=Fs*xb[1]*1.47/Ns;
(左右移動(dòng)查看全部?jī)?nèi)容)
3.波形顯示
通過(guò)將采集的幅值進(jìn)行計(jì)算,使最后的值在屏幕大小的范圍內(nèi),進(jìn)行描點(diǎn)畫(huà)圖。
void drawCurve( float rawValue,uint16_t color)
{
uint16_t x;
int y;
y = (int) rawValue/30+30; //data processing code
if(y<0 || y > 240)
y = lastY;
//這里之所以是120-rawValue/280,與屏幕的掃描方向有關(guān),如果出現(xiàn)上下顛倒的情況,可以改成120 +
if(firstPoint)//如果是第一次畫(huà)點(diǎn),則無(wú)需連線(xiàn),直接描點(diǎn)即可
{
LCD_DrawPoint(0,y,color);
lastX=0;
lastY=y;
firstPoint=0;
}
else
{
x=lastX+2;
if(x<320) //不超過(guò)屏幕寬度
{
LCD_DrawLine(lastX,lastY,x,y,color);
lastX=x;
lastY=y;
}
else //超出屏幕寬度,清屏,從第一個(gè)點(diǎn)開(kāi)始繪制,實(shí)現(xiàn)動(dòng)態(tài)更新效果
{
//LCD_Fill(0, 0, LCD_W, LCD_H, LCD_WHITE);//清屏//清屏,白色背景
LCD_DrawPoint(0,y,color);
lastX=0;
lastY=y;
}
}
}
(左右移動(dòng)查看全部?jī)?nèi)容)
4.LCD顯示
Gitee社區(qū)已有這部分源代碼和說(shuō)明文檔,感興趣的讀者可以參考:https://gitee.com/Lockzhiner-Electronics/lockzhiner-rk2206-openharmony3.0lts/tree/master/vendor/lockzhiner/rk2206/samples/b4_lcd
4
心得體會(huì)
通過(guò)OpenHarmony操作系統(tǒng) + 小凌派-RK2206開(kāi)發(fā)板進(jìn)行項(xiàng)目開(kāi)發(fā),OpenHarmony的實(shí)時(shí)性好,穩(wěn)定性高,瑞芯微RK2206芯片接口比較豐富,移植適配穩(wěn)定性較好,整體開(kāi)發(fā)進(jìn)度比較順利,開(kāi)發(fā)的難度都集中在數(shù)據(jù)處理算法上。通過(guò)這一次的應(yīng)用開(kāi)發(fā),整體上對(duì)OpenHarmony和國(guó)產(chǎn)芯片開(kāi)發(fā)還是蠻認(rèn)可的,是一次不錯(cuò)的學(xué)習(xí)體驗(yàn),特此記錄!
原文標(biāo)題:基于OpenHarmony操作系統(tǒng)的簡(jiǎn)易示波器開(kāi)發(fā)心得
文章出處:【微信公眾號(hào):HarmonyOS官方合作社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
-
示波器
+關(guān)注
關(guān)注
113文章
6264瀏覽量
185293 -
操作系統(tǒng)
+關(guān)注
關(guān)注
37文章
6847瀏覽量
123420 -
開(kāi)發(fā)板
+關(guān)注
關(guān)注
25文章
5080瀏覽量
97683 -
OpenHarmony
+關(guān)注
關(guān)注
25文章
3727瀏覽量
16390 -
RK2206
+關(guān)注
關(guān)注
0文章
34瀏覽量
1793
原文標(biāo)題:基于OpenHarmony操作系統(tǒng)的簡(jiǎn)易示波器開(kāi)發(fā)心得
文章出處:【微信號(hào):HarmonyOS_Community,微信公眾號(hào):電子發(fā)燒友開(kāi)源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論