DSO138数字存储示波器 使用说明_Z变换的博客-CSDN博客_dso138示波器https://blog.csdn.net/csdn_rp/article/details/122641040玩具示波器里 DSO138 DSO150 比较出名,还有相应的套件方便制作,价格也低,看起来是爱好者入门首选。可是板上这么多的零件,入门者真的应付得过来?再仔细看参数,200K带宽实在拿不出手,迟早要买专业些的设备。
有没有办法即能玩下“示波器”,又不浪费投资呢?
下面给个思路:
A ESP32(自带DAC) 制作一个波形发生器(下图左上角),不需要其他外围电路。
B 其他任意带有DAC的单片机+显示屏(OLED或TFT),下图是STM32最小板,虽然最近涨价了,也不是太贵。用 ESP8266 ESP32-C3 这些也都可以,不过没找到专门的ADC速度说明,那就用和DSO138一样的STM32来测试。用到零件:
这些都不是焊接,测试完后都可以用到其他实验。
演示视频https://v.youku.com/v_show/id_XNTgyMDkxMDgwOA==.html?spm=a2hbt.13141534.0.13141534
ESP32 代码:
/***** 27kHz 方波 *****/
void setup() {
}
int i;
void loop() {
dacWrite(25, 200);
dacWrite(25, 0);
}
/***** 慢一些的方波,可以调占空比 *****/
void setup() {
}
int i;
void loop() {
dacWrite(25, 200);
for(i=0;i<200;i++){}
dacWrite(25, 0);
for(i=0;i<800;i++){}
}
/***** 正弦波 *****/
float Pi = 3.14; // 圆周率(Pi)是圆的周长与直径的比值,一般用希腊字母 π 表示
int i = 0; // 波形循环变量
int slice1; // 粒度,例如一个周期分割为360度
float dac1_output; // 输出值
void setup() {
slice1 = 520; // slice1=520 50Hz slice1=30 1.67kHz
}
void loop() {
dac1_output = 110*(sin( i * 2 * Pi/slice1)+1); // 角度的大小有两种表示方法,即“角度制”和“弧度制”两种. sin() 默认使用弧度,一个周期为2π 。
dacWrite(25, dac1_output); // GPIO25 GPIO26 为内置 DAC ,其他GPIO 为PWM
i++;
if ( i >= slice1) i = 0;
}
/***** 正弦扫频 *****/
float Pi = 3.14; // 圆周率(Pi)是圆的周长与直径的比值,一般用希腊字母 π 表示
int i = 0; // 波形循环变量
int j = 0;
int slice1; // 粒度,例如一个周期分割为360度 slice1=520 50Hz
float dac1_output; // 输出值
void setup() {}
void loop() {
increase();
decrease();
}
void increase(){
for(slice1=30;slice1<201;slice1++){
for(j=0;j<(12000/slice1)-60;j++){
for(i=0;i29;slice1--){
for(j=0;j<(12000/slice1)-60;j++){
for(i=0;i
以上4个,选一个上传到ESP32,然后在示波器上验证,没有问题后再继续下一步。
STM32代码:
更新一下,加入频率测量。不知道为什么,比相同代码跑在ESP32上来的稳定些。
#include
#include
#ifdef U8X8_HAVE_HW_SPI
#include
#endif
#ifdef U8X8_HAVE_HW_I2C
#include
#endif
//U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ PB6, /* data=*/ PB7, /* reset=*/ U8X8_PIN_NONE); // 0.96' OK, (1.3'错位)
U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE); // 1.3'OK
void setup(void) {
u8g2.begin();
u8g2.enableUTF8Print();
u8g2.setFont(u8g2_font_unifont_t_chinese2);
u8g2.setFontDirection(0);
u8g2.clearBuffer();
u8g2.setCursor(0, 20);
u8g2.print("STM32F103C8T6");
u8g2.setCursor(20, 50);
u8g2.print("你好世界");
u8g2.sendBuffer();
delay(2000);
}
int i;
int j;
float n = 5;
int ch0_tri_a = 0;
int ch0_tri_b = 0;
int ch0_adc[2560]; // 20倍采集 n(0.1~20)
int ch0_wave[128];
float ch0_time[10]; // 触发时间,用于计算频率: micros()微秒计数 / millis()毫秒计数
int freq;
void loop(void) {
ch0_tri_a = analogRead(PA0);
ch0_tri_b = analogRead(PA0);
while (((ch0_tri_a < 1980)and(ch0_tri_b > 2000)) != 1){ch0_tri_a = analogRead(PA0);ch0_tri_b = analogRead(PA0);}
j = 0;
for ( i = 0 ; i < 2560 ; i++){
ch0_adc[i] = analogRead(PA0);
if((ch0_adc[i-1] < 1980)and(ch0_adc[i] > 2000)){
ch0_time[j] = micros();
j++;
if(j>9)j--;
}
if(n>=20) delayMicroseconds(n*10);
}
freq = int(1000000/(ch0_time[2]-ch0_time[1]));
u8g2.clearBuffer();
u8g2.drawFrame(0,0,128,64);
for ( i = 1; i<(127); i++){
ch0_wave[i] = map(ch0_adc[int(n*i)],0,4095,60,8);
u8g2.drawLine((i-1),ch0_wave[i-1],i, ch0_wave[i]);
}
u8g2.setCursor(30,12);u8g2.print("Freq:"); u8g2.print(freq);
u8g2.sendBuffer();
}
ArduinoIDE 给 STM32F103C8T6 编程
这个有很多文章了,比如下面这个,不过实测用 ST-Link v2 简单,稳定。STM32F103C8T6在Arduino IDE里编程前言时代在进步,极客们手上的单片机也从古老的51、PIC变成了AVR、STM32,也出现了各种便捷的开发工具,例如盛极一时的Arduino;不过Atmega328所属的AVR单片机,终究还是老点了,算起来差不多是20年前的主流了,现在流行的是ARM,今天我们就来玩下Arduino与STM32的结合。经过半天的努力,终于可以让Arduino IDE支持我的32小板子了,STM32的芯片性价比...https://blog.csdn.net/bobo184/article/details/84349184