
梁山派示波器-双通道
简介
基于梁山派的双通道示波器设计
简介:基于梁山派的双通道示波器设计开源协议
:GPL 3.0
描述
项目分析
本项目基于梁山派设计双通道示波器
实现功能:
1、双通道采集
2、DAC波形生成
3、拨轮按键控制
4、屏幕触控控制
硬件整体框图:

本项目基于官方案例设计,官方案例如下:【示波器扩展板】资料
本人所作工作如下:
1、基于官方单通道采集电路绘制双通道采集电路
2、绘制屏幕触控电路,代替按键操作
3、删去轻触按键,保留拨轮按键
4、使用屏幕触控+拨轮按键完成人机交互
5、增加一处供电接口
6、根据绘制的原理图设计PCB
7、焊接并调试示波器
8、完成双通道示波器代码
原理图设计说明








PCB设计说明
本项目需要放置的器件比较多,所以我在设计时,加长了板子的长度,宽度与梁山派核心板保持一致,如下图所示

在PCB设计时,布局比较紧凑,对布线影响较大,所以本项目最后采用了4层板设计,使用了内层1为模拟地平面,内层2因为担心会对模拟信号产生干扰,所以仅连接了部分电源线和信号线(这方面也是第一次绘制,不太清楚会不会产生干扰,如果有大佬看到并且能普及一下相关知识那定然是极好的,还请勿喷)
在本项目中,引出两个ADC检测探头,同时引出波形发生测试点和模拟地测试点,波形发生测试点和模拟地测试点采用测试环,便于示波器探头连接测试

还有就是元器件布局较密,焊接稍微麻烦一些
软件说明
1、双路ADC初始化
两路ADC分别是PA1-ADC0CH1和PF7-ADC2CH5,采集思路为:定时器触发ADC采集,DMA自动将数据存储,当数据采集过半或完成采集触发DMA中断,将采集到的数据以波形形式进行显示
在ADC初始化函数中,PA1与官方例程中使用引脚一致,不做修改,仅添加PF7部分即可

ADC2CH5的采集中断函数

2、交直流切换和采样倍率切换控制

3、微秒延时函数实现
首先,修改进入systick.c函数,修改systick时钟重装寄存器的值,原值为系统时钟/1000,这种情况下,每次进入中断的实践间隔为1ms,所以原文件中只有毫秒延时的函数。将该值修改为系统时钟/1000000,每次进入中断的时间就变为了1us,同时对原毫秒延时函数进行修改,即完成了微妙延时函数的实现

4、触控函数移植
本项目中使用的触控芯片是XPT2046,卖屏幕的有提供XPT2046的触控函数,不过是应用于ST芯片的函数,需要进行GD的移植
触控提供的例程是软件SPI,所以本项目也使用软件SPI,上一步的微秒函数实现就是主要是应用于触控的软件SPI通信
触摸屏因批次不同等原因,默认的校准参数值可能会引起触摸识别不准,推荐校准后再使用,不建议直接使用固定的默认校准参数,触摸函数初始化如下图所示,通过Adjust函数确定是使用原厂参数还是采用手动校准获取参数
推荐先使用手动校准获得较为准确的参数(通过串口输出),根据这个参数修改程序后再关闭手动校准

触控的坐标采集如下图所示,同时添加两个状态机用于支持单次触摸,放置一次触屏导致多次触发对应函数

简单介绍一下,本项目中的触控逻辑,首先循环检测屏幕是否有被按下,当被按下后,检测被按下屏幕区域,如果该区域内有相应的触控函数,就执行对应的代码,执行完毕后,就等待触控被释放,当触控被释放后,便回到开头,实现循环检测,逻辑框图如下图所示

未暂停状态下的触控响应函数如下图所示

暂停状态下的触控响应函数如下图所示

