热度 5
2024-8-29 23:32
910 次阅读|
1 个评论
前言 之前学习模电的时候,想着应该买台示波器这样才好观察实验现象,但是又苦于没有资金,所以就在网上买了一台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) 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 = FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = 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 8 ); lcd_write_data (x1); lcd_write_data 8 ); lcd_write_data (x2); lcd_write_cmd ( 0x2b ); lcd_write_data 8 ); lcd_write_data (y1); lcd_write_data 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 = { 0 }; data = color >> 8 ; data = 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 ; *(__IO u8*)LCD_DATA=data ; } } } /** * display a point on the lcd. * * @param x x position * @param y y position * * @return void */ 主控模块 示波器的原理,可以简单给大家说一下,但是这款产品用的什么方法,我也不清楚,给大家提供一个思路 一、信号输入与预处理 信号输入 :被测电压信号首先进入数字示波器的采集前端。 预处理 :在采集前端,信号会经过前置放大器和滤波器等元件进行处理。前置放大器用于调整信号的幅度,以满足后续处理的需要;滤波器则用于滤除不需要的频率成分,以改善信号的信噪比。 二、模拟到数字的转换(A/D转换) 模数转换器(ADC) :经过预处理的模拟信号被送入模数转换器(ADC)。ADC的作用是将模拟信号转换为数字信号。这一转换过程包括采样和量化两个步骤,即将连续的模拟信号在时间上离散化,并在幅度上量化成一系列的数字值。 数字信号存储 :转换后的数字信号被存储在数字示波器的内部存储器中,如FLASH或DDRAM等。这些存储器具有高速、大容量的特点,能够实时地保存大量的采样数据。 三、数据处理与显示 数据处理 :存储在内部存储器中的数字信号可以通过软件编程进行各种分析和处理,如波形重构、频谱分析、噪声抑制等。这些处理功能使得数字示波器能够提供更丰富、更准确的测试信息。 波形显示 :处理后的数字信号最终以波形、图表等形式显示在数字示波器的屏幕上。用户可以通过调整示波器的设置(如时基、垂直档位、偏移等)来观察和分析波形。 主控芯片 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 ; i
热度 6
2024-4-26 21:26
1365 次阅读|
2 个评论
前言 这个MP3是我在高中的时候买的,那时候在学校不能用手机,只能带个MP3听听音乐、电台,这也成为我在高中时代的乐趣之一。 如今早已不用这个MP3了,而且好像进液开不了机,所以拆解出来,看看内部的做工,毕竟价格还是很高的,分析一下成本和电路。 由于内部已经短路,电路测量困难,尽量给大家分析,可能有些许错误,请谅解~ 外观&铭牌展示 1.整体做工是挺不错的,没有毛刺什么的,外壳为塑料,造型中规中矩 2.但是采用了micro-usb接口,这点还是比较一般(这两年的已经换成type-c) 3.MP3后面可以看到不愧是大品牌,各种标准3c之类的也是通过的 拆解过程 (一)第一步就是把这个外壳撬开。大家看我对外壳这种破坏性拆解,就知道这个后壳有多难拆了,不愧是有品牌的,外壳质量做的一流。 (二)拆开可以发现,四周都有卡扣固定,但是没有粘胶水,而且没有防水胶 (三)可以看到,电池是用厚双面胶粘着的,但是只有一个角落是有胶,其他地方没有 (四)电路板下面没有固定,边边有一点点卡扣,卡住板子,可以看到SD卡和电池处都有固定胶 (五)除胶后,SD卡可以直接拿下来(SD卡+1) (六)板子背面 (七)电池为180毫安,带保护板,额定电压3.7V 内部SD卡 内部的SD卡就是那种非常常见的卡,表面没有任何速度标识,速度也是非常慢的那种 里面存放着音乐文件,MP3可以读取文件夹里面的音乐,电脑也可以把音乐下载到文件夹里面 格式化后,内部文件清空,可以当一张16G(14.8G)的SD卡使用,但是也就用在使用速度不高的地方 PCB板&主要芯片 (一) 主控芯片--- - ATS2831 (疑似) 这款芯片,虽然上面有丝印,写着ATS2831,但是通过搜索发现,全网对于这款芯片的资料几乎为0,所以可以判断这颗芯片有可能是给大公司定制的,而且这颗芯片集成了非常多的功能,所以可以参考的资料更是少之又少! 经过多方面寻找,在GitHub上面找到同公司的另一款被公开的资料,ATS2833这一款是公开了一些引脚信息的,所以只能大概给大家分享一下引脚等信息,具体的电路图没有办法给大家分享了 【1】集成了蓝牙射频(RF)和基带、电源管理单元(PMU)、音频编解码器及微控制单元(MCU)等模块。蓝牙发射功率最高达10dBm,接收灵敏度-95dBm,规格完整,性能领先。支持一拖二(同时连接两个蓝牙音箱或蓝牙耳机),支持linein、USB 、SPDIF(光纤或同轴)、I2S、MIC、SD/MMC、SPI等多种音频输入源,支持全格式音频解码,支持屏显,兼容市面主流蓝牙音箱和蓝牙耳机,支持HFP AG 16K高清通话,支持双向48K高清语音同时传输,兼容win7/8.1/10/11/MAC等多种主流操作系统和主流通话会议软件。 【2】采用QNF40(5x5mm)封装 【3】大部分重要的引脚都已经标注出来,在上面的图片中,同时也可以知道,这块芯片的功能之多,大概率是一款定制的芯片 (二) 锂电池管理芯片---- TP4054 TP4054 是一款完整的单节锂离子电池采用恒定电流/恒定电压线性充电器。 其SOT 封装与较少的外部元件数目使得TP4054成为便携式应用的理想选择。 TP4054 可以适合USB 电源和适配器电源工作。 【1】采用SOT23-5封装。这种封装很小,在电路板上占用地方很少,而且所需的元器件很少 0.15时候,用1公式;当所需电流<=0.15时候,用2公式。如图所示 【3】CHRG引脚,MCU可以通过此引脚确定芯片的状态 【4】输出电压精准维持在4.2V,不会充坏电池 (三) FM收音机芯片---- QN8035 因为这款MP3还有一个很重要的功能就是FM收音机,所以就必须得用到FM收音机芯片,用来接收FM信号。 QN8035 是一颗高性能、低能耗、全功能的立体声调频接 收单芯片,主要适用于手机、MP3 播放器及便携式收音机 等。 QN8035 支持 RDS/RBDS 数据接收。 【1】采用MSOP10(3x3mm)封装。封装也非常小巧,而且易于更换 【2】支持全球FM波段接收。60Mhz~108Mhz全波段接收 【3】低功耗。低电流13mA,Vcc2.7~5V,集成稳压器 【4】高性能。集成音频处理,自动搜台功能,左右声道分离 (四) SD卡槽 重要芯片、元器件全家福 成本分析 (一) 基础元器件 ----电容、电阻、二极管,由于MP3是对音频有要求,所以电容使用的特别多,所以直接算2元 (二) 贴片按键 ----板子上面用了两种不同的按钮,还有一个滑动开关,一共8个,就算1元 (三) micro-usb ----非常便宜,仅需3分钱一个。不过这两年已经改成type-c了 (四) 音频插孔插 ----批发价2毛钱一个,质量也不错 (五) SD卡槽 ----0.1元,正常价格 (六) SD卡 ----这个应该是最值钱的东西了,16GB版本的要11元 (七) 锂电池 ----锂电池带线,带保护板的1.87元 (八) TP4054 ----电池管理芯片,市面上非常多了,所以价格也是十分亲民0.25元 (九) QN8035 ----FM收音机芯片,虽然很重要,但是价格也还可以,批发价0.6元 (十) ATS2831 ----这款主控芯片,市面上并没有购买方法,应该是厂商定制的。但是通过在官方了解到,个人想买样品是14块钱一颗 其实14块钱也还好,因为这款芯片集成这么多功能,也是蛮不错的! 所以考虑到主控芯片,可能批发价为14-4=10,10元一颗自带这么多功能的芯片来说,价格也是合适的 (十一) PCB&外壳 ----PCB看起来是多层板,质量也是挺好的;外壳做工不错,而且设计的严丝合缝,手感也不错。所以PCB和外壳一起算10元 硬件成本总计: 37.05 软件、人工、物流、电商成本总计: 10 硬件方面主要的成本在,SD卡、主控芯片芯片、外壳部分。但是因为要让这颗集成这么多功能的主控芯片运行起来,在软件方面的人力绝对也是耗费巨大的 所以软件方面的开发费用较高,也是合理的 总计: 47.05 售价69元来看的话,商家可以赚 21.95 一方面有可能是品牌的原因,品牌肯定是要给一点品牌费用,品牌肯定是要比杂牌质量,性能方面都好 另一方面可能花费在售后方面,因为宣传是只换不修,而且拆解的时候也是得破坏外壳的,所以售后方面也要算成本 改进、建议方案 (一)虽然外壳方面做的非常的硬,布局紧凑,面对日常的磕磕碰碰问题是不大的。 但是内部的电池(可以看上面的图片)电池只有一个角有双面胶固定,而另外3个角没有任何固定,所以有可能会造成,晃动的时候,电池碰到主板引起异响 电子产品内部有异响,客户都会觉得有质量问题,会导致售后率的提高 (二)其次是进液的问题,虽然外壳做的挺好,但是内部却没有防水胶,或者是别的防水措施 在运动的时候出汗,或者突然遇到下雨天,雨水、汗水有可能会随着缝隙进入到内部造成故障 总结 (一)这款MP3挺耐用,而且功耗很小,在学校一个星期充电一次都没有问题,而且可以插耳机,甚至用蓝牙耳机,这简直是学生党的福音 (二)外壳做工和内部PCB板做工都很好,布局紧凑,元器件、芯片选择都往小的选,这可以让产品的体积变小同时也不牺牲性能 (三)在小细节部分做的些许不足,后期也可以改进,而且新版的MP3已经看到micro-usb改进成type-c了 (四)产品还是很不错的,69的价格虽然有点贵,但是也还可以接受,并且定位也挺符合运动党和学生党的,是一个值得称赞的好产品!
热度 3
2024-3-19 12:18
593 次阅读|
0 个评论
在设计防止AI大模型被黑客病毒入侵时,需要考虑到复杂的加密和解密算法以及模型的实现细节,首先需要了解模型的结构和实现细节。 以下是我使用Python和TensorFlow 2.x实现深度学习模型推理的模型的结构和实现细节: 首先,确保安装了TensorFlow 2.x。可以使用以下命令安装TensorFlow: pip install tensorflow 然后,编写一个简单的深度学习模型并实现推理代码,我现在开始编写一段教电脑如何“深度思考”的代码。想象你正在训练一只名叫 tf.keras 的小猴子玩多层迷宫游戏: import tensorflow as tf # 教小猴子搭建迷宫:先是一间有64个门、打开方式都是用力推的房间(激活函数为relu) # 然后是一排10扇自动分类门(激活函数为softmax) def create_model (): model = tf.keras.models.Sequential( ) # 给小猴子安排一位私人教练(adam优化器)和一套评分规则(损失函数和准确率指标) model. compile (optimizer= 'adam' , loss= 'sparse_categorical_crossentropy' , metrics= ) # 训练完毕,把这只懂迷宫玩法的小猴子送出来 return model # 把刚刚训练好的小猴子领回家 model = create_model() # 给小猴子一些线索(输入数据),让它预测出口在哪 input_data = ] # 小猴子开始在脑海里模拟走迷宫,给出预测结果 predictions = model.predict(input_data) # 打印出小猴子对出口的预测:“我觉得是这里!” print ( 'Predictions:' , predictions) 【AI大模型远程控制启动车辆1(原创)】 https://www.bilibili.com/video/BV1yu4m1M7ZS/?share_source=copy_web&vd_source=b5b305bec6cbccdfdaee2cf57cf341bc 这段代码就像是我们在训练一只聪明的AI小动物解决实际问题,通过构建神经网络模型并进行推理,让电脑也能像人一样根据输入信息做出决策。 在上述示例中,我创建了一个简单的深度学习模型,该模型具有两个全连接层。然后,加载了该模型并为其提供了输入数据。最后,我运行了模型的推理,并输出了预测结果。此外,还需要考虑其他因素,如模型的优化器、损失函数和评估指标等。 为了防止AI大模型被黑客病毒入侵控制,通常可以采取以下措施: 数据加密 :对模型的数据进行加密,包括训练数据和模型参数,以防止数据在传输或存储过程中被窃取或篡改。使用安全的编程实践,如输入验证、输出编码和错误处理。 访问控制 :设置严格的访问控制机制,只允许授权的人员或系统访问模型。对模型进行安全加固,例如限制模型的访问权限、使用防火墙等。 安全评估 :定期进行安全评估和漏洞扫描,发现并修复潜在的安全漏洞。定期更新模型和相关软件,以修复已知的安全漏洞。 模型监控 :实时监控模型的输入和输出,检测异常行为或异常数据,及时采取措施防止入侵。对模型进行监控,以便及时发现异常行为。 员工培训 :培训开发和使用模型的人员,提高他们的安全意识,避免人为因素导致的安全风险。 【AI大模型远程控制启动车辆3(原创)】 https://www.bilibili.com/video/BV1UJ4m1b7s7/?share_source=copy_web&vd_source=b5b305bec6cbccdfdaee2cf57cf341bc 以下是我编写的一个简单的Python代码,用于防止AI大模型被黑客病毒入侵控制: import os # 这是咱的“大管家”,专门负责家里(系统)的各种琐事,比如找个文件、开个窗户什么的。 import sys # 哎呀,这位是“掌门人”,掌管着整个剧本(程序)的运行环境和江湖地位(参数列表)。 import time # 时间君闪亮登场!它能帮你精确到秒地数钱,哦不对,是计时。 from watchdog.observers import Observer # 嘿嘿,这是我们的“看门狗”监视器,24小时不眨眼盯着文件夹的变化,比小区保安还尽职。 from watchdog.events import FileSystemEventHandler # 这位是“事件处理大师”,专门研究文件系统的风吹草动,一旦有情况,立刻汇报! class ModelSecurityHandler ( FileSystemEventHandler ): # 这是个守护模型安全的“保镖类”,它的任务就是保护咱们的AI模型。 def on_modified ( self, event ): # 如果有人对模型文件动手脚,触发了"on_modified"这个技能(方法)。 if event.src_path.endswith( '.model' ): # 检查是不是模型文件被改了,就像检查是不是自家宝贝被摸了一样。 print ( f"检测到模型文件 {event.src_path} 被修改,正在恢复..." ) # 发现问题就马上喊话:“喂喂喂,谁动了我的奶酪?现在开始复原!” restore_model(event.src_path) # 然后赶紧调用“还原大法”,把模型恢复原状。 def restore_model ( model_path ): # 这是“还原大法”的具体实现,但目前还是空壳子,暂时假装在执行神秘操作... pass def main (): # 进入主战场啦! path = sys.argv if len 1 else '.' # 主角出场前先定个舞台(路径),如果观众(用户)指定了位置,就去那里;没指定,默认就在当前目录表演。 event_handler = ModelSecurityHandler() # 创建一个“保镖”角色。 observer = Observer() # 再召唤出一只“看门狗”。 observer.schedule(event_handler, path, recursive= True ) # 给“看门狗”安排任务,让它带着“保镖”全方位无死角盯着目标路径下的所有动静。 observer.start() # “看门狗”上岗啦! try : while True : # 主角在此陷入死循环,每过一秒都要打个盹儿(sleep)。 time.sleep( 1 ) except KeyboardInterrupt: # 唯一能让主角从梦中醒来的,只有观众按下退出键这招“狮吼功”。 observer.stop() # 接到信号,“看门狗”停止巡逻。 observer.join() # 最后,“看门狗”完成使命,与主角一同退场。 if __name__ == "__main__" : # 当整部剧由自己独立演出时,启动剧情主线! main() # 开始行动吧! 下面是不带我讲解的纯净版: import os import sys import time from watchdog.observers import Observer from watchdog.events import FileSystemEventHandler class ModelSecurityHandler ( FileSystemEventHandler ): def on_modified ( self, event ): if event.src_path.endswith( '.model' ): print ( f"检测到模型文件 {event.src_path} 被修改,正在恢复..." ) restore_model(event.src_path) def restore_model ( model_path ): # 在这里添加恢复模型的代码 pass def main (): path = sys.argv if len 1 else '.' event_handler = ModelSecurityHandler() observer = Observer() observer.schedule(event_handler, path, recursive= True ) observer.start() try : while True : time.sleep( 1 ) except KeyboardInterrupt: observer.stop() observer.join() if __name__ == "__main__" : main() 这个代码使用了 watchdog 库来监控模型文件的变化。当检测到模型文件被修改时,会调用 restore_model 函数来恢复模型。使用时需要在 restore_model 函数中添加实际的恢复模型的代码。 【AI大模型远程控制启动车辆2(原创)】 https://www.bilibili.com/video/BV11m411R7ya/?share_source=copy_web&vd_source=b5b305bec6cbccdfdaee2cf57cf341bc 在设计防止AI大模型被黑客病毒入侵的代码时,需要考虑更复杂的加密和解密算法以及模型的实现。下面我将写一个更复杂的防护措施: import os import sys import hashlib # 这位是“密码学大师hashlib”,专攻数据指纹鉴定,让你的数据独一无二。 import cryptography # “cryptography”可是安全界的重量级人物,负责各类加密解密大戏。 from cryptography.fernet import Fernet # 引入Fernet这位神秘特工,他掌管着高级加密技术,让数据变身成为秘密情报。 # 我们先定义个简单加密方法(其实就是个玩笑,实际中得用更厉害的招数) def simple_encrypt ( data ): key = Fernet.generate_key() # 特工Fernet生成一把独门密钥 cipher_suite = Fernet(key) # 拿着密钥启动加密设备 cipher_text = cipher_suite.encrypt(data.encode()) # 把明文数据变成加密后的摩斯密码 return cipher_text # 返回这串神秘代码 # 然后定义一个简单的解密方法(同样只是示例,真实情况会复杂得多) def simple_decrypt ( cipher_text ): key = Fernet.generate_key() # 又生成一把新密钥(这里演示不对,实际要使用同一把密钥) cipher_suite = Fernet(key) # 再次启动解密设备 plain_text = cipher_suite.decrypt(cipher_text) # 将加密信息破解回原始内容 return plain_text # 原始数据又回来啦! --剧情高潮-- # 接下来,主角出场!AI模型大侠的源文件名是'ai_model.bin' model_file = 'ai_model.bin' with open (model_file, 'rb' ) as f: # 打开宝箱读取模型秘籍 model_data = f.read() # 把秘籍内容全盘接收 # 对秘籍进行加密,藏起来 encrypted_model_data = simple_encrypt(model_data) # 写入加密后的秘籍副本《加密版ai_model.bin》 encrypted_model_file = 'encrypted_ai_model.bin' with open (encrypted_model_file, 'wb' ) as f: f.write(encrypted_model_data) # 秘籍存好,妥妥的 --进入日常环节-- # 加载秘籍前先解密,就像每次练功前先解锁秘籍一样 def load_ai_model (): global model_data # 全球公告:我要用到这个变量了 with open (encrypted_model_file, 'rb' ) as f: # 打开加密秘籍 cipher_text = f.read() # 把加密内容拿过来 model_data = simple_decrypt(cipher_text) # 解密,还原成真经 # 在退出程序时,记得再次加密并保存秘籍,防止被偷窥 def save_ai_model (): global model_data # 同样全球公告一下 encrypted_model_data = simple_encrypt(model_data) # 先加密 with open (encrypted_model_file, 'wb' ) as f: f.write(encrypted_model_data) # 再次将加密后的秘籍封存 # 开始修炼!加载秘籍 load_ai_model() # 安排在剧终时自动加密保存秘籍 atexit.register(save_ai_model) # 使用AI大侠开始预测(此处纯属虚构,真实情况请结合具体模型施展神通) def predict ( data ): # 在这里我们已经实现了一个神奇的深度学习推理过程... # 练习一次预测功夫 predict(model_data) 防止 AI 大模型被黑客病毒入侵控制需要综合考虑多个方面的安全措施。由于具体的实现会因模型的特点,应用场景和安全需求会有所不同。我会帮助客户构建安全的 AI 大模型。上面的只是一些基本的安全措施,在实际中我可以利用eFPGA芯片对上述的功能进行加速,下面我编写一个加速代码: // 这是一个用FPGA搭建的AI大模型安全防护系统 module ai_model_protection ( input logic clk, // 好比是AI心脏的脉搏时钟,保证一切动作有节奏地跳动 input logic rst_n, // 复位开关,一按就回归出厂设置(嗯,其实是“一键还原”) input logic data_in, // 数据入口,想象成从外界输入的小秘密 output logic data_out // 数据出口,处理后的结果像变魔术一样输出 ) ; // 我们定义一个超级简易加密算法,其实就是加个暗号(1234567890)而已 function automatic logic simple_encrypt; input logic plain_text; // 明文数据,就像没穿马甲的信息 logic cipher_text; // 密文数据,穿上马甲后它摇身一变成了谜团 // 加密过程就是给明文加上我们的暗号 cipher_text = plain_text + 1234567890 ; // 然后把穿了马甲的数据返回出去 simple_encrypt = cipher_text; endfunction // 解密算法更简单,脱掉马甲就好了,也就是减去那个暗号 function automatic logic simple_decrypt; input logic cipher_text; // 拿到穿马甲的数据 logic plain_text; // 脱下马甲后的原样数据 // 解密过程就是把马甲(暗号)去掉 plain_text = cipher_text - 1234567890 ; // 原始数据现身!然后送给需要的人 simple_decrypt = plain_text; endfunction // 接下来是藏着加密后模型数据的秘密仓库 logic encrypted_model_data; // 这里要设计一个用于AI大模型运算的硬件模块 // 当然,这里只是举个栗子,真实情况肯定得根据模型量体裁衣 module ai_model ( input logic clk, input logic rst_n, input logic data_in, output logic data_out ) ; // 在这里插入复杂的硬件加速逻辑,比如卷积神经网络的电路实现 // 比如说我们已经有一台神奇的AI算力黑科技在默默工作... endmodule // 我们召唤出这个神秘的AI模型硬件实例 ai_model ai_model_inst ( .clk(clk), // 给它接上心跳时钟 .rst_n(rst_n), // 连接复位信号,随时准备重启江湖 .data_in(encrypted_model_data), // 输入的是加密过的数据 .data_out(data_out) // 输出解密后的结果 ) ; // 对输入数据进行加密打扮,让它变成"密码"形式 encrypted_model_data = simple_encrypt (data_in); // 下面是决定何时解密的剧情高潮部分 always @(posedge clk or negedge rst_n) begin if (!rst_n) begin // 当复位信号有效(低电平),上演一键解码大戏 data_out < = simple_decrypt (encrypted_model_data); end else begin // 平时嘛,直接输出加密后的数据(保持神秘感) data_out <= encrypted_model_data; end end // 结束这场FPGA与AI大模型的奇妙合作之旅 endmodule AI大模型安全方面还需要考虑到以下几个方面才能防止AI大模型被黑客病毒入侵控制: 1. 硬件安全模块(HSM)集成 FPGA与HSM的连接 :在FPGA设计中集成硬件安全模块(HSM),该模块可以提供安全的存储、加密和解密服务。 安全密钥管理 :使用HSM生成、存储和管理用于保护AI模型的加密密钥。 2. AI模型的安全封装 模型加密 :在FPGA上部署AI模型之前,使用HSM中的密钥对模型进行加密。 解密与加载 :在FPGA运行时,使用HSM解密模型,并将其加载到FPGA的专用内存区域中。 3. 通信接口的安全防护 加密通信 :使用TLS/SSL或其他安全协议对FPGA与外部设备或网络的通信进行加密。 访问控制 :实施严格的访问控制策略,限制对FPGA的访问权限。 4. 实时监控与检测 入侵检测系统 :在FPGA上实现轻量级的入侵检测系统,用于检测潜在的攻击行为。 日志记录 :记录所有关键操作和事件,以便后续分析和审计。 5. 固件更新与补丁管理 安全更新 :通过安全的通道(如加密的OTA更新)向FPGA推送固件更新和补丁。 验证与完整性检查 :在更新过程中验证固件的完整性和来源,防止恶意修改。 6. 物理防护 物理访问控制 :限制对FPGA硬件的物理访问,防止直接攻击或篡改。 温度监控 :监控FPGA的温度,防止因过热导致的性能下降或安全漏洞。 7. 代码开发与审查 安全编码实践 :遵循安全编码最佳实践,减少软件层面的漏洞。 代码审查 :定期进行代码审查和安全漏洞扫描,确保没有安全隐患。 注意事项: 安全权衡 :在设计时需要考虑安全与性能的权衡,避免过度防护导致性能下降。 持续更新 :随着安全威胁的不断演变,需要定期更新和升级安全防护措施。 多层次防护 :采用多层次的安全防护策略,以提高整体安全性。 今天先写到这里... 上几篇: 【灵动 Mini-F5333开发板】+手把手带你玩转 CORDIC 坐标旋转算法 【灵动 Mini-F5333开发板】+(2)手把手带你玩转MindSwitch(MDS)可编程 IP互联模块 【灵动 Mini-F5333开发板】+(3)手把手带你玩转创意设计 【灵动 Mini-F5333开发板】+原创(3)连接上ChatGPT 【开源硬件小安派-Eyse-S1】+手把手玩转I2C总线 【开源硬件小安派-Eyse-S1】+(2)手把手玩转DAC 【开源硬件小安派-Eyse-S1】+原创(3)手把手玩转复杂项目 【开源硬件小安派-Eyse-S1】+原创(4)手把手玩转三组四自由度机械臂 本人在本论坛内的试读经验 : 《Proteus实战攻略》+7 第五章双足机器人仿真实例 希望这些心得体会能对您有所帮助! 谢谢! 还没吃饭中 2024年3月18日