Arduino+STM32F103C8T6 玩具示波器

 

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来测试。用到零件:

  1.         ST-Link v2
  2.         STM32F103C8T6 最小版
  3.         0.96‘ OLED 或 1.3’ OLED

这些都不是焊接,测试完后都可以用到其他实验。        

演示视频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

  • 1
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
从来没有分享过什么东西,只是因为自己的实力太差,也不懂得怎么去学习! 很早之前搞得这个东西,搁置了两年了,这个是自己在大二上学期的时候做的东西,第一次接触STM32,什么都不懂。并且那个时候原子哥的教程还停留在《不完全手册的2.0》版本,也没有看到过任何有关的视频教程,对于我这种比较笨的人来讲,学起来是非常困难的。 但是呢,一个突然的想法在我脑袋里诞生了,就想搞一个“带触摸的便携式的小型示波器”,就这样,一旦有了想法,就无法控制,疯狂的找资料,(据说认真的男生是最帅的,哈哈,抱着这个想法,成功抱得美人归了!!题外话,勿喷,不要嫉妒哦!)就这样,触摸屏示波器项目开始运作了! 我得吐槽一下,我的无知与愚蠢的大脑了。相信,看到j-link你们一定知道它是在线仿真调试的吧!但是呢,愚蠢的我竟然不知道!根据我对51单片机的理解,不存在硬件仿真这个概念,我竟然只用J-link做下载的工具来用。所有的代码调试只能靠自己不行的烧写,烧写,测试,烧写,浑然不知什么叫仿真,什么叫断点,什么叫单步。好吧,自己写到这里,都感觉当时的自己真是个傻逼。这个项目写下来,浪费了我多少宝贵的青春,和女朋友一起逛街,一起快乐的时间,全被我的无知给消耗掉了。直到这个项目基本完成,给人家看的时候,人家问我一句怎么不用在线仿真,我瞬间凌乱了,什么是在线仿真。虽然我不知道什么叫在线仿真,我却比较装逼的给人家搪塞过去了,美其名曰,不用仿真可以锻炼大脑。等人家走了,我马上问度娘,哎呦我去,我真是个傻逼,此时我已明白,我是有多么的天真无邪加烂漫! 本示波器的设计要感谢原子哥的平台,原子哥的教程,还有开源的minidso。本示波器,由于自己第一次写程序,第一次用STM32,没有用仿真,代码风格没有,(乱),完全就是拙作,但是功能已实现!外接电路可以正常使用,大家可以用信号发生器测试,需要直流偏移。 程序中难免有各种bug,且为未完成版本,大家有力尽管吐槽,有想要完善的可以完善! 功能如下(有些功能只有框架,没有完全完成!): 1触摸 2波形显示 3频率等测量 4移动游标 5波形移动 6触发电平调节 7截屏,等! 源码部分展示: 具体教程参见原子哥的《不完全手册》,先将MINISTM32的开发综合实验下载到MINISTM32开发板上,目的,更新字库!然后再下载本程序!方可使用!液晶部分代码,需要大家根据自己的液晶屏型号自行修改! 带触摸的便携式的STM32小型示波器实物图展示:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值