原创 【拆解】百元mini示波器,这是玩具吗?

2024-8-29 23:32 906 4 5 分类: PCB 文集: 拆解活动
前言

之前学习模电的时候,想着应该买台示波器这样才好观察实验现象,但是又苦于没有资金,所以就在网上买了一台mini的示波器
看数据采样率2.5MHZ,500KHZ带宽,这个数据也就只能看看大概的波形,别说什么细节了
大家是怎么看的呢,我觉得这个mini示波器只能看一下波形的变化,但是做项目的话,基本上是很难的。
今天拆解给大家分享一下,看一下做工和用到的芯片,看看值不值百元的价格

外观展示

波形测试(50hz方波)
对于这种最基本的波形,mini示波器开始可以显示的,而且和正常示波器测出来的也大差不差

拆解过程
(一)先拧开后壳四个螺丝,拿下后盖板和亚克力板

(二)然后可以看到屏幕模块和按钮,注意按钮上的按钮帽不要搞丢了

(三)屏幕模块可以单独拆解下来,通过3组排针连接

(四)电池通过排线接在主板上,可以拆卸。应该是方便后期更换

(五)主板看起来还是比较简洁明了的,布局也不错

PCB板&主要芯片

屏幕模块
屏幕主控采用一颗CH32F203RCT6,屏幕则是一块2.4寸的TFT屏幕,24针脚,屏幕驱动应该是ST7789
数据手册https://item.szlcsc.com/5744905.html
CortexTM
-M3 内核设计的工业级通用微控制器。
系列产品主频高达 144MHz,独立了 GPIO 电压(与系统供电分离)。资源同比增加了随机数单元、4 组
运放比较器、触摸检测,提高串口 USART/UART 数量到 8 组,电机定时器到 4 组。专用接口里:USB2.0
高速接口(480Mbps)内置了 PHY 收发器,以太网 MAC 达到千兆,并集成了 10M-PHY 模块等。搭配时
钟安全、电源管理、双组 DMA、ADC、DAC、SPI、I2C、DVP、SDIO、CAN、FSMC 等资源,可适用于多采
集、多通讯方向的综合类应用场景。

网上的2.4TFT屏幕大多是10引脚的,暂时没有找到24引脚的数据,找到一款20引脚的,应该引脚可以通用
对于CH32F203RCT6这款芯片来说,带这块屏幕还是绰绰有余的,但是网上的资料比较少,所以给大家分享一下类似的lcd代码
不得不说,这款产品的LCD设计真的好看,看来也是花费大量精力去研究ui的
#include "lcd.h"
#include "stdlib.h"
#include "font.h" 
#include "stdarg.h"

#define  LCD_CMD         ((u32)0x6001FFFF)
#define  LCD_DATA        ((u32)0x60020000)


#define LCD_CLEAR_SEND_NUMBER 5760

u16 BACK_COLOR = BLACK, FORE_COLOR = WHITE;

void lcd_write_cmd(const u8 cmd)
{
    *(__IO u8*)LCD_CMD=cmd;
}

void lcd_write_data(const u8 data)
{
    *(__IO u8*)LCD_DATA=data;
}

void lcd_write_half_word(const u16 da)
{
    *(__IO u8*)LCD_DATA=(u8)(da>>8);
    *(__IO u8*)LCD_DATA=(u8)da;
}

u8 lcd_read_data(void)
{
    vu8 ram;
    ram = *(__IO u8*)LCD_DATA;
    return ram;
}

u8 lcd_read_reg(const u8 reg)
{
    lcd_write_cmd(reg);
    delay_us(5);
    return lcd_read_data();

}

