KiCad文件
全屏
内容介绍
内容介绍
一、项目介绍和创意介绍
1. 项目介绍
本项目以活动方向五:教育与创意互动,制作一个以STM32F103C8T6为主控核心,搭配2.4 寸 TFT 彩色液晶屏的便携式多功能硬件调试仪器,可满足在日常的DIY,学习中把示波器,信号发生器,可调电源集于一体的低成本调试工具,经过测试,该仪器精度可满足日常学生学习和DIY使用。
集成六大工作模式:
- 可调直流电压源模式
- 正弦波信号发生模式
- 三角波信号发生模式
- 方波信号发生模式
- 可调 PWM 信号输出模式
- 简易数字示波器模式
可实现:频率可调波形输出、占空比可调 PWM、-3V~+3V 直流偏置、示波器DC/AC 耦合切换、信号增益调节、时基档位调节、波形缩放、实时电压 / 峰峰值 / 平均值 / 频率自动测算,并通过2.4 寸 TFT 全屏可视化展示参数与波形。
2. 项目创意亮点
- 一机多用集成化
把直流电源、DDS 函数发生器、PWM 发生器、数字示波器四个常用仪器合为一体,体积小巧、成本低、便携,替代多台分立仪器。 - 2.4 寸 TFT 全屏可视化交互
采用 2.4 寸彩色 TFT,中文 / 字符菜单 + 实时波形绘制 + 参数弹窗显示,界面直观,无需上位机。 - 本机波形联动观测
信号发生器输出的正弦 / 三角 / 方波,可直接切入示波器模式实时观测本机波形,免外接信号源,调试极方便。 - 硬件软件双重优化
硬件采用 DDS 专用芯片 AD9834 保证波形纯净度;软件采用 ADC+DMA 高速采样、动态时基适配、自动阈值测频、数字电位器程控增益。 - 人性化按键逻辑
五键实现模式切换、参数切换、步进档位、参数加、参数减,支持多级步进调节,兼顾粗调与精调。 - 示波器专业功能标配
支持 DC 耦合(测直流 + 交流叠加信号)、AC 耦合(滤除直流只看交流纹波)、增益档位、时基档位、波形缩放,贴近商用示波器基础功能。
二、项目使用硬件详细介绍
1. 主控核心
STM32F103C8T6
- 主频 72MHz,Cortex-M3 内核;
- 内置 12 位 ADC、多个通用定时器、DMA 控制器、SPI、GPIO;
- 负责系统初始化、按键扫描、逻辑调度、AD9834 驱动、PWM 生成、ADC 波形采样、数据运算、2.4 寸 TFT 刷屏绘图。
2. 显示模块
2.4 寸 TFT LCD 液晶屏(320×240 分辨率)
- 分辨率 320*240,彩色显示,视野大;
- 支持字符显示、矩形绘制、点线绘制、波形曲线实时刷新;
- 用于:模式标题显示、参数数值显示、模拟波形绘图、示波器网格 + 波形轨迹、电压 / 频率 / 增益 / 时基等状态栏信息展示。
3. DDS 波形发生模块
AD9834 可编程波形发生器
- 可程控输出正弦波、三角波、方波;
- 输出频率范围:1Hz ~ 1MHz 连续可调;
- 通过 STM32 SPI 配置频率寄存器、波形模式寄存器;
- 配合 GPIO 使能引脚控制波形输出开关。
4. 程控增益调节模块
MCP41010 单通道数字电位器
- 10kΩ 量程,SPI 程控阻值;
- 软件通过二分法算法校准阻值,实现1~20 倍信号增益调节;
- 用于示波器前端信号放大,适配小幅信号观测。
5. 耦合切换模块
TLP172 光耦继电器
- 软件控制实现DC 耦合 / AC 耦合硬件切换;
- AC 耦合隔离直流分量,只观测交流纹波与交变波形。
6. 采样采集模块
STM32 内置 ADC1 + DMA
- 12 位精度,规则通道连续转换;
- DMA 搬运采样数据,不占用 CPU 资源;
- 软件可动态配置 ADC 采样周期,适配不同时基的采样率。
7. 按键模块
独立 5 按键
功能分别定义:
KEY1:工作模式循环切换
KEY2:调节选项切换
KEY3:步进档位增加
KEY4:参数数值增加
KEY5:参数数值减少
8. PWM 输出模块
STM32 通用定时器 TIM
- 软件实现频率、占空比实时在线修改;
- 占空比 0%~100%,频率大范围可调。
9. 电源与外围电路
- 使用LM1117S-5V/3.3V 提供稳压供电电路;使用ICL7660M/TR提供-5v电源输出,使用mcp4725数字电压芯片控制-3V——3V可调电源输出
- AD 采集端口 RC 滤波、防静电保护;
- AD9834 输出端 7阶切比雪夫低通滤波器,改善波形边沿;
三、方案框图和项目设计思路介绍
1. 方案框图
2. 整体设计思路
- 分层架构设计
分为人机交互层(按键 + 2.4 寸 TFT)、主控逻辑层(STM32 调度)、信号输出层(AD9834+PWM + 直流源)、信号采集层(ADC+DMA + 增益 + 耦合)四层架构,模块独立、便于调试和扩展。 - 初始化流程
上电依次初始化:系统时钟→GPIO→按键→TFT 液晶屏→ADC/DMA→定时器 PWM→SPI 外设 (AD9834/MCP41010)→默认参数加载→进入主循环。 - 主循环工作逻辑
检测按键动作 → 修改对应模式 / 参数 → 同步更新硬件配置(AD9834 频率波形、PWM 占空比、ADC 采样率、耦合模式、增益) → 2.4 寸 TFT 刷新界面与波形。 - 示波器专用设计思路
- 采用200 点固定采样点数适配 2.4 寸 TFT 宽度;
- 通过设置不同时基 Timebase,软件自动计算并修改 ADC 采样周期,实现横向时基缩放;
- 通过 MCP41010 修改放大倍数,实现纵向电压增益缩放;
- 软件自动计算波形最大值、最小值、峰峰值、平均值、频率,并在 TFT 顶部状态栏显示;
- 支持 DC/AC 硬件耦合切换,适配不同测量场景。
- 参数限位与保护
所有电压、频率、占空比、增益均做上下限限制,防止参数越界导致硬件工作异常。
四、原理图与 PCB 设计详细介绍
1. 原理图核心模块说明
- STM32F103C8T6 最小系统
包含 8M 外部晶振、复位电路、3.3V 稳压、启动配置电路,为整个系统提供时钟与主控基础。 - 2.4 寸 TFT 接口电路
采用 7位并行接口方式,连接 STM32 GPIO,包含 RS、CS、WR、控制引脚,支持全屏绘图、字符显示、反白高亮。 - AD9834 外围电路
SPI 通信接口与 STM32 相连,配置 FSYNC、SCLK、DATA 引脚;自带基准电源、输出7阶切比雪夫低通滤波器网络。 - MCP41010 数字电位器电路
SPI 串行通信,构成运算放大器负反馈回路,实现程控增益调节。 - TLP172 耦合切换电路
光耦继电器串联在 ADC 输入前端,单片机 GPIO 控制通断,实现 AC 耦合隔直。 - ADC 采集输入电路
分压限流 + RC 低通滤波 + ESD 保护,抑制高频干扰,保证示波器采样波形平滑。 - 按键电路
上拉输入方式,无需外部消抖电容,软件做按键消抖处理,5 按键独立输入。 - PWM 驱动及直流偏置电路
由 STM32 定时器输出 PWM,经驱动缓冲后对外输出; - 直流源部分实现
提供mcp4725数字电压芯片与STM32提供i2c来控制 - 3V~+3V 可调偏置。




