找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10955|回复: 16
收起左侧

Arduino 2.4寸TFT彩屏示波器开源啦

  [复制链接]
ID:349565 发表于 2019-3-17 17:24 | 显示全部楼层 |阅读模式
示波器开源啦,软件部分已OK,下次完成硬件部分。代码请下载附件。
IMG_20190317_171109.jpg

Arduino示波器源程序如下:
  1. //################################################
  2. // Arduino TFT示波器
  3. //--------POWER Pins-----------------------
  4. //   5V  connects to DC 5V
  5. //   GND connects to Ground
  6. //   3V3 do not need to connect(NC)
  7. //--------LCD Display Pins-----------------
  8. //   LCD_RD   connects to Analog pin A0  
  9. //   LCD_WR   connects to Analog pin A1  
  10. //   LCD_RS   connects to Analog pin A2  
  11. //   LCD_CS   connects to Analog pin A3  
  12. //   LCD_RST  connects to Analog pin A4  
  13. //   LCD_D0   connects to digital pin 8  
  14. //   LCD_D1   connects to digital pin 9  
  15. //   LCD_D2   connects to digital pin 2
  16. //   LCD_D3   connects to digital pin 3
  17. //   LCD_D4   connects to digital pin 4
  18. //   LCD_D5   connects to digital pin 5
  19. //   LCD_D6   connects to digital pin 6
  20. //   LCD_D7   connects to digital pin 7
  21. //-------SD-card fuction Pins --------------
  22. //This Connection Only for UNO
  23. //SD_SS    connects to digital pin 10
  24. //SD_DI    connects to digital pin 11
  25. //SD_DO    connects to digital pin 12
  26. //SD_SCK   connects to digital pin 13
  27. //############################################

  28. #include <Adafruit_GFX.h>
  29. #include <MCUFRIEND_kbv.h>

  30. MCUFRIEND_kbv tft;
  31. //十六进制颜色
  32. #define     BLACK   0x0000
  33. #define     BLUE    0x001F
  34. #define     RED     0xF800
  35. #define     GREEN   0x07E0
  36. #define CYAN    0x07FF
  37. #define MAGENTA 0xF81F
  38. #define YELLOW  0xFFE0
  39. #define WHITE   0xFFFF
  40. //RGB颜色
  41. #define RGB(r,g,b) (((r&0xF8)<<8)|((g&0xFC)<<3)|(b>>3))
  42. #define GREY      RGB(127, 127, 127)
  43. #define DARKGREY  RGB(64, 64, 64)
  44. #define TURQUOISE RGB(0, 128, 128)
  45. #define PINK      RGB(255, 128, 192)
  46. #define OLIVE     RGB(128, 128, 0)
  47. #define PURPLE    RGB(128, 0, 128)
  48. #define AZURE     RGB(0, 128, 255)
  49. #define ORANGE    RGB(255,128,64)

  50. #define SAMPLE_X      370
  51. #define MAX_X         240       //点显采样点数
  52. #define DEV_WD        20        //每格20个象素
  53. #define view_x        275       //参数显示x座标
  54. #define voltage       4.73      //参考电压

  55. int input_ch1=A5;  //A5
  56. int buf_ch1[SAMPLE_X];//通道1采样
  57. int buf_x[MAX_X];  //通道1座标
  58. float Div_Y,V_min,V_max,V_mid,Vpp,V_rms;
  59. int i,i1,i2,i3,Div_X,cycle,high,duty,freq;
  60. unsigned long t,total;
  61. int adc_mode[]={4,8,16,32,64,128};
  62. int adc=2;  //adc采样模式(4,8,16,32,64,128)
  63. int hold=1;
  64. String kHz=" ";                //KHz,MHz,Hz
  65. int us,count;
  66. int mode=1;
  67. int attenuation=10;           //衰减模式
  68. //-------------------------------------------

  69. void setup(){
  70.   setADC_ch(input_ch1);

  71.   tft.reset();
  72.   uint16_t identifier = tft.readID();
  73.   tft.begin(identifier);
  74.   tft.fillScreen(BLACK);
  75.   tft.setRotation(1);
  76.   //标题栏
  77.   tft.fillRect(0, 0, 320, 19,BLUE);
  78.   drawText(10,6,"Arduino Digital osc v1.0");
  79.   //底部状态栏
  80.   tft.fillRect(0, 222, 320, 222,BLUE);
  81.   //参数框
  82.   tft.drawRect(242, 20, 78, 200, GREY);
  83.   
  84.   tft.setTextColor(BLUE);
  85.   drawText(245,24,"CH1 A5");
  86.   tft.setTextColor(RED);
  87.   drawText(245,34,"Xdiv:");
  88.   drawText(306,34,"us");  //单位
  89.   drawText(245,44,"Ydiv:");
  90.   drawText(306,44,"v");  //单位
  91.   drawText(245,54," max:");
  92.   drawText(306,54,"v");  //单位
  93.   drawText(245,64," min:");
  94.   drawText(306,64,"v");  //单位
  95.   drawText(245,74," mid:");
  96.   drawText(306,74,"v");  //单位
  97.   drawText(245,84," vpp:");
  98.   drawText(306,84,"v");  //单位
  99.   drawText(245,94,"freq:");
  100.   drawText(306,94,"Hz");  //频率单位
  101.   drawText(245,104,"duty:");
  102.   drawText(306,104,"%");  //占空比百分号
  103.   drawText(245,124,"ADC mode:");
  104.   drawText(245,155,"delay us:");
  105.   
  106.   pinMode(input_ch1,INPUT);
  107.   
  108. }

  109. void drawText(int16_t x, int16_t y, String text){
  110.   tft.setCursor(x, y);
  111.   tft.println(text);
  112. }

  113. void drawText(int16_t x, int16_t y, double text){
  114.   tft.setCursor(x, y);
  115.   tft.println(text);
  116. }

  117. void drawText(int16_t x, int16_t y, int text){
  118.   tft.setCursor(x, y);
  119.   tft.println(text);
  120. }
  121.    
  122. void loop(){
  123.   while(1){
  124.     sample();        //采样  
  125.     draw_cls();      //清除上一次的波形
  126.     draw_Grid();     //画网格
  127.     measure();       //测量参数并显示波形
  128.     draw(WHITE);     //显示参数
  129.   }
  130. }

  131. //ADC分频,采样速率
  132. void setP(int key) {
  133.   switch (key){
  134.     case 4://ADC Prescaler = 4
  135.       //理论 Sample Rate可达16MHz/4/13=307.6KHz
  136.       ADCSRA = _BV(ADPS1);break;
  137.     case 8://ADC Prescaler = 8
  138.       //理论Sample Rate可达16MHz/8/13=153.8KHz,实测93.5KH
  139.       ADCSRA = _BV(ADPS0)|_BV(ADPS1);break;
  140.     case 16://ADC Prescaler = 16
  141.       //理论 Sample Rate 可达16MHz/16/13=76.8KHz
  142.       ADCSRA = _BV(ADPS2);break;
  143.     case 32://ADC Prescaler = 32
  144.       //理论 Sample Rate 可达16MHz/32/13= 38.4KHz
  145.       ADCSRA = _BV(ADPS2)|_BV(ADPS0);break;
  146.     case 64://ADC Prescaler = 64
  147.       //理论 Sample Rate 可达16MHz/64/13= 19.2KHz
  148.       ADCSRA = _BV(ADPS2)|_BV(ADPS1);break;
  149.     case 128://ADC Prescaler = 128
  150.       //理论 Sample Rate 可达16MHz/128/13=9600Hz
  151.       ADCSRA = _BV(ADPS2)|_BV(ADPS1)|_BV(ADPS0);break;
  152.     default:
  153.       break;
  154.   }
  155.   ADCSRA |= _BV(ADEN);//|_BV(ADATE)|_BV(ADSC);
  156. }

  157. //ADC采样通道
  158. void setADC_ch(uint16_t pin){
  159.   switch(pin){
  160.     case A0: //A0
  161.       ADMUX =_BV(REFS0);break;
  162.     case A1: //A1
  163.       ADMUX =_BV(REFS0)|_BV(MUX0);break;
  164.     case A2: //A2
  165.       ADMUX =_BV(REFS0)|_BV(MUX1);break;
  166.     case A3: //A3
  167.       ADMUX =_BV(REFS0)|_BV(MUX0)|_BV(MUX1);break;
  168.     case A4: //A4
  169.       ADMUX =_BV(REFS0)|_BV(MUX2);break;
  170.     case A5: //A5 _BV(REFS1)|
  171.       ADMUX =_BV(REFS0)|_BV(MUX0)|_BV(MUX2);break;
  172.     case A6: //A6
  173.       ADMUX =_BV(REFS0)|_BV(MUX1)|_BV(MUX2);break;
  174.     case A7: //A7
  175.       ADMUX=_BV(REFS0)|_BV(MUX0)|_BV(MUX1)|_BV(MUX2);
  176.       break;
  177.     default:
  178.       break;
  179.   }
  180.   
  181. }

  182. //获取ADC采样值
  183. unsigned int readADC(){
  184.   bitClear(ADCSRA, ADIF);
  185.   ADCSRA |= _BV(ADSC);
  186.   loop_until_bit_is_set(ADCSRA, ADIF);
  187.   return ADC;
  188. }

  189. //采样
  190. void sample(){
  191.   setP(adc_mode[adc]); //采样分频模式
  192.   t = micros();        //CH1采样开始时间
  193.   //CH1 ADC采样
  194.   for (i=0;i<SAMPLE_X;i++){
  195.     buf_ch1[i]=readADC();
  196.     //采样延时
  197.     if(count>0){delayMicroseconds(count);}
  198.   }
  199.   t = (micros()-t)/SAMPLE_X; //采样一次平均耗时
  200. }

  201. //计算参数
  202. void measure(){
  203.   V_max = buf_ch1[0];V_min = buf_ch1[0];
  204.   for (i = 1; i < MAX_X; i++){
  205.     V_max = ((V_max<buf_ch1[i])?buf_ch1[i]:V_max);
  206.     V_min = ((V_min>buf_ch1[i])?buf_ch1[i]:V_min);
  207.   }
  208.   Div_X = t*DEV_WD;        //x轴每格多少us
  209.   Div_Y = voltage/5;       //Y轴每格多少mv
  210.   V_mid = (V_max+V_min)/2; //平均值
  211.   Vpp   = (V_max-V_min);   //峰峰值
  212.   
  213.   if(Vpp-V_mid>35){ //方波
  214.     //周期开始点
  215.     for (i=1; i<MAX_X;i++){
  216.       if(buf_ch1[i]<V_mid&&buf_ch1[i+1]>V_mid)
  217.         {i1=i;break;}
  218.       }
  219.     for(i=i1+1;i<MAX_X;i++){
  220.       //周期内高电平结束点
  221.       if(buf_ch1[i]>V_mid&&buf_ch1[i+1]<V_mid){i2=i;}
  222.       //周期结束点
  223.       if(buf_ch1[i]<V_mid&&buf_ch1[i+1]>V_mid)
  224.         {i3=i;break;}
  225.     }
  226.    
  227.     int a=1;
  228.     for (i = i1; i < SAMPLE_X; i++){
  229.       if(a<MAX_X){
  230.         buf_x[a]=map(buf_ch1[i],0,1023,120,20);
  231.         a++;
  232.       }else{break;}
  233.     }
  234.    
  235.     cycle=i3-i1;  //周期时间=周期结速点-周期开始点
  236.     high =i2-i1;  //高电平时间=高电平结束时间-周期开始点
  237.     duty =high*100/cycle; //占空比=高电平时间/周期时间
  238.     freq =1000000/cycle/t; //频率
  239.    
  240.     if(freq<0){freq=0;}
  241.     //set_delay(); //自动模式
  242.   }else{
  243.     freq=0;duty=0;
  244.     for (i = 1; i < SAMPLE_X; i++){
  245.       if(i<MAX_X){
  246.         buf_x[i]=map(buf_ch1[i],0,1023,120,20);
  247.       }
  248.     }
  249.   }

  250.   if(freq>=1000000){freq=freq/1000000;kHz="m";}
  251.   else{kHz=" ";}
  252.   
  253. }

  254. //自动计算采样延时
  255. void set_delay(){
  256.   if(high>DEV_WD){
  257.     us=(high-DEV_WD)*t/MAX_X;
  258.     count=us;
  259.   }else if(high<DEV_WD){
  260.     us=(DEV_WD-high)*t/MAX_X;
  261.     count-=us;
  262.     if(count<0){count=0;}
  263.   }
  264. }

  265. //显示
  266. void draw(uint16_t Color){
  267.   for (i =1;i<MAX_X-1;i++) {
  268.     tft.drawLine(i,buf_x[i],i,buf_x[i+1],WHITE);
  269.   }
  270.   float v=voltage/1023;
  271.   tft.setTextColor(Color);
  272.   drawText(view_x,34,Div_X);     //X轴us每格
  273.   drawText(view_x,44,Div_Y);     //Y轴mv每格
  274.   drawText(view_x,54,V_max*v); //最大值
  275.   drawText(view_x,64,V_min*v); //最小值
  276.   drawText(view_x,74,V_mid*v); //平均值
  277.   drawText(view_x,84,Vpp*v);   //落差值
  278.   drawText(view_x,94,freq);    //频率
  279.   drawText(300,94,kHz);        //Hz,KHz,MHz
  280.   drawText(view_x,104,duty);   //占空比
  281.   
  282.   drawText(272,138,adc_mode[adc]);  //adc采样分频模式
  283.   drawText(272,170,count);     //采样延时us
  284.   
  285. }

  286. //清除波形
  287. void draw_cls(){
  288.   for (i=1;i<MAX_X-1;i++){
  289.     tft.drawLine(i,buf_x[i],i,buf_x[i+1],BLACK);
  290.     buf_x[i]=120;
  291.   }
  292.   //清除显示的参数
  293.   tft.fillRect(274, 32, 30, 80, DARKGREY);
  294.   tft.fillRect(260, 134, 40, 16, DARKGREY);
  295.   tft.fillRect(260, 165, 40, 16, DARKGREY);
  296. }

  297. //座标轴及刻度
  298. void draw_Grid(){
  299.   for (int i=0; i<=MAX_X; i+=DEV_WD){
  300.     //Y轴
  301.     tft.drawLine(i,20,i,220,DARKGREY);
  302.     //X轴
  303.     if(i<=220){
  304.    tft.drawLine(1,i+DEV_WD,MAX_X-1,i+DEV_WD,DARKGREY);}
  305.     }
  306.   //Y轴
  307.   tft.drawLine(120, 20, 120, 219,RED);
  308.   //X轴
  309.   tft.drawLine(0, 120, MAX_X, 120,RED);
  310. };
