Arduino+STM32F103C8T6 玩具示波器

 Arduino+STM32F103C8T6 玩具示波器_第1张图片

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

Arduino+STM32F103C8T6 玩具示波器_第2张图片

Arduino+STM32F103C8T6 玩具示波器_第3张图片

 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

你可能感兴趣的:(笔记,stm32,单片机,嵌入式硬件)