void lcd_fsmc_init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure={0};
    FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure={0};
    FSMC_NORSRAMTimingInitTypeDef  readWriteTiming={0};
    FSMC_NORSRAMTimingInitTypeDef  writeTiming={0};

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC,ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOG,ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_14|GPIO_Pin_15;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOD, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOE, &GPIO_InitStructure);

    /*   RS--D12  */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOD, &GPIO_InitStructure);

    /* CS: PD11*/
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOD, &GPIO_InitStructure);
    GPIO_ResetBits(GPIOD,GPIO_Pin_11);

    readWriteTiming.FSMC_AddressSetupTime = 0x01;
    readWriteTiming.FSMC_AddressHoldTime = 0x00;
    readWriteTiming.FSMC_DataSetupTime = 0x0f;
    readWriteTiming.FSMC_BusTurnAroundDuration = 0x00;
    readWriteTiming.FSMC_CLKDivision = 0x00;
    readWriteTiming.FSMC_DataLatency = 0x00;
    readWriteTiming.FSMC_AccessMode = FSMC_AccessMode_A;

    writeTiming.FSMC_AddressSetupTime = 0x00;
    writeTiming.FSMC_AddressHoldTime = 0x00;
    writeTiming.FSMC_DataSetupTime = 0x03;
    writeTiming.FSMC_BusTurnAroundDuration = 0x00;
    writeTiming.FSMC_CLKDivision = 0x00;
    writeTiming.FSMC_DataLatency = 0x00;
    writeTiming.FSMC_AccessMode = FSMC_AccessMode_A;

    FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1;

    FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
    FSMC_NORSRAMInitStructure.FSMC_MemoryType =FSMC_MemoryType_SRAM;
    FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b;
    FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode =FSMC_BurstAccessMode_Disable;
    FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
    FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait=FSMC_AsynchronousWait_Disable;
    FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
    FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
    FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
    FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
    FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Enable;
    FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
    FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &readWriteTiming;
    FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &writeTiming;
    FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);
    FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);

}

/*******************************************************************************
* Function Name  : TIM1_PWMOut_Init
* Description    : Initializes TIM1 PWM output.
* Input          : arr: the period value.
*                  psc: the prescaler value.
*                                    ccp: the pulse value.
* Return         : None
*******************************************************************************/
void TIM1_PWMOut_Init( u16 arr, u16 psc, u16 ccp )
{
    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_OCInitTypeDef TIM_OCInitStructure;
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;

    RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB | RCC_APB2Periph_TIM1, ENABLE );

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init( GPIOB, &GPIO_InitStructure );

    TIM_TimeBaseInitStructure.TIM_Period = arr;
    TIM_TimeBaseInitStructure.TIM_Prescaler = psc;
    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit( TIM1, &TIM_TimeBaseInitStructure);

#if (PWM_MODE == PWM_MODE1)
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

#elif (PWM_MODE == PWM_MODE2)
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;

#endif

    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_Pulse = ccp;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OC1Init( TIM1, &TIM_OCInitStructure );

    TIM_CtrlPWMOutputs(TIM1, ENABLE );
    TIM_OC1PreloadConfig( TIM1, TIM_OCPreload_Disable );
    TIM_ARRPreloadConfig( TIM1, ENABLE );
    TIM_Cmd( TIM1, ENABLE );
}

void lcd_gpio_init(void)
{

    GPIO_InitTypeDef  GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOD, &GPIO_InitStructure);
    GPIO_SetBits(GPIOD,GPIO_Pin_13);

    GPIO_ResetBits(GPIOD,GPIO_Pin_13);
    //wait at least 100ms for reset
    delay_ms(100);
    GPIO_SetBits(GPIOD,GPIO_Pin_13);
//    TIM1_PWMOut_Init( 1000, 48000-1, 50 );
}