复制代码



TFT_view.zip

3.24 KB, 下载次数: 233, 下载积分: 黑币 -5

示波器代码

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:349565 发表于 2019-3-17 17:29 | 显示全部楼层
下次完成前级衰减放大,按键调整,HOLD等功能

评分

参与人数 1黑币 +40 收起 理由
admin + 40 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:53978 发表于 2019-6-15 21:04 | 显示全部楼层
感谢分享 收藏先
回复

使用道具 举报

ID:560595 发表于 2019-6-19 15:54 | 显示全部楼层
等硬件
回复

使用道具 举报

ID:53978 发表于 2019-8-15 11:40 | 显示全部楼层
现在这个能diy了吗?
回复

使用道具 举报

ID:275826 发表于 2019-9-8 21:44 | 显示全部楼层
为什么下载后出现白屏?
回复

使用道具 举报

ID:695424 发表于 2020-2-20 07:46 | 显示全部楼层
期待硬件
回复

使用道具 举报

ID:59884 发表于 2020-3-1 07:57 | 显示全部楼层
有空做来试试,谢谢楼主分享!
回复

使用道具 举报

ID:230374 发表于 2020-4-9 11:44 | 显示全部楼层
谢谢楼主分享,已经测试完成,等待硬件
回复

使用道具 举报