五、软件流程图和关键代码介绍
1. 软件整体流程图

2. 关键代码介绍(仅截取部分,详细在工程文件)
DDS 波形输出核心函数
static void Update_DDS_Hardware(void)
{
// 判断是否为正弦/三角/方波模式
if (dev_params.curr_mode < MODE_SINE_WAVE || dev_params.curr_mode > MODE_SQUARE_WAVE)
return;
// 设置波形类型
if (dev_params.curr_mode == MODE_SINE_WAVE)
AD9834_SetWaveMode(0);
else if (dev_params.curr_mode == MODE_TRIANGLE_WAVE)
AD9834_SetWaveMode(1);
else if (dev_params.curr_mode == MODE_SQUARE_WAVE)
AD9834_SetWaveMode(2);
// 更新频率与增益
AD9834_Set_Freq(FREQ_0, dev_params.freq_val);
AD9834_SetGain(gain_map[dev_params.gain_val-1]);
}
示波器采样率自动配置
static void SetSampleRateByTimebase(float timebase_ms) {
// 根据时基计算目标采样率
float total_time_s = timebase_ms / 1000.0f;
uint32_t target_sps = (uint32_t)(200 / total_time_s);
// 限制采样率范围
if (target_sps < 1000) target_sps = 1000;
if (target_sps > 857000) target_sps = 857000;
// 自动配置ADC采样周期
ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 1, adc_sampling_time);
}
按键处理总函数
void Key_Process(void) {
// ========== 修复按键不灵敏:临时暂停 ADC ==========
ADC_SoftwareStartConvCmd(ADC1, DISABLE);
__NOP();__NOP();
float step = Get_Curr_Step();
typedef struct {
uint8_t osc_adj_mode;
float timebase;
uint8_t timebase_index;
float wave_scale;
uint8_t step_index;
float current_gain;
} OscParam_t;
static OscParam_t osc_backup;
static uint8_t key2_ok = 1, key3_ok = 1, key4_ok = 1, key5_ok = 1;
if (dev_params.curr_mode == MODE_OSCILLOSCOPE &&
(osc_temp_from_mode == MODE_SINE_WAVE || osc_temp_from_mode == MODE_TRIANGLE_WAVE))
{
if (KEY_Scan(1) == KEY_PRESSED) {
LCD_Fill(0,0,LCD_W,LCD_H,WHITE);
OSC_ADC_DMA_Stop();
ADC_SoftwareStartConvCmd(ADC1, DISABLE);
MCP41010_SetResistance(0);
OSC_Set_Gain(1.0f);
osc_adj_mode = osc_backup.osc_adj_mode;
timebase = osc_backup.timebase;
timebase_index = osc_backup.timebase_index;
wave_scale = osc_backup.wave_scale;
step_index = osc_backup.step_index;
current_gain = osc_backup.current_gain;
dev_params.curr_mode = osc_temp_from_mode;
dev_params.curr_adj = ADJ_FREQ;
GPIO_ResetBits(AD9834_SWITCH_PORT, AD9834_SWITCH_PIN);
osc_temp_from_mode = MODE_POWER;
Update_DDS_Hardware();
LCD_Display_All();
delay_ms(15);
key2_ok = key3_ok = key4_ok = key5_ok = 1;
return;
}
if (KEY_Scan(2) == KEY_PRESSED && key2_ok) {
key2_ok = 0;
osc_adj_mode = (osc_adj_mode + 1) % 4; // 4 项
LCD_Display_All();
delay_ms(15);
}
if (KEY_Scan(2) == KEY_RELEASED) key2_ok = 1;
if (KEY_Scan(3) == KEY_PRESSED && key3_ok) {
key3_ok = 0;
if (osc_adj_mode == 0) {
step_index = (step_index + 1) % STEP_COUNT;
} else if (osc_adj_mode == 1) {
timebase_index = (timebase_index + 1) % TIMEBASE_COUNT;
timebase = timebase_steps[timebase_index];
SetSampleRateByTimebase(timebase);
} else if (osc_adj_mode == 3) {
// 切换 DC/AC
osc_couple_mode ^= 1;
TLP172_SetCoupling(osc_couple_mode);
OSC_ADC_DMA_Stop();
ADC_SoftwareStartConvCmd(ADC1, DISABLE);
OSC_ADC_DMA_Init();
SetSampleRateByTimebase(timebase);
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
osc_first_enter = 1;
osc_need_clear = 1;
}
LCD_Display_All();
delay_ms(15);
}
if (KEY_Scan(3) == KEY_RELEASED) key3_ok = 1;
if (KEY_Scan(4) == KEY_PRESSED && key4_ok) {
key4_ok = 0;
if (osc_adj_mode == 0) {
float s = step_values[step_index];
SetGainAndUpdate(current_gain + s);
} else if (osc_adj_mode == 1) {
if (timebase_index < TIMEBASE_COUNT-1) timebase_index++;
timebase = timebase_steps[timebase_index];
SetSampleRateByTimebase(timebase);
} else if (osc_adj_mode == 2) {
wave_scale += scale_step;
if (wave_scale > WAVE_SCALE_MAX) wave_scale = WAVE_SCALE_MAX;
osc_need_clear = 1;
}
LCD_Display_All();
delay_ms(15);
}
if (KEY_Scan(4) == KEY_RELEASED) key4_ok = 1;
if (KEY_Scan(5) == KEY_PRESSED && key5_ok) {
key5_ok = 0;
if (osc_adj_mode == 0) {
float s = step_values[step_index];
SetGainAndUpdate(current_gain - s);
} else if (osc_adj_mode == 1) {
if (timebase_index > 0) timebase_index--;
timebase = timebase_steps[timebase_index];
SetSampleRateByTimebase(timebase);
} else if (osc_adj_mode == 2) {
wave_scale -= scale_step;
if (wave_scale < WAVE_SCALE_MIN) wave_scale = WAVE_SCALE_MIN;
osc_need_clear = 1;
}
LCD_Display_All();
delay_ms(15);
}
if (KEY_Scan(5) == KEY_RELEASED) key5_ok = 1;
return;
}
if (dev_params.curr_mode == MODE_OSCILLOSCOPE && osc_temp_from_mode == MODE_POWER) {
if (KEY_Scan(2) == KEY_PRESSED && key2_ok) {
key2_ok = 0;
osc_adj_mode = (osc_adj_mode + 1) % 4; // 4 项
LCD_Display_All();
delay_ms(15);
}
if (KEY_Scan(2) == KEY_RELEASED) key2_ok = 1;
if (KEY_Scan(3) == KEY_PRESSED && key3_ok) {
key3_ok = 0;
if (osc_adj_mode == 0) {
step_index = (step_index + 1) % STEP_COUNT;
} else if (osc_adj_mode == 1) {
timebase_index = (timebase_index + 1) % TIMEBASE_COUNT;
timebase = timebase_steps[timebase_index];
SetSampleRateByTimebase(timebase);
} else if (osc_adj_mode == 3) {
// 切换 DC/AC
osc_couple_mode ^= 1;
TLP172_SetCoupling(osc_couple_mode);
OSC_ADC_DMA_Stop();
ADC_SoftwareStartConvCmd(ADC1, DISABLE);
OSC_ADC_DMA_Init();
SetSampleRateByTimebase(timebase);
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
osc_first_enter = 1;
osc_need_clear = 1;
}
LCD_Display_All();
delay_ms(15);
}
if (KEY_Scan(3) == KEY_RELEASED) key3_ok = 1;
if (KEY_Scan(4) == KEY_PRESSED && key4_ok) {
key4_ok = 0;
if (osc_adj_mode == 0) {
float s = step_values[step_index];
SetGainAndUpdate(current_gain + s);
} else if (osc_adj_mode == 1) {
if (timebase_index < TIMEBASE_COUNT-1) timebase_index++;
timebase = timebase_steps[timebase_index];
SetSampleRateByTimebase(timebase);
} else if (osc_adj_mode == 2) {
wave_scale += scale_step;
if (wave_scale > WAVE_SCALE_MAX) wave_scale = WAVE_SCALE_MAX;
osc_need_clear = 1;
}
LCD_Display_All();
delay_ms(15);
}
if (KEY_Scan(4) == KEY_RELEASED) key4_ok = 1;
if (KEY_Scan(5) == KEY_PRESSED && key5_ok) {
key5_ok = 0;
if (osc_adj_mode == 0) {
float s = step_values[step_index];
SetGainAndUpdate(current_gain - s);
} else if (osc_adj_mode == 1) {
if (timebase_index > 0) timebase_index--;
timebase = timebase_steps[timebase_index];
SetSampleRateByTimebase(timebase);
} else if (osc_adj_mode == 2) {
wave_scale -= scale_step;
if (wave_scale < WAVE_SCALE_MIN) wave_scale = WAVE_SCALE_MIN;
osc_need_clear = 1;
}
LCD_Display_All();
delay_ms(15);
}
if (KEY_Scan(5) == KEY_RELEASED) key5_ok = 1;
return;
}
if(KEY_Scan(1) == KEY_PRESSED) {
WorkMode old_mode = dev_params.curr_mode;
dev_params.curr_mode = (WorkMode)((dev_params.curr_mode % 6) + 1);
if(old_mode == MODE_OSCILLOSCOPE) {
OSC_ADC_DMA_Stop();
ADC_SoftwareStartConvCmd(ADC1, DISABLE);
}
if(dev_params.curr_mode == MODE_OSCILLOSCOPE) {
OSC_Reset_Default();
OSC_ADC_DMA_Init();
SetSampleRateByTimebase(timebase);
TLP172_SetCoupling(osc_couple_mode);
SetGainAndUpdate(current_gain);
osc_first_enter = 1;
key2_ok = key3_ok = key4_ok = key5_ok = 1;
}
dev_params.curr_adj = Filter_AdjTarget(dev_params.curr_mode, dev_params.curr_adj);
dev_params.step_gear = 0;
Update_DDS_Hardware();
LCD_Display_All();
delay_ms(100);
}
if(KEY_Scan(2) == KEY_PRESSED) {
AdjTarget next_adj;
switch(dev_params.curr_mode) {
case MODE_POWER:
next_adj = ADJ_POWER;
break;
case MODE_SINE_WAVE:
case MODE_TRIANGLE_WAVE:
if (dev_params.curr_adj == ADJ_FREQ) next_adj = ADJ_POWER;
else if (dev_params.curr_adj == ADJ_POWER) {
LCD_Fill(0,0,LCD_W,LCD_H,WHITE);
osc_temp_from_mode = dev_params.curr_mode;
osc_backup.osc_adj_mode = osc_adj_mode;
osc_backup.timebase = timebase;
osc_backup.timebase_index = timebase_index;
osc_backup.wave_scale = wave_scale;
osc_backup.step_index = step_index;
osc_backup.current_gain = current_gain;
dev_params.curr_mode = MODE_OSCILLOSCOPE;
OSC_Reset_Default();
OSC_ADC_DMA_Init();
SetSampleRateByTimebase(timebase);
TLP172_SetCoupling(osc_couple_mode);
SetGainAndUpdate(current_gain);
GPIO_SetBits(AD9834_SWITCH_PORT, AD9834_SWITCH_PIN);
osc_first_enter = 1;
key2_ok = key3_ok = key4_ok = key5_ok = 1;
next_adj = ADJ_NONE;
} else {
next_adj = ADJ_FREQ;
GPIO_ResetBits(AD9834_SWITCH_PORT, AD9834_SWITCH_PIN);
}
break;
case MODE_SQUARE_WAVE:
next_adj = (dev_params.curr_adj == ADJ_FREQ) ? ADJ_POWER : ADJ_FREQ;
break;
case MODE_PWM:
next_adj = (dev_params.curr_adj == ADJ_FREQ) ? ADJ_DUTY : ADJ_FREQ;
break;
default:
next_adj = ADJ_NONE;
break;
}
dev_params.curr_adj = next_adj;
dev_params.step_gear = 0;
LCD_Display_All();
delay_ms(100);
}
if(KEY_Scan(3) == KEY_PRESSED) {
dev_params.step_gear++;
LCD_Display_All();
delay_ms(100);
}
if(KEY_Scan(4) == KEY_PRESSED) {
switch(dev_params.curr_adj) {
case ADJ_POWER:
dev_params.power_val += step;
Power_Update();
break;
case ADJ_FREQ:
dev_params.freq_val += (u32)step;
if(dev_params.curr_mode >= MODE_SINE_WAVE && dev_params.curr_mode <= MODE_SQUARE_WAVE) {
AD9834_Set_Freq(FREQ_0, dev_params.freq_val);
}
if(dev_params.curr_mode == MODE_PWM)
PWM_Update(dev_params.freq_val, dev_params.duty_val);
break;
case ADJ_DUTY:
dev_params.duty_val += step;
if(dev_params.curr_mode == MODE_PWM)
PWM_Update(dev_params.freq_val, dev_params.duty_val);
break;
case ADJ_GAIN:
case ADJ_NONE:
break;
}
Limit_Params();
LCD_Display_All();
delay_ms(100);
}
if(KEY_Scan(5) == KEY_PRESSED) {
switch(dev_params.curr_adj) {
case ADJ_POWER:
dev_params.power_val -= step;
Power_Update();
break;
case ADJ_FREQ:
dev_params.freq_val -= (u32)step;
if(dev_params.curr_mode >= MODE_SINE_WAVE && dev_params.curr_mode <= MODE_SQUARE_WAVE) {
AD9834_Set_Freq(FREQ_0, dev_params.freq_val);
}
if(dev_params.curr_mode == MODE_PWM)
PWM_Update(dev_params.freq_val, dev_params.duty_val);
break;
case ADJ_DUTY:
dev_params.duty_val -= step;
if(dev_params.curr_mode == MODE_PWM)
PWM_Update(dev_params.freq_val, dev_params.duty_val);
break;
case ADJ_GAIN:
case ADJ_NONE:
break;
}
Limit_Params();
LCD_Display_All();
delay_ms(100);
}
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}
六、功能展示及详细说明
1. 2.4 寸 TFT 直流电压源界面
- 屏幕显示当前工作模式、实时电压值;
- 下方绘制 - 3V~+3V 刻度标尺与灰色指示光标;
- 支持 0.1V/0.5V/1V 多档位步进调节;
- 参数高亮显示,2.4 寸大屏观看清晰。