5、整体函数实现
本项目的整体函数根据官方例程修改而来
实现功能如下
实现触控操作,包括波形采集的暂停开启、上下边沿切换、交直流切换、放大倍数切换、采样速度切换、波形种类切换、FFT切换、暂停状态下的通道信息显示切换
双拨轮函数适配,原例程的拨轮控制函数不适用于双通道采集,所以本项目基于双通道采集,实现了双拨轮的控制函数
整体功能与双通道示波器适配
#include "gd32f4xx.h"#include "systick.h"#include <stdio.h>#include "main.h"#include "bsp_led.h"#include "sys.h"#include "bsp_usart.h"#include "bsp_key.h"#include "bsp_basic_timer.h"#include "bsp_lcd.h"#include "bsp_spi.h"#include "bsp_gui.h"#include "exmc_sdram.h"#include "bsp_dac.h"#include "bsp_adc.h"#include "touch.h"#include "arm_math.h" //ADC采集数据指针uint16_t *adc_tmp;uint16_t *adc_tmp1;//FFT变量#define FFT_LENGTH 1024 //FFT长度,默认是1024点FFTfloat fft_inputbuf[FFT_LENGTH*2]; //FFT输入数组float fft_outputbuf[FFT_LENGTH]; //FFT输出数组arm_cfft_radix4_instance_f32 scfft;//FFT显示处理float max_fft;uint16_t fft_number;//uint16_t fft_n; //缩放比例//频域显示状态uint8_t fft_show_state = 1; //默认1显示探头1的,2显示探头2,0不显示uint16_t Lase_Trigger_number,Lase_Trigger_number1;uint8_t show_updata;uint16_t data_tmp;//波轮按键对应设置uint8_t keya_set=0;uint8_t keya_number=3;uint8_t keyb_set=0;uint8_t keyb_number=4;//触控的坐标和触控状态uint16_t touch_x;uint16_t touch_y;uint8_t touch_state = 0; //0代表未屏幕未被触控,1代表屏幕已被触控uint8_t touch_judge = 0; /*! \brief main function \param[in] none \param[out] none \retval none*/int main(void){ uint32_t i; nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2); // 优先级分组 systick_config(); led_gpio_config(); // led初始化 key_gpio_config(); // key初始化 usart_gpio_config(9600U); //sram初始化 exmc_synchronous_dynamic_ram_init(EXMC_SDRAM_DEVICE0); //LCD初始化 LCD_Init(); delay_1ms(50); Spi2_Dma_Init(); Lcd_Gram_Fill(Show_GramA,GRAM_BLACK); //将颜色数据写入缓冲区 LCD_Show_Gram(Show_GramA); while(Lcd_Show_Over); LCD_BLK_Set();//打开背光 delay_1ms(10); Lcd_Gram_Fill(Show_GramA,GRAM_BLACK); Lcd_Gram_Fill(Show_GramB,GRAM_BLACK); //开启定时器固定刷屏 Lcd_Show_Time(); //波形输出 dac_config(); Dac_Show_Wav(wav_number); Dac_Time_Hz(wav_Fps); //ADC采集 adc_config(); adc_setio_init(); alternating_direct_set(ac_dc); gather_rate_set(gather_rate); adc_speed_set(adc_speed);TP_Init(); ////FFT初始化 scfft结构体 arm_cfft_radix4_init_f32(&scfft,FFT_LENGTH,0,1); //绘制功能图标 POINT_COLOR=GRAM_WHITE; //画笔颜色 for(i=0;i<10;i++) Lcd_Show_Data(i); POINT_COLOR=GRAM_YELLOW; //画笔颜色 Lcd_Show_Data(keya_number); POINT_COLOR=GRAM_GREEN; //画笔颜色 Lcd_Show_Data(keyb_number); POINT_COLOR=GRAM_WHITE; //画笔颜色 while(1) { //定时器循环固定数据刷屏 while(Lcd_Show_Over); if(show_updata) { show_updata=0; Show_Star=1; //开始这个一帧标志 while(Show_Star); //等待帧处理 }//触摸检测,仅支持单触摸,不支持连触TP_Scan(0);if(touch_state == 0){if(tp_dev.sta&TP_PRES_DOWN)//有触摸被按下{ delay_1ms(1);//必要的延时,否则老认为有按键按下. if((tp_dev.x[0]<(LCD_W-1)&&tp_dev.x[0]>=1)&&(tp_dev.y[0]<(LCD_H-1)&&tp_dev.y[0]>=1)){ touch_x = tp_dev.x[0];touch_y = tp_dev.y[0];touch_judge = 1;//printf("X:%d, Y:%d\r\n", tp_dev.x[0], tp_dev.y[0]);} }}if(tp_dev.sta&TP_PRES_DOWN)//有触摸被按下touch_state = 1;elsetouch_state = 0; if(adc_power) { //等待采集完成 while(!adc_dma_ok); adc_dma_ok=0; //配置指针 添加计算缓冲 DMA采样速度过快 if(adc_dma_AB) adc_tmp = adc_value + adc_buff_2x; else adc_tmp = adc_value ;if(adc_dma_AB1) adc_tmp1 = adc_value1 + adc_buff_2x;else adc_tmp1 = adc_value1;for(i=0;i<adc_buff_2x;i++) {adc_buff[i] = adc_tmp[i];adc_buff1[i] = adc_tmp1[i];} if(fft_show_state == 1){//FFT运算 <1msfor(i=0;i<FFT_LENGTH;i++)//生成信号序列{fft_inputbuf[2*i]=adc_buff[i];//生成输入信号实部fft_inputbuf[2*i+1]=0;//虚部全部为0}arm_cfft_radix4_f32(&scfft,fft_inputbuf);//FFT计算(基4)arm_cmplx_mag_f32(fft_inputbuf,fft_outputbuf,FFT_LENGTH);//把运算结果复数求模得幅值 fft_outputbuf[0] = 0;//第一个值非常大,这里舍弃//测算最大FFT点max_fft = 0;fft_number=0;for(i=0;i<320;i++){if(fft_outputbuf[i] > max_fft){max_fft = fft_outputbuf[i];fft_number = i;}}//自动评估FFT缩放等级fft_n = max_fft/150 + 1; //只显示150个刻度for(i=0;i<320;i++){Show_LinB[i]=(fft_outputbuf[i]/fft_n +27);if(Show_LinB[i] > 227) Show_LinB[i]=227-8;else if(Show_LinB[i] < 27) Show_LinB[i]=27-8;else Show_LinB[i]=Show_LinB[i]-8;}//FFT频率估测fft_fps = (2000000 / (0x01<<adc_speed)) * fft_number / 1024;}else if(fft_show_state == 2){//FFT运算 <1msfor(i=0;i<FFT_LENGTH;i++)//生成信号序列{fft_inputbuf[2*i]=adc_buff1[i];//生成输入信号实部fft_inputbuf[2*i+1]=0;//虚部全部为0}arm_cfft_radix4_f32(&scfft,fft_inputbuf);//FFT计算(基4)arm_cmplx_mag_f32(fft_inputbuf,fft_outputbuf,FFT_LENGTH);//把运算结果复数求模得幅值 fft_outputbuf[0] = 0;//第一个值非常大,这里舍弃//测算最大FFT点max_fft = 0;fft_number=0;for(i=0;i<320;i++){if(fft_outputbuf[i] > max_fft){max_fft = fft_outputbuf[i];fft_number = i;}}//自动评估FFT缩放等级fft_n = max_fft/150 + 1; //只显示150个刻度for(i=0;i<320;i++){Show_LinB[i]=(fft_outputbuf[i]/fft_n +27);if(Show_LinB[i] > 227) Show_LinB[i]=227-8;else if(Show_LinB[i] < 27) Show_LinB[i]=27-8;else Show_LinB[i]=Show_LinB[i]-8;}//FFT频率估测fft_fps = (2000000 / (0x01<<adc_speed)) * fft_number / 1024;} //////设定值判定 Trigger 上升下降沿 Trigger_number=0; max_data = 2048+(Trigger-Level)*16; if(wav_trigger) { for(i=lin_stat_set;i<lin_over_set;i++) { if(adc_tmp[i] < max_data-25) { for(;i<lin_over_set;i++) { if(adc_tmp[i] > max_data) { Trigger_number=i-lin_stat_set; break; } } break; } } } else { for(i=lin_stat_set;i<lin_over_set;i++) { if(adc_tmp[i] > max_data+25) { for(;i<lin_over_set;i++) { if(adc_tmp[i] < max_data) { Trigger_number=i-lin_stat_set; break; } } break; } } } Trigger_number1=0; max_data = 2048+(Trigger1-Level1)*16; if(wav_trigger) { for(i=lin_stat_set;i<lin_over_set;i++) { if(adc_tmp1[i] < max_data-25) { for(;i<lin_over_set;i++) { if(adc_tmp1[i] > max_data) { Trigger_number1=i-lin_stat_set; break; } } break; } } } else { for(i=lin_stat_set;i<lin_over_set;i++) { if(adc_tmp1[i] > max_data+25) { for(;i<lin_over_set;i++) { if(adc_tmp1[i] < max_data) { Trigger_number1=i-lin_stat_set; break; } } break; } } } //缓存缩放裁剪导入 for(i=0;i<320;i++) { Show_LinA[i]=((adc_buff[i+Trigger_number] + 0x08)>>4) + Level;// if(Show_LinA[i] > 227) Show_LinA[i]=227-8; else if(Show_LinA[i] < 27) Show_LinA[i]=27-8; else Show_LinA[i]=Show_LinA[i]-8; Show_LinA1[i]=((adc_buff1[i+Trigger_number1] + 0x08)>>4) + Level1; if(Show_LinA1[i] > 227) Show_LinA1[i]=227-8; else if(Show_LinA1[i] < 27) Show_LinA1[i]=27-8; else Show_LinA1[i]=Show_LinA1[i]-8; } //显示数据 if(Show_AB) Lcd_Show_Wav(Show_GramA); else Lcd_Show_Wav(Show_GramB);//触摸判断操作if(touch_judge == 1){//开始暂停if(touch_x >= 10 & touch_x <= 26 & touch_y >= 2 & touch_y <= 18){Lase_Trigger_number = Trigger_number+1;Key_Make_Set(0); //开始暂停}//下降沿上升沿if(touch_x >= 125 & touch_x <= 141 & touch_y >= 2 & touch_y <= 18){if(wav_trigger)Key_Make_Set(4);elseKey_Make_Set(5);}//ACDCif(touch_x >= 150 & touch_x <= 166 & touch_y >= 2 & touch_y <= 18){Key_Make_Set(6); //ACDC}//增加放大倍数if(touch_x >= 175 & touch_x <= 191 & touch_y >= 2 & touch_y <= 18){Key_Make_Set(11);}//减小放大倍数if(touch_x > 191 & touch_x <= 207 & touch_y >= 2 & touch_y <= 18){Key_Make_Set(10);}//减少采样速度if(touch_x >= 240 & touch_x <= 261 & touch_y >= 2 & touch_y <= 18){Key_Make_Set(13); //增加波形种类}//增加采样速度if(touch_x > 261 & touch_x <= 282 & touch_y >= 2 & touch_y <= 18){Key_Make_Set(14); //增加波形种类}//改变波形种类if(touch_x >= 10 & touch_x <= 42 & touch_y >= 222 & touch_y <= 238){Key_Make_Set(23); //增加波形种类}//FFT功能if(touch_x >= 100 & touch_x <= 132 & touch_y >= 222 & touch_y <= 238){Key_Make_Set(29); //FFT}} //拨轮A if(key[3] == Key_Time) { if(keya_set) { key[3] = Key_No; //需要再次释放Lcd_Show_Data(keya_number); if(keya_number < 9) keya_number++; POINT_COLOR=GRAM_YELLOW; //画笔颜色 Lcd_Show_Data(keya_number); POINT_COLOR=GRAM_WHITE; //画笔颜色 } else { if(keya_number==5 || keya_number==6 || keya_number==8) key[3]--; //不需要释放 else key[3] = Key_No; //需要再次释放 POINT_COLOR=GRAM_YELLOW; //画笔颜色 Key_Make_Set(keya_number*3 + 2); //减1 POINT_COLOR=GRAM_WHITE; //画笔颜色 } } if(key[4] == Key_Time) { key[4] = Key_No; //需要再次释放 keya_set = !keya_set; } if(key[5] == Key_Time) { if(keya_set) { key[5] = Key_No; //需要再次释放Lcd_Show_Data(keya_number); if(keya_number) keya_number--; POINT_COLOR=GRAM_YELLOW; //画笔颜色 Lcd_Show_Data(keya_number); POINT_COLOR=GRAM_WHITE; //画笔颜色 } else { if(keya_number==5 || keya_number==6 || keya_number==8) key[5]--; //不需要释放 else key[5] = Key_No; //需要再次释放 POINT_COLOR=GRAM_YELLOW; //画笔颜色 Key_Make_Set(keya_number*3 + 1); //减1 POINT_COLOR=GRAM_WHITE; //画笔颜色 } } //拨轮B if(key[6] == Key_Time) { if(keyb_set) { key[6] = Key_No; //需要再次释放Lcd_Show_Data(keyb_number); if(keyb_number < 9) keyb_number++; POINT_COLOR=GRAM_GREEN; //画笔颜色 Lcd_Show_Data(keyb_number); POINT_COLOR=GRAM_WHITE; //画笔颜色 } else { if(keyb_number==5 || keyb_number==6 || keyb_number==8) key[6]--; //不需要释放 else key[6] = Key_No; //需要再次释放 POINT_COLOR=GRAM_GREEN; //画笔颜色 Key_Make_Set(keyb_number*3 + 2); //减1 POINT_COLOR=GRAM_WHITE; //画笔颜色 } } if(key[7] == Key_Time) { key[7] = Key_No; //需要再次释放 keyb_set = !keyb_set; } if(key[8] == Key_Time) { if(keyb_set) { key[8] = Key_No; //需要再次释放Lcd_Show_Data(keyb_number); if(keyb_number) keyb_number--; POINT_COLOR=GRAM_GREEN; //画笔颜色 Lcd_Show_Data(keyb_number); POINT_COLOR=GRAM_WHITE; //画笔颜色 } else { if(keyb_number==5 || keyb_number==6 || keyb_number==8) key[8]--; //不需要释放 else key[8] = Key_No; //需要再次释放 POINT_COLOR=GRAM_GREEN; //画笔颜色 Key_Make_Set(keyb_number*3 + 1); //减1 POINT_COLOR=GRAM_WHITE; //画笔颜色 } } //更新显示 show_updata=1; } else {//确定最大/小值min_data=0xffff;min_data1=0xffff;max_data=0;max_data1=0;for(i=0;i<300;i++) {if(adc_tmp[i+Trigger_number]< min_data) min_data=adc_tmp[i+Trigger_number];if(adc_tmp[i+Trigger_number]> max_data) max_data=adc_tmp[i+Trigger_number];if(adc_tmp1[i+Trigger_number1]< min_data1) min_data1=adc_tmp1[i+Trigger_number1];if(adc_tmp1[i+Trigger_number1]> max_data1) max_data1=adc_tmp1[i+Trigger_number1];} if(Lase_Trigger_number != Trigger_number) { Lase_Trigger_number = Trigger_number; //缓存导入 for(i=0;i<320;i++) { Show_LinA[i]=((adc_tmp[i+Trigger_number] + 0x08)>>4) + Level; //Show_LinA[i]=((adc_tmp[i+Trigger_number] )>>4) + Level; if(Show_LinA[i] > 227) Show_LinA[i]=227-8; else if(Show_LinA[i] < 27) Show_LinA[i]=27-8; else Show_LinA[i]=Show_LinA[i]-8; } } if(Lase_Trigger_number1 != Trigger_number1) { Lase_Trigger_number1 = Trigger_number1; //缓存导入 for(i=0;i<320;i++) { Show_LinA1[i]=((adc_tmp1[i+Trigger_number1] + 0x08)>>4) + Level1; //Show_LinA[i]=((adc_tmp[i+Trigger_number] )>>4) + Level; if(Show_LinA1[i] > 227) Show_LinA1[i]=227-8; else if(Show_LinA1[i] < 27) Show_LinA1[i]=27-8; else Show_LinA1[i]=Show_LinA1[i]-8; } }//显示数据if(Show_AB){//绘制波形Lcd_Show_Wav(Show_GramA);}else{//绘制波形Lcd_Show_Wav(Show_GramB);}//更新显示show_updata=1;//触摸判断操作if(touch_judge == 1){if(touch_x >= 10 & touch_x <= 26 & touch_y >= 2 & touch_y <= 18){Key_Make_Set(0); //开始暂停}if(touch_x >= 11 & touch_x <= 82 & touch_y >= 20 & touch_y <= 80){if(ch_state == 0)ch_state =1;else if(ch_state == 1)ch_state = 0;}} //拨轮A if(key[3] == Key_Time) { key[3]--; if(Trigger_number < adc_buff_2x-320) Trigger_number+=5; } if(key[4] == Key_Time) { key[4] = Key_No; //需要再次释放 } if(key[5] == Key_Time) { key[5]--; if(Trigger_number > 5) Trigger_number-=5; else if(Trigger_number) Trigger_number = 0; else; } //拨轮B if(key[6] == Key_Time) { key[6]--; if(Trigger_number1 < adc_buff_2x-320) Trigger_number1+=5; } if(key[7] == Key_Time) { key[7] = Key_No; //需要再次释放 } if(key[8] == Key_Time) { key[8]--; if(Trigger_number1 > 5) Trigger_number1-=5; else if(Trigger_number1) Trigger_number1 = 0; else; } } touch_judge = 0; //delay_1ms(200); }}//屏幕刷新 50mSvoid TIMER3_IRQHandler(void){ timer_interrupt_flag_clear(TIMER3, TIMER_INT_FLAG_UP); if(Show_Star) { //LED1_TOGGLE(); Show_Star=0; if(Show_AB)LCD_Show_Gram(Show_GramA); else LCD_Show_Gram(Show_GramB); Show_AB =!Show_AB; } //拨码A if(KeyAUp) key[3] &= Key_Time; else if(key[3] < Key_Time) key[3]++; else; if(KeyAOn) key[4] &= Key_Time; else if(key[4] < Key_Time) key[4]++; else; if(KeyADown) key[5] &= Key_Time; else if(key[5] < Key_Time) key[5]++; else; //拨码B if(KeyBUp) key[6] &= Key_Time; else if(key[6] < Key_Time) key[6]++; else; if(KeyBOn) key[7] &= Key_Time; else if(key[7] < Key_Time) key[7]++; else; if(KeyBDown) key[8] &= Key_Time; else if(key[8] < Key_Time) key[8]++; else; }//ADC采集void DMA1_Channel0_IRQHandler(void){ //LED3_TOGGLE(); adc_dma_ok=1; if(dma_interrupt_flag_get(DMA1, DMA_CH0,DMA_INT_FLAG_HTF) == SET) adc_dma_AB=0; else adc_dma_AB=1; dma_interrupt_flag_clear(DMA1, DMA_CH0, DMA_INT_FLAG_FTF|DMA_INT_FLAG_HTF);}//ADC2采集void DMA1_Channel1_IRQHandler(void){ //LED2_TOGGLE(); adc_dma_ok1=1; if(dma_interrupt_flag_get(DMA1, DMA_CH1,DMA_INT_FLAG_HTF) == SET) adc_dma_AB1=0; else adc_dma_AB1=1; dma_interrupt_flag_clear(DMA1, DMA_CH1, DMA_INT_FLAG_FTF|DMA_INT_FLAG_HTF);}
实物展示说明
正面
反面

