久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 12139|回復: 16
打印 上一主題 下一主題
收起左側

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

  [復制鏈接]
跳轉到指定樓層
樓主
示波器開源啦,軟件部分已OK,下次完成硬件部分。代碼請下載附件。


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, 下載次數: 240, 下載積分: 黑幣 -5

示波器代碼

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏10 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
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 | 只看該作者
等硬件
回復

使用道具 舉報

5#
ID:53978 發表于 2019-8-15 11:40 | 只看該作者
現在這個能diy了嗎?
回復

使用道具 舉報

6#
ID:275826 發表于 2019-9-8 21:44 | 只看該作者
為什么下載后出現白屏?
回復

使用道具 舉報

7#
ID:695424 發表于 2020-2-20 07:46 | 只看該作者
期待硬件
回復

使用道具 舉報

8#
ID:59884 發表于 2020-3-1 07:57 | 只看該作者
有空做來試試,謝謝樓主分享!
回復

使用道具 舉報

9#
ID:230374 發表于 2020-4-9 11:44 | 只看該作者
謝謝樓主分享,已經測試完成,等待硬件
回復

使用道具 舉報

10#
ID:312642 發表于 2020-4-19 20:09 | 只看該作者
dongfang08 發表于 2020-4-9 11:44
謝謝樓主分享,已經測試完成,等待硬件

兄弟做的怎么樣了,我也想做呢
回復

使用道具 舉報

11#
ID:585455 發表于 2020-9-29 19:02 | 只看該作者
可以跑,非常好,測試很順利。
回復

使用道具 舉報

12#
ID:163044 發表于 2022-1-6 13:45 | 只看該作者
已經測試完成,等待硬件
回復

使用道具 舉報

13#
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

^
回復

使用道具 舉報

14#
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 ...

已解決
回復

使用道具 舉報

15#
ID:158588 發表于 2022-4-19 20:17 | 只看該作者
請問寬帶有多少?硬件的部分能提供嗎?
回復

使用道具 舉報

16#
ID:158588 發表于 2022-4-23 19:59 | 只看該作者
請問硬件部分有后續嗎?寬帶與速度是多少?謝
回復

使用道具 舉報

17#
ID:138707 發表于 2023-7-29 18:26 | 只看該作者
有空做來試試,謝謝樓主分享!
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品一区二区三区不卡 | www久久久 | 伊人网在线播放 | 日韩午夜在线播放 | 久久成人一区二区三区 | 一级做a爰片久久毛片 | 日韩三级免费观看 | 99爱在线观看 | 人人干人人艹 | 伊人在线 | 日韩一区二区在线免费观看 | 国产免费a视频 | 成人精品在线观看 | 日韩av在线一区二区三区 | 中文字幕日韩av | 91在线视频网址 | 亚洲一区三区在线观看 | 亚洲激情在线视频 | 丁香五月网久久综合 | 欧美精品一区二区三区四区 | 日韩高清一区二区 | 奇米超碰 | 麻豆久久久9性大片 | 91五月婷蜜桃综合 | 高清成人免费视频 | 欧美色图综合网 | 亚洲国产一区在线 | 99久久夜色精品国产亚洲96 | 中文字幕一区在线观看视频 | 噜久寡妇噜噜久久寡妇 | 亚洲欧美视频一区 | 久久久精品视频一区二区三区 | 久久久久www | 国产精品.xx视频.xxtv | 欧美日韩亚洲国产 | 国产精品精品视频一区二区三区 | 91精品福利 | 亚洲另类视频 | 日韩欧美不卡 | 国产伦精品一区二区三区精品视频 | 午夜视频一区二区 |