赞
踩
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;i<slice1;i++){
- dac1_output = 110*(sin( i * 2 * Pi/slice1)+1);
- dacWrite(25, dac1_output);
- }
- }
- }
- }
- void decrease(){
- for(slice1=200;slice1>29;slice1--){
- for(j=0;j<(12000/slice1)-60;j++){
- for(i=0;i<slice1;i++){
- dac1_output = 110*(sin( i * 2 * Pi/slice1)+1);
- dacWrite(25, dac1_output);
- }
- }
- }
- }
以上4个,选一个上传到ESP32,然后在示波器上验证,没有问题后再继续下一步。
STM32代码:
更新一下,加入频率测量。不知道为什么,比相同代码跑在ESP32上来的稳定些。
- #include <Arduino.h>
- #include <U8g2lib.h>
-
- #ifdef U8X8_HAVE_HW_SPI
- #include <SPI.h>
- #endif
- #ifdef U8X8_HAVE_HW_I2C
- #include <Wire.h>
- #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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。