玩嗨 OpenHarmony:基于 OpenHarmony 的简易示波器(上篇)

玩嗨 OpenHarmony:基于 OpenHarmony 的简易示波器(上篇)

有人说OpenHarmony玩不起来,今天小编向大家介绍下如何用OpenHarmony做个简易示波器。

OpenHarmony全场景、全连接的特性,做个简易示波器并不复杂,只需要以瑞芯微RK2206芯片 + OpenHarmony 3.0LTS操作系统 + 小凌派-RK2206开发板为基础,以模数转换芯片ADS1256为采集数据芯片实时采集,然后通过峰值检测和fft变换算法处理采集数据,最后将处理完成的数据输送到LCD液晶屏上实时显示,就可以了。

小凌派RK2206开发板

小凌派RK2206开发板搭载OpenHarmony3.0操作系统,采用国产芯片厂商瑞芯微的低功耗、高集成的MCU无线局域网处理器RK2206为主控芯片,CPU为CortexM4内核,主频高达200MHz,集成了CortexM0内核,支持WiFi/AP功能,内置DSP处理器,支持AI语音开发。开发板板载NFC,支持碰一碰功能、液晶显示接口、麦克风接口以及E53接口,E53接口兼容各类传感器模块,便于多样化的IoT物联网应用。

基于OpenHarmony + 小凌派RK2206开发板制作的简易示波器,实时采集波形,实时计算并实时显示对应的波形。OpenHarmony实时性较高,稳定性好,瑞芯微RK2206芯片接口丰富,OpenHarmony芯片适配稳定性好,做出来的简易示波器效果还不错。

Sitronix ST7789V LCD显示器

本项目使用的是Sitronix ST7789V, 用于单片驱动262K色图像TFT-LCD, 包含 720(240*3色) x 320 线输出, 可以直接以SPI协议, 或者8位/9位/16位/18位并行连接外部控制器。ST7789V显示数据存储在片内240x320x18 bits内存中, 显示内存的读写不需要外部时钟驱动。

具体接线如下图所示:

其中,LCD液晶屏引脚功能描述,如下表所示:

序号LCD引脚功能描述
1D/C指令/数据选择端,L:指令,H:数据
2RESET复位信号线,低电平有效
3SPI_MOSISPI数据输入信号线
4SPI_CLKSPI时钟信号线
5SPI_CSSPI片选信号线,低电平有效
6GND电源地引脚
7SVSV电源输入引脚

其中,LCD液晶屏与小凌派-RK2206开发板连接如下图所示:

ADS1256模块

德州仪器的ADS1256是一款 适用于工厂自动化和过程控制微功耗、高精度且具有24bit 、8 通道Δ-Σ 的高性能模数转换器(ADC)。ADS1256可以通过SPI进行访问 。该器件提供高达 23 比特的无噪声精度、数据速率高达 30kSPS(次采样 / 秒)、0.0010%非线性特性(最大值)以及众多的板上外设(输入模拟多路开关、输入缓冲器、可编程增益放大器和可编程数字滤波器等),可为设计人员带来完整而高分辨率的量测解决方案。

上图为ADS1256芯片结构和引脚图,从图可以看出ADS1256的通道资源比较丰富,可以配置成8个单端ADC通道,也可以配置成4个差分通道。ADS1256的通信接口为串行接口,同时还有4个通用的IO口,不过这四个IO口不经常用到。

ADS1256内部有许多寄存器需要配置,相较于ADS1232用起来要复杂的多。

下面介绍一下ADS1256的初始化。通过SPI通信配置ADS1256的参数,增益以及转换速率。

void ADS1256_CfgADC(uint8_t gain,uint8_t drate)   // 初始化设置,设置增益以及转换速率

{

    uint8_t buf[4];

    ADS1256_WriteCmd(CMD_RESET);                // 写复位指令

    ADS1256_WriteReg(REG_STATUS,0XF4);          // 写状态,数据传输默认高位在前,启动矫正,禁止使用缓冲

    ADS1256_WriteCmd(CMD_SELFCAL);              // 自校准

    ToyUdelay(20);

    {

        buf[0] = (0 << 3) | (1 << 2) | (0 << 1);

        buf[1] = 0x08;                      //通道设置选择

        buf[2] = (0 << 5) | (0 << 3) | (gain << 0);

        buf[3] = drate; // DRATE_10SPS; /* 选择数据输出速率 */

        CS_L;

        ADS1256_Send8Bit(CMD_WREG|0);          // 写寄存器

        ADS1256_Send8Bit(0x03);                // 连续写入4个数据

        ADS1256_Send8Bit(buf[0]);              // 设置状态寄存器

        ADS1256_Send8Bit(buf[1]);              // 设置输入通道参数

        ADS1256_Send8Bit(buf[2]);              // 设置ADCON控制寄存器,增益

        ADS1256_Send8Bit(buf[3]);                // 设置数据速率

        CS_H;

    }

    ToyUdelay(50);

}

然后选择通道0,等待数据转换完成后获取他采集的AD值:

uint32_t ADS1256_GetAdc(uint8_t channel)

{

    uint32_t read;

    uint16_t val = 0;

    read = 0;

//  while(DRDY);           //当DRDY变为低电平时,数据开始传输

    ADS1256_WriteReg(REG_MUX,channel);       // 写入读取的通道

    ADS1256_WriteCmd(CMD_SYNC);              //同步A/D转换命令

//  Delay_1us(1);

    ADS1256_WriteCmd(CMD_WAKEUP);            //完成SYNC并退出待机模式

    GpioGetVal(DRDY, &val);

    while(val==1)                             // 等待数据转换完成

    {

        GpioGetVal(DRDY, &val);

    }

    CS_L;                                    //片选拉低

    ADS1256_Send8Bit(CMD_RDATA);             //读取数据命令

    //连续接收3个数据,高字节在前

    read = ((uint32_t)ADS1256_Recive8Bit() << 16);         

    read +=( (uint32_t)ADS1256_Recive8Bit() << 8);

    read += ADS1256_Recive8Bit() ;

    CS_H;

    return read;   

}

写在最后

我们最近正带着大家玩嗨OpenHarmony。如果你有好玩的东东,欢迎投稿,让我们一起嗨起来!有点子,有想法,有Demo,立刻联系我们:

合作邮箱:zzliang@atomsource.org