ID:312642 发表于 2020-4-19 20:09 | 显示全部楼层
dongfang08 发表于 2020-4-9 11:44
谢谢楼主分享,已经测试完成,等待硬件

兄弟做的怎么样了,我也想做呢
回复

使用道具 举报

ID:585455 发表于 2020-9-29 19:02 | 显示全部楼层
可以跑,非常好,測試很順利。
回复

使用道具 举报

ID:163044 发表于 2022-1-6 13:45 | 显示全部楼层
已经测试完成,等待硬件
回复

使用道具 举报

ID:1001294 发表于 2022-1-14 09:43 | 显示全部楼层
求助!

C:\Users\Administrator\Documents\Arduino\libraries\MCUFRIEND_kbv/MCUFRIEND_kbv.h:51:0: error: unterminated argument list invoking macro "F"

#endif

^
回复

使用道具 举报

ID:1001294 发表于 2022-1-14 13:08 | 显示全部楼层
arduino0630 发表于 2022-1-14 09:43
求助!

C:\Users\Administrator\Documents\Arduino\libraries\MCUFRIEND_kbv/MCUFRIEND_kbv.h:51:0: err ...

已解决
回复

使用道具 举报

ID:158588 发表于 2022-4-19 20:17 | 显示全部楼层
请问宽带有多少?硬件的部分能提供吗?
回复

使用道具 举报

ID:158588 发表于 2022-4-23 19:59 | 显示全部楼层
请问硬件部分有后续吗?宽带与速度是多少?谢
回复

使用道具 举报

ID:138707 发表于 2023-7-29 18:26 | 显示全部楼层
有空做来试试,谢谢楼主分享!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表