void lcd_init(void)
{
    u16 id=0;
    lcd_gpio_init();
    lcd_fsmc_init();

    lcd_write_cmd(0X04);
    id = lcd_read_data();      //dummy read
    id = lcd_read_data();      //读到0X85
    id = lcd_read_data();      //读取0X85
    id <<= 8;
    id |= lcd_read_data();     //读取0X52

    printf("id = %x\r\n",id);
    delay_ms(50);

    /* Memory Data Access Control */
    lcd_write_cmd(0x36);
    lcd_write_data(0x00);
    /* RGB 5-6-5-bit  */
    lcd_write_cmd(0x3A);
    lcd_write_data(0x05);
    /* Porch Setting */
    lcd_write_cmd(0xB2);
    lcd_write_data(0x0C);
    lcd_write_data(0x0C);
    lcd_write_data(0x00);
    lcd_write_data(0x33);
    lcd_write_data(0x33);
    /*  Gate Control */
    lcd_write_cmd(0xB7);
    lcd_write_data(0x00);
    /* VCOM Setting */
    lcd_write_cmd(0xBB);
    lcd_write_data(0x3F);
    /* LCM Control */
    lcd_write_cmd(0xC0);
    lcd_write_data(0x2C);
    /* VDV and VRH Command Enable */
    lcd_write_cmd(0xC2);
    lcd_write_data(0x01);
    /* VRH Set */
    lcd_write_cmd(0xC3);
    lcd_write_data(0x0D);
    /* VDV Set */
    lcd_write_cmd(0xC4);
    lcd_write_data(0x20);

    /* Frame Rate Control in Normal Mode */
    lcd_write_cmd(0xC6);
    lcd_write_data(0x03);    //60Hz-0x0F   82Hz-0x07  99Hz-0x03

    /* Power Control 1 */
    lcd_write_cmd(0xD0);
    lcd_write_data(0xA4);
    lcd_write_data(0xA1);
    /* Positive Voltage Gamma Control */
    lcd_write_cmd(0xE0);
    lcd_write_data(0xF0);
    lcd_write_data(0x03);
    lcd_write_data(0x09);
    lcd_write_data(0x03);
    lcd_write_data(0x03);
    lcd_write_data(0x10);
    lcd_write_data(0x2D);
    lcd_write_data(0x43);
    lcd_write_data(0x3F);
    lcd_write_data(0x33);
    lcd_write_data(0x0D);
    lcd_write_data(0x0E);
    lcd_write_data(0x29);
    lcd_write_data(0x32);
    /* Negative Voltage Gamma Control */
    lcd_write_cmd(0xE1);
    lcd_write_data(0xF0);
    lcd_write_data(0x0C);
    lcd_write_data(0x10);
    lcd_write_data(0x0E);
    lcd_write_data(0x0E);
    lcd_write_data(0x0A);
    lcd_write_data(0x2D);
    lcd_write_data(0x33);
    lcd_write_data(0x45);
    lcd_write_data(0x3A);
    lcd_write_data(0x14);
    lcd_write_data(0x19);
    lcd_write_data(0x31);
    lcd_write_data(0x37);
    /* Display Inversion On */
    lcd_write_cmd(0x21);
    /* Sleep Out */
    lcd_write_cmd(0x11);
    /* wait for power stability */
    delay_ms(100);

    lcd_clear(BLACK);

    /* display on */
    GPIO_SetBits(GPIOB,GPIO_Pin_14);
    lcd_write_cmd(0x29);


}


/**
 * Set background color and foreground color
 *
 * @param   back    background color
 * @param   fore    fore color
 *
 * @return  void
 */
void lcd_set_color(u16 back, u16 fore)
{
    BACK_COLOR = back;
    FORE_COLOR = fore;
}

void lcd_display_on(void)
{
    GPIO_SetBits(GPIOB,GPIO_Pin_14);
}

void lcd_display_off(void)
{
    GPIO_ResetBits(GPIOB,GPIO_Pin_14);
}

/* lcd enter the minimum power consumption mode and backlight off. */
void lcd_enter_sleep(void)
{
    GPIO_ResetBits(GPIOB,GPIO_Pin_14);
    delay_ms(5);
    lcd_write_cmd(0x10);
}
/* lcd turn off sleep mode and backlight on. */
void lcd_exit_sleep(void)
{
    GPIO_SetBits(GPIOB,GPIO_Pin_14);
    delay_ms(5);
    lcd_write_cmd(0x11);
    delay_ms(120);
}

/**
 * Set drawing area
 *
 * @param   x1      start of x position
 * @param   y1      start of y position
 * @param   x2      end of x position
 * @param   y2      end of y position
 *
 * @return  void
 */
void lcd_address_set(u16 x1, u16 y1, u16 x2, u16 y2)
{
    lcd_write_cmd(0x2a);
    lcd_write_data(x1 >> 8);
    lcd_write_data(x1);
    lcd_write_data(x2 >> 8);
    lcd_write_data(x2);

    lcd_write_cmd(0x2b);
    lcd_write_data(y1 >> 8);
    lcd_write_data(y1);
    lcd_write_data(y2 >> 8);
    lcd_write_data(y2);

    lcd_write_cmd(0x2C);
}

/**
 * clear the lcd.
 *
 * @param   color       Fill color
 *
 * @return  void
 */