2. 正弦 / 三角 / 方波发生器界面
- TFT 显示波形名称、实时频率、直流偏置电压;
- 屏幕中间自动绘制对应模拟波形;
- 频率 1Hz~1MHz 可调,偏置 - 3V~+3V 可调调用模式1的可调电源,通过开关来确认是否输入。
- 并且正弦波,三角波可通过开关和按键2直接进入示波器显示画面显示波形并通过可调电阻波形调幅度大小。





3. PWM 发生器界面
- 显示 PWM 频率、占空比百分比;
- 屏幕绘制 PWM 高低电平示意波形;
- 频率、占空比独立可调。



4. 2.4 寸 TFT 示波器界面
- 全屏波形显示区域,带边框网格;
- 顶部状态栏:实时电压、最大值、最小值、峰峰值、平均电压、波形频率;
- 右侧显示增益、时基、缩放档位、当前 DC/AC 耦合状态;
- 支持按键:切换增益大小、切换时基快慢、波形放大缩小、一键 DC/AC 切换;
- 通过开关可直接测量本机 DDS 输出波形,也可测量外部电路信号。





七、设计过程遇到的难题及详细解决方法
难题 1:2.4 寸 TFT 刷屏卡顿、波形闪烁
原因:每次全部清屏重绘,刷新量大;主循环同时处理按键、运算、刷屏。
解决:
- 采用局部区域清屏,只刷新变化部分;
- 示波器采用前后帧缓存差分绘制,只擦除旧轨迹、画新轨迹;
- 优化绘图函数,减少重复打点,提升 2.4 寸屏流畅度。
难题 2:ADC 采样干扰大,示波器波形杂乱抖动
原因:数字电路串扰、电源纹波、按键扫描干扰采样。
解决:
- 硬件:ADC 输入增加 RC 滤波、模拟地数字地分离;
- 软件:按键扫描期间临时关闭 ADC 转换,扫描结束再开启;使用 DMA 连续采样,减少 CPU 干预。
八、竞赛心得体会、意见与建议
- 通过本次项目,完整掌握了STM32 外设开发、2.4 寸 TFT 液晶屏绘图、DDS 芯片驱动、ADC+DMA 采样、数字电位器程控、光耦耦合控制等综合嵌入式技能。
- 理解了软硬件协同设计思想:硬件负责基础性能,软件通过算法补偿硬件误差、优化人机界面、实现功能扩展。
- 后续改进方向:升级为触摸屏操作,省去多按键。
附件下载
Gerber_PCB1_多功能仪器.zip
嘉立创PCB
ProPrj_多功能仪器.zip
KiCad pcb
多功能硬件调试仪器.zip
代码
团队介绍
无
评论
0 / 100
查看更多
猜你喜欢
制作FPGA电子琴1. 存储一段音乐,并可以进行音乐播放,
2. 可以自己通过板上的按键进行弹奏,支持两个按键同时按下(和弦)并且声音不能失真,板上的按键只有13个,可以通过有上方的“上“、”下”两个按键对音程进行扩展
john
2657
M-Design设计竞赛 - zigbee调试器该项目使用了ESP32-C6,实现了zigbee调试器的设计,它的主要功能为:在esp32-c6实现了一个串口REPL的功能,根据串口输入指令,可以作为zigbee调试器来调试zigbee设备。
_剑山
1197
基于DDS芯片AD9834的任意频率、相位及调制信号发生器模块针对电赛设计的DDS模块,基于AD9834,通过SP进行配置,板上有75MHz晶振,能够生成最高30MHz的正弦波
硬禾发布
3718
