当前位置:   article > 正文

Arduino+STM32F103C8T6 玩具示波器_stm32f103c8t6 示波器

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 代码:                                                     

  1. /***** 27kHz 方波 *****/
  2. void setup() {
  3. }
  4. int i;
  5. void loop() {
  6. dacWrite(25, 200);
  7. dacWrite(25, 0);
  8. }
  1. /***** 慢一些的方波,可以调占空比 *****/
  2. void setup() {
  3. }
  4. int i;
  5. void loop() {
  6. dacWrite(25, 200);
  7. for(i=0;i<200;i++){}
  8. dacWrite(25, 0);
  9. for(i=0;i<800;i++){}
  10. }
  1. /***** 正弦波 *****/
  2. float Pi = 3.14; // 圆周率(Pi)是圆的周长与直径的比值,一般用希腊字母 π 表示
  3. int i = 0; // 波形循环变量
  4. int slice1; // 粒度,例如一个周期分割为360
  5. float dac1_output; // 输出值
  6. void setup() {
  7. slice1 = 520; // slice1=520 50Hz slice1=30 1.67kHz
  8. }
  9. void loop() {
  10. dac1_output = 110*(sin( i * 2 * Pi/slice1)+1); // 角度的大小有两种表示方法,即“角度制”和“弧度制”两种. sin() 默认使用弧度,一个周期为2π 。
  11. dacWrite(25, dac1_output); // GPIO25 GPIO26 为内置 DAC ,其他GPIO 为PWM
  12. i++;
  13. if ( i >= slice1) i = 0;
  14. }
  1. /***** 正弦扫频 *****/
  2. float Pi = 3.14; // 圆周率(Pi)是圆的周长与直径的比值,一般用希腊字母 π 表示
  3. int i = 0; // 波形循环变量
  4. int j = 0;
  5. int slice1; // 粒度,例如一个周期分割为360度 slice1=520 50Hz
  6. float dac1_output; // 输出值
  7. void setup() {}
  8. void loop() {
  9. increase();
  10. decrease();
  11. }
  12. void increase(){
  13. for(slice1=30;slice1<201;slice1++){
  14. for(j=0;j<(12000/slice1)-60;j++){
  15. for(i=0;i<slice1;i++){
  16. dac1_output = 110*(sin( i * 2 * Pi/slice1)+1);
  17. dacWrite(25, dac1_output);
  18. }
  19. }
  20. }
  21. }
  22. void decrease(){
  23. for(slice1=200;slice1>29;slice1--){
  24. for(j=0;j<(12000/slice1)-60;j++){
  25. for(i=0;i<slice1;i++){
  26. dac1_output = 110*(sin( i * 2 * Pi/slice1)+1);
  27. dacWrite(25, dac1_output);
  28. }
  29. }
  30. }
  31. }

 以上4个,选一个上传到ESP32,然后在示波器上验证,没有问题后再继续下一步。

STM32代码:                                                    

更新一下,加入频率测量。不知道为什么,比相同代码跑在ESP32上来的稳定些。

  1. #include <Arduino.h>
  2. #include <U8g2lib.h>
  3. #ifdef U8X8_HAVE_HW_SPI
  4. #include <SPI.h>
  5. #endif
  6. #ifdef U8X8_HAVE_HW_I2C
  7. #include <Wire.h>
  8. #endif
  9. //U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ PB6, /* data=*/ PB7, /* reset=*/ U8X8_PIN_NONE); // 0.96' OK, (1.3'错位)
  10. U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE); // 1.3'OK
  11. void setup(void) {
  12. u8g2.begin();
  13. u8g2.enableUTF8Print();
  14. u8g2.setFont(u8g2_font_unifont_t_chinese2);
  15. u8g2.setFontDirection(0);
  16. u8g2.clearBuffer();
  17. u8g2.setCursor(0, 20);
  18. u8g2.print("STM32F103C8T6");
  19. u8g2.setCursor(20, 50);
  20. u8g2.print("你好世界");
  21. u8g2.sendBuffer();
  22. delay(2000);
  23. }
  24. int i;
  25. int j;
  26. float n = 5;
  27. int ch0_tri_a = 0;
  28. int ch0_tri_b = 0;
  29. int ch0_adc[2560]; // 20倍采集 n(0.1~20)
  30. int ch0_wave[128];
  31. float ch0_time[10]; // 触发时间,用于计算频率: micros()微秒计数 / millis()毫秒计数
  32. int freq;
  33. void loop(void) {
  34. ch0_tri_a = analogRead(PA0);
  35. ch0_tri_b = analogRead(PA0);
  36. while (((ch0_tri_a < 1980)and(ch0_tri_b > 2000)) != 1){ch0_tri_a = analogRead(PA0);ch0_tri_b = analogRead(PA0);}
  37. j = 0;
  38. for ( i = 0 ; i < 2560 ; i++){
  39. ch0_adc[i] = analogRead(PA0);
  40. if((ch0_adc[i-1] < 1980)and(ch0_adc[i] > 2000)){
  41. ch0_time[j] = micros();
  42. j++;
  43. if(j>9)j--;
  44. }
  45. if(n>=20) delayMicroseconds(n*10);
  46. }
  47. freq = int(1000000/(ch0_time[2]-ch0_time[1]));
  48. u8g2.clearBuffer();
  49. u8g2.drawFrame(0,0,128,64);
  50. for ( i = 1; i<(127); i++){
  51. ch0_wave[i] = map(ch0_adc[int(n*i)],0,4095,60,8);
  52. u8g2.drawLine((i-1),ch0_wave[i-1],i, ch0_wave[i]);
  53. }
  54. u8g2.setCursor(30,12);u8g2.print("Freq:"); u8g2.print(freq);
  55. u8g2.sendBuffer();
  56. }

  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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/718175
推荐阅读
相关标签
  

闽ICP备14008679号