void lcd_clear(u16 color)
{
    u16 i, j;
    u8 data[2] = {0};

    data[0] = color >> 8;
    data[1] = color;
    lcd_address_set(0, 0, LCD_W - 1, LCD_H - 1);

    /* 5760 = 240*240/20 */

        for (i = 0; i < LCD_W; i++)
        {
            for (j = 0; j < LCD_H; j++)
            {
                *(__IO u8*)LCD_DATA=data[0];
                *(__IO u8*)LCD_DATA=data[1];
            }
        }

}

/**
 * display a point on the lcd.
 *
 * @param   x   x position
 * @param   y   y position
 *
 * @return  void
 */


主控模块
示波器的原理,可以简单给大家说一下,但是这款产品用的什么方法,我也不清楚,给大家提供一个思路

一、信号输入与预处理

  1. 信号输入:被测电压信号首先进入数字示波器的采集前端。
  2. 预处理:在采集前端,信号会经过前置放大器和滤波器等元件进行处理。前置放大器用于调整信号的幅度,以满足后续处理的需要;滤波器则用于滤除不需要的频率成分,以改善信号的信噪比。

二、模拟到数字的转换(A/D转换)

  1. 模数转换器(ADC):经过预处理的模拟信号被送入模数转换器(ADC)。ADC的作用是将模拟信号转换为数字信号。这一转换过程包括采样和量化两个步骤,即将连续的模拟信号在时间上离散化,并在幅度上量化成一系列的数字值。
  2. 数字信号存储:转换后的数字信号被存储在数字示波器的内部存储器中,如FLASH或DDRAM等。这些存储器具有高速、大容量的特点,能够实时地保存大量的采样数据。

三、数据处理与显示

  1. 数据处理:存储在内部存储器中的数字信号可以通过软件编程进行各种分析和处理,如波形重构、频谱分析、噪声抑制等。这些处理功能使得数字示波器能够提供更丰富、更准确的测试信息。
  2. 波形显示:处理后的数字信号最终以波形、图表等形式显示在数字示波器的屏幕上。用户可以通过调整示波器的设置(如时基、垂直档位、偏移等)来观察和分析波形。

主控芯片
CH32F203CBT6
CortexTM
-M3 内核设计的工业级通用微控制器。
系列产品主频高达 144MHz,独立了 GPIO 电压(与系统供电分离)。资源同比增加了随机数单元、4 组
运放比较器、触摸检测,提高串口 USART/UART 数量到 8 组,电机定时器到 4 组。专用接口里:USB2.0
高速接口(480Mbps)内置了 PHY 收发器,以太网 MAC 达到千兆,并集成了 10M-PHY 模块等。搭配时
钟安全、电源管理、双组 DMA、ADC、DAC、SPI、I2C、DVP、SDIO、CAN、FSMC 等资源,可适用于多采
集、多通讯方向的综合类应用场景。

充放电管理芯片
TP5400
TP5400 为一款移动电源专用的单节锂离子电池充电器和恒定 5V 升压控制器,充电
部分集高精度电压和充电电流调节器、预充、充电状态指示和充电截止等功能于一体,
可以输出最大 1A 充电电流。
电路设计也是和IP5306和TP4054一样简单

电荷泵电压反转器 
ME7760C

ME7660 是一 DC/DC 电荷泵电压反转器专用集成电路 芯片采用成熟的 AL 栅 CMOS工艺及优化的设计 

芯片能将输入范围为+1.5V至+10V的电压转换成相应的-1.5V 至-10V 的输出 

并且只需外接两只低损耗电容 无需电感 降低了损耗 面积及电磁干 扰 芯片的振荡器额定频率为 10KHZ 应用于低输入电流情况时 可于振荡器与地之间 外接一电容

 从而以低于 10KHZ 的振荡频率正常工作

 特点 

1 转换逻辑电源+5V 为 5V 双相电压 

2 输入工作电压范围广 1.5V 10V 

3 电压转换精度高 99.9% 

4 电源转换效率高 98% 5 低功耗 静态电流为 90 A(输入 5V 时)

6 外围元器件少 便于使用 只需两只外接电容

 7 8-Pin DIP 和 8-Pin SOIC 小封装 8 符合 RS232 负电压标准 9 静电击穿电压高 可达 3KV 10 高电压工作时 无 Dx 二极管需求