注意事项
1、在原理图设计说明的电源部分,提到ADC的基准源使用的+2.5V,但在梁山派中使用是基准源为3.3V,所以需要将梁山派中的A3.3V和AGND 0Ω电阻拆除,否则相当于将2.5V和3.3V短路,但是我其实一开始是没有注意到这一点的,并没有拆除梁山派的0Ω电阻,但是在这种情况下,示波器是能够正常工作的
能够正常工作的原因我认为是0Ω电阻并不少真正的短接,是仍然有一部分电阻的,3.3-2.5=0.8V的压降通过0Ω电阻达不到烧毁电路的状况,通过实际的功率测试,我得到的数据如下表
| 拆除0Ω电阻情况 | 未拆除 | 拆除 |
| 示波器电流 | 254.6mA | 125.4mA |
测试设备:合宙CC表
但仍不建议在不拆除0Ω电阻的情况下插入示波器扩展版。如果非试不可的话,请在确保安全的情况下进行测试
2、在使用示波器探头时,注意探头上的1X档位和10X档位,正常使用1X档位即可,10X档位会将信号缩小十倍,一般不使用

在使用示波器时,如果发现采集的信号突然变得很小,可注意检查是否将示波器探头拨到了10X档位(别问,问我也不会说我因为不小心拨错了档位去把电路全检查了一遍了的)
3、程序直接编译烧录即可,如果烧录后无法正常显示,可能是屏幕驱动使用错误,在bsp_lcd.h文件内根据自己的芯片型号修改Chip_Selection变量值即可,支持ILI9341和ST7789两种屏幕驱动

项目总结
我通过本项目学习到了很多知识,总结如下:
梁山派硬件电路知识
模电电路硬件知识
模拟电路电源设计
拨码开关的应用
2.4寸IPS屏幕的使用
模拟电路PCB设计
4层板PCB设计
GD32F450/470使用
TIME+DMA+ADC/DAC结合使用
DSP库的FFT使用
UI界面设计
C语言开发知识
系统程序开发
可以说是收获满满
参考链接
设计图
未生成预览图,请在编辑器重新保存一次BOM
暂无BOM
克隆工程工程成员
知识产权声明&复刻说明
本项目为开源硬件项目,其相关的知识产权归创作者所有。创作者在本平台上传该硬件项目仅供平台用户用于学习交流及研究,不包括任何商业性使用,请勿用于商业售卖或其他盈利性的用途;如您认为本项目涉嫌侵犯了您的相关权益,请点击上方“侵权投诉”按钮,我们将按照嘉立创《侵权投诉与申诉规则》进行处理。
请在进行项目复刻时自行验证电路的可行性,并自行辨别该项目是否对您适用。您对复刻项目的任何后果负责,无论何种情况,本平台将不对您在复刻项目时,遇到的任何因开源项目电路设计问题所导致的直接、间接等损害负责。


评论