用途我猜测是

(一)当电压发生反转时,示波器能够清晰地显示出这种反转现象,包括反转的起始点、持续时间以及反转后的电压幅值等关键参数。

(二)当电压信号发生反转时,示波器电压反转器(或类似功能)能够捕捉并显示这种变化





运算放大器


GS8094


在我的理解里

(一)运放可以增强微弱信号的幅度,使其更容易在示波器屏幕上显示和观测。

(二)对输入信号进行初步放大,以确保信号在后续处理过程中保持足够的幅度和信噪比。

(三)高质量的运算放大器通常具有极低的噪声水平,这有助于减少测量过程中的噪声干扰,提高测量精度。


输入失调电压(Vos) : 8mV
电源抑制比(PSRR) : 80dB
存储温度 : -55~+150℃
封装/外壳 : SOP14_150MIL
-3db带宽 : 350MHz
通道数 : 4
输入偏置电流 : 1pA
压摆率 : 232V/μs
增益带宽积(GBP) : 195MHz
共模抑制比 - CMRR : 80dB
输出类型 : Rail-to-Rail
工作温度 : -40℃~+125℃
长x宽/尺寸 : 8.63 x 3.90mm
高度 : 1.75mm
引脚数 : 14Pin
脚间距 : 1.27mm



8通道模拟多路复用器
74hc4051D
宽工作温度范围:Topr =-40至125 ℃
 低功耗:Icc = 4.0 uA(最大值)(Vcc = 6.0 V,VEe = GND,Ta = 25 ℃)
低导通电阻:RoN = 50(典型值。)
在Vcc-VEE = 9 V时 高线性度:THD = 0.02%(典型值。)Vcc -VBg=9 V时
复用器的作用应该是将信号汇总处理,提高精度

隔离电压
TLP785GB
用于隔离高电压的元器件,避免输入220V的电压导致击穿主控芯片


示例代码
由于网上CH32相关芯片的代码比较少,而且大家学习还是以stm32为主,所以我找了stm32的示例程序分享给大家看一下,大家一起学习
#define NPT 1024//一次完整采集的采样点数

/******************************************************************
函数名称:GetPowerMag()
函数功能:计算各次谐波幅值
参数说明:
备  注:先将lBufOutArray分解成实部(X)和虚部(Y),然后计算幅值(sqrt(X*X+Y*Y)
*******************************************************************/
void GetPowerMag(void)
{
    float X,Y,Mag,magmax;//实部,虚部,各频率幅值,最大幅值
    u16 i;
	
	//调用自cr4_fft_1024_stm32
	cr4_fft_1024_stm32(fftout, fftin, NPT);	
	//fftin为傅里叶输入序列数组,ffout为傅里叶输出序列数组
	
    for(i=1; i2; i++)
    {
		X = (fftout << 16) >> 16;
		Y = (fftout >> 16);
		
		Mag = sqrt(X * X + Y * Y); 
		FFT_Mag=Mag;//存入缓存,用于输出查验
		//获取最大频率分量及其幅值
		if(Mag > magmax)
		{
			magmax = Mag;
			temp = i;
		}
    }
	F=(u16)(temp*(fre*1.0/NPT));//源代码中此公式有误,将此复制进去
	
	LCD_ShowNum(280,180,F,5,16);
}					

u16 magout[NPT];
/******************************************************************
函数名称:InitBufInArray()
函数功能:正弦波值初始化,将正弦波各点的值存入magout[]数组中
参数说明:
备    注:
*******************************************************************/
void InitBufInArray(void)
{
    u16 i;
    float fx;
    for(i=0; isin((PI2*i)/NPT);
        magout = (u16)(2048+2048*fx);
    }
}

/******************************************************************
函数名称:sinout()
函数功能:正弦波输出
参数说明:
备    注:将此函数置于定时器中断中,可模拟输出正弦波
*******************************************************************/
void sinout(void)
{
	static u16 i=0;
	DAC_SetChannel1Data(DAC_Align_12b_R,magout);
	i++;
	if(i>=NPT)
		i=0;
}


主要成本分析
(一)主控芯片CH32F203CBT6。8元/颗

(二)LCD控制芯片CH32F203RCT6。7元/颗

(三)LCD屏幕2.4寸。15元

(四)TP5400。0.5/个

(五)ME7760C。1元/个

(六)GS8094。1.5/个

(七)74hc4051D。0.5/个

(八)TLP785GB。0.5/个

没有算上外壳,pcb板之类的。比较重要的几颗芯片,价格加在一起纯成本为34块钱
这个成本大家觉得怎么用呢?如果算上其他费用,这个产品的成本应该在80-100元左右
这算得上是挺好的一个产品

总结
(一)这款mini示波器,如果你的需求仅仅是想看一个形状,想看一下是什么波形,而且主打一个随身携带,那么这款mini示波器可能在关键时刻可以帮上忙
但是,如果你想做项目,看时序,那这款mini示波器就和一个玩具一样,做起项目来很麻烦,而且不是很专业
(二)这款mini示波器整体的做工都还不错,看得出来也挺用心在做这款产品,LCD图形界面做的也非常好,两颗主要的芯片都选用了沁恒微电子的CH32系列
也算的上是挺不错的国产产品
(三)建议改进部分的话,就是希望能够将几个按钮改成滚轮,滚轮肯定要比按钮方便的多,其次就是外壳可以做的更美观一点,可以用硅胶套,这样显得更高级
最后希望电池能够塞进去更大容量的,毕竟主打一个便携,续航也要跟得上才行




作者: 小恶魔owo, 来源:面包板社区

链接: https://mbb.eet-china.com/blog/uid-me-4067534.html

版权声明:本文为博主原创,未经本人允许,禁止转载!

文章评论1条评论)

登录后参与讨论

乖乖兔爸爸 2024-9-27 10:15

"值不值"这个问题,  见仁见智,  要看你想干什么了.
100块 的成本的确很良心, 网上还有更便宜的, 30块左右的散件

我一直想找一款: 居家可用,的,  能测 千兆 以太网  (125M 时钟)  的便宜示波器, 有相关信息的大侠欢迎留言
相关推荐阅读
小恶魔owo 2024-11-27 01:12
【电子DIY】ESP32-CAM网络摄像头(未完待续)
前言最近在网上研究ESP32的种类的时候,发现有一款很特别的开发板----ESP32-CAM这款开发板是ESP32S芯片+一个OV2640摄像头(本文用的是OV3660摄像头,两个摄像头可以通用,且O...
小恶魔owo 2024-10-31 16:16
PHP获取服务器性能状态、资源使用情况
前言当我们需要获取linux服务器的状态时,比如APP要获取服务器状态、网页要显示服务器状态,那么我们就可以用exec函数来命令linux,然后读取linux的数据,但是exec函数在PHP中都是推荐...
小恶魔owo 2024-10-28 08:20
高德导航、路径规划运用在单片机及APP上,快速开发导航应用项目
前言(一)在当今这个瞬息万变的数字化时代,导航技术已经深入到我们生活的方方面面,从日常出行到物流配送,再到应急救援,无不彰显其重要性。随着智能手机和物联网技术的飞速发展,对于导航系统的需求不再仅仅局限...
小恶魔owo 2024-10-27 03:15
ESP32/ESP8266模块教程----OLED励志语录,自动换行
前言平时做项目的时候,为了让项目显得更高级,可以调用励志语录让OLED屏幕显示出来,比如桌面摆件,挂件,副屏等,可以用的上所以本期给大家分享一下ESP32/ESP8266,或者任何可以联网的单片机都可...
小恶魔owo 2024-10-22 22:47
三菱PLC使用ST语言超详细教程,用"C语言"玩转PLC
简介ST语言,全称为结构化文本(Structured Text),是一种高级编程语言,专为工业自动化和控制系统设计。我们学习PLC一般是用梯形图,梯形图学会后,学习SFC,但是我发现梯形图和SFC虽然...
小恶魔owo 2024-09-07 23:14
树莓派、香橙派,搭建网站服务器,拥有属于自己的服务器
效果展示(一)香橙派zero3(二)网站截图(三)服务器延迟速度前言(一)不知道大家手头上是不是都有一台或者多台服务器,服务器对大家做项目来说还是有很大帮助的,特别是可以给单片机加入非常多好玩的元素;...
我要评论
1
4
关闭 站长推荐上一条 /2 下一条