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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

Arduino r3驅動廢棄電子產品的LCD128*64顯示屏制作示波器

  [復制鏈接]
跳轉到指定樓層
樓主
ID:349565 發表于 2019-2-27 22:03 來自手機 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
這個diy的示波器彩樣頻率大概1M左右,可以顯示峰值電壓,幅值電壓,頻率!占空比。后續功能再添加。

IMG_20190227_145258.jpg (708.09 KB, 下載次數: 142)

IMG_20190227_145258.jpg

IMG_20190222_094415.jpg (678 KB, 下載次數: 131)

IMG_20190222_094415.jpg

評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:349565 發表于 2019-2-27 22:04 來自手機 | 只看該作者
想上傳代碼附件不知道怎么上傳
回復

使用道具 舉報

板凳
ID:1 發表于 2019-2-28 02:17 | 只看該作者
先把附件壓縮成rar格式,這里有上傳教程http://www.zg4o1577.cn/bbs/dpj-49501-1.html
回復

使用道具 舉報

地板
ID:349565 發表于 2019-3-2 11:30 | 只看該作者
現在可以提供下載了
  1. /*
  2. 廢棄的顯示屏示波器
  3. */

  4. #include <Arduino.h>
  5. #include <U8g2lib.h>
  6. #include <EEPROM.h>

  7. #ifdef U8X8_HAVE_HW_SPI
  8. #include <SPI.h>
  9. #endif

  10. U8G2_ST7565_EA_DOGM128_F_4W_SW_SPI u8g2(U8G2_R0,/*clock=*/5,/*data=*/4,/*cs=*/8,/*dc=*/6,/*reset=*/7);

  11. int input     =A0;      //采集信號輸入口
  12. int Key_hold  =12;      //hold顯示
  13. int Key_mode  =13;      //延時選擇
  14. int dis_width =128;     //顯示屏寬度
  15. int dis_hight =64;      //顯示屏高度
  16. int x;                  //繪點座標
  17. int Buffer[128];        //緩存值儲存數組
  18. long Freq;              //頻率
  19. float Vp_p,Vpp;         //實際電壓,峰值電壓
  20. int Dr;                 //占空比
  21. int t,i1,i2,i3,V_min,V_max,V_mid,hold=0;
  22. float a,b;
  23. int mode=0;
  24. int adc_n=4;
  25. int dTime=1;

  26. //產生62.5K方波
  27. void pwm_62_5k()
  28. {
  29.   cli(); //禁止中斷
  30.   pinMode(9, OUTPUT);
  31.   pinMode(10, OUTPUT);
  32.   //設置timer1快速pwm,頻率62.5kHz,D9 = OCR1A; D10 = OCR1B
  33.   TCCR1A = 0;
  34.   TCCR1B = 0;
  35.   //比較匹配時清零 OC1A/OC1B
  36.   TCCR1A |= _BV(COM1A1) | _BV(COM1B1);
  37.   //配置8位快速PWM, TOP = 0xFF
  38.   TCCR1A |= _BV(WGM10);
  39.   TCCR1B |= _BV(WGM12);
  40.   //時鐘無分頻,輸出頻率: 16 MHz/1/256= 62500Hz
  41.   TCCR1B |= _BV(CS10);
  42.   OCR1A = 127;    // 占空比127/255=50%
  43.   OCR1B = 25.5;   // 占空比25.5/255=10%
  44.   sei(); //允許中斷
  45. }

  46. void setup(void) {
  47.   Serial.begin(115200);
  48.   u8g2.begin();
  49.   pinMode(input,INPUT);          //A0要接20K下拉電阻到地
  50.   pinMode(Key_hold,INPUT_PULLUP);//接1K下拉電阻低電平觸發
  51.   pinMode(Key_mode,INPUT_PULLUP); //采樣模式和速率選擇
  52.   u8g2.setFont(u8g2_font_blipfest_07_tr);
  53.   u8g2.setFontDirection(0);
  54.   u8g2.setContrast(180);         //設置屏幕對比度0-255
  55.   pwm_62_5k();
  56.   set_adc(16);                    //ADC 16分頻模式采樣
  57.   pinMode(11,OUTPUT);
  58.   analogWrite(11,127);
  59. }

  60. void loop(void) {
  61.   sample();          //ADC采樣
  62.   Measure();         //測量參數
  63.   Transform();       //計算坐標
  64.   u8g2.firstPage();  //清屏
  65.   if (hold==0){      //凍結顯示
  66.     do{draw();}
  67.     while (u8g2.nextPage());
  68.   }
  69.   san_key();
  70. }

  71. //寄時器中斷處理A0-A5
  72. ISR(PCINT1_vect){
  73.   /*ADC中斷
  74.   放在setup內
  75.   PCMSK1 |= bit (PCINT8); //PCINT8關聯A0中斷
  76.   PCIFR |= bit (PCIF1);
  77.   PCICR |= bit (PCIE1);
  78.   */
  79. }

  80. //使用寄時器ADC采樣,analogRead(pin)函數的采樣速率太慢
  81. void sample(){
  82.     ADCSRA |= _BV(ADSC);          //第一次讀數不準
  83.   for(x = 0;x < dis_width;x++){
  84.     ADCSRA |= _BV(ADSC);
  85.     loop_until_bit_is_set(ADCSRA, ADIF);
  86.     Buffer[x] = ADC;
  87.     bitClear(ADCSRA, ADIF);
  88.     //暫停x微秒
  89.     //delayMicroseconds(dTime);
  90.   }
  91. }

  92. //測量參數
  93. void Measure(){
  94.   V_max=Buffer[0];//取最大值
  95.   V_min=Buffer[0];//取最小值
  96.   for(x=0;x<dis_width;x++){
  97.     if(Buffer[x]>V_max)
  98.     V_max=Buffer[x];
  99.     if(Buffer[x]<V_min)
  100.     V_min=Buffer[x];
  101.   }
  102.   //平均值=(最大值+最小值)/2
  103.   V_mid=(V_max+V_min)/2;
  104.   //振幅電壓=(最大值+最小值)/2*基準電壓/1023
  105.   Vp_p=(V_max+V_min)/2*4.99/1023;
  106.   //峰值電壓=(最大值-最小值)*基準電壓/1023
  107.   Vpp=(V_max-V_min)*4.99/1023;
  108.   for(x=0;x<dis_width-2;x++){
  109.     //周期開始點
  110.     if(Buffer[x]<V_mid&&Buffer[x+1]>=V_mid)
  111.     {i1=x;break;}
  112.   }
  113.   for(x=i1+1;x<dis_width-2+i1;x++){
  114.     //周期內高電平結束點
  115.     if(Buffer[x]>V_mid&&Buffer[x+1]<=V_mid)
  116.     {i3=x;}
  117.     //周期結束點
  118.     if(Buffer[x]<V_mid&&Buffer[x+1]>=V_mid)
  119.     {i2=x;break;}
  120.   }
  121.   //周期時間=周期結速點-周期開始點
  122.   t=i2-i1;
  123.   //高電平時間=高電平結束時間-周期開始點
  124.   a=(i3-i1);
  125.   //占空比=高電平時間/周期時間(高電平時間+低電平時間)
  126.   Dr=a/t*100;
  127.   //頻率=1000000/周期時間(高電平時間+低電平時間)
  128.   if(t>1){
  129.     if(adc_n<=16){
  130.        Freq=16000000/adc_n/t;  //16分頻模式
  131.     }else if(adc_n>16){
  132.        Freq=16000000/255/adc_n;//非16分頻模式
  133.     }
  134.   }else{
  135.     Freq=0;
  136.   }
  137.   if(mode==0){
  138.     //自動選擇采樣速率以適應高頻低頻信號
  139.     if(t>30||t<10){
  140.       adc_n=adc_n*2;
  141.       if(adc_n>128){adc_n=4;}
  142.       set_adc(adc_n);
  143.     }
  144.   }
  145. }

  146. //計算座標
  147. void Transform(){
  148.   for(x = 0;x < dis_width;x++){
  149.     //使用map函數將0-1023的模擬值映射為7~62之間的坐標值
  150.     Buffer[x] = map(Buffer[x],0,1023,55,7);  
  151.   }
  152. }
  153.    
  154. //顯示
  155. void draw(){
  156.   int dis_h=dis_hight/2;
  157.   //顯示電壓峰值
  158.   u8g2.drawStr(6,7, "V:");
  159.   u8g2.setCursor(13, 7);
  160.   u8g2.print(Vpp);
  161.   //顯示實際電壓
  162.   u8g2.drawStr(35,7, "Vp:");
  163.   u8g2.setCursor(45, 7);
  164.   u8g2.print(Vp_p);
  165.   //顯示頻率
  166.   u8g2.drawStr(68,7, "Hz:");
  167.   u8g2.setCursor(78, 7);
  168.   u8g2.print(Freq);
  169.   //顯示占空比
  170.   u8g2.drawStr(105,7, "DR:");
  171.   u8g2.setCursor(115, 7);
  172.   u8g2.print(Dr);
  173.   //畫x坐標軸
  174.   u8g2.drawLine(0,dis_h,dis_width,dis_h);
  175.   //畫y坐標軸
  176.   u8g2.drawLine(dis_hight,7,dis_hight,dis_width);
  177.   //畫邊框
  178.   u8g2.drawFrame(4,0,124,dis_hight);
  179.   for(int x=1;x<dis_width;x++){
  180.     //顯示波形
  181.     u8g2.drawLine(x,Buffer[x],x,Buffer[x+1]);
  182.   }
  183.   for(x=0;x<dis_width;x+=4){
  184.     //畫x坐標刻度
  185.     u8g2.drawLine(x,dis_h-1,x,dis_h+1);
  186.     if (x<=dis_hight-14){
  187.       //畫Y坐標刻度
  188.       u8g2.drawLine(dis_hight-1,x+7,dis_hight+1,x+7);
  189.     }
  190.   }
  191.   //ADC采樣模式,采樣速率
  192.   if(mode==0){
  193.     u8g2.drawStr(6,62, "A:");//自動選頻
  194.   }else{
  195.     u8g2.drawStr(6,62, "M:");//手動設置
  196.   }
  197.   u8g2.setCursor(12,62);
  198.   u8g2.print(adc_n);
  199.   //發送數據給顯示屏
  200.   u8g2.sendBuffer();
  201. }

  202. void san_key(){
  203.   if(digitalRead(Key_hold)==LOW){
  204.     while(digitalRead(Key_hold)==LOW);
  205.     hold=~hold;
  206.    }
  207.   if(digitalRead(Key_mode)==LOW){
  208.     while(digitalRead(Key_hold)==LOW);
  209.       mode=mode+1;
  210.       if(mode>6){mode=0;Serial.print(0,DEC);}
  211.       if(mode!=0){
  212.         adc_n=adc_n*2;
  213.         if(adc_n>128){adc_n=4;}
  214.         set_adc(adc_n);
  215.       }
  216.       
  217.    }
  218. }

  219. //配置 ADC,提高ADC采樣速率
  220. void set_adc(int key) {
  221.   ADMUX = _BV(REFS0); // 使用A0腳采樣,精度為(0-1023)
  222.   //ADMUX=_BV(REFS0)|_BV(ADLAR)|0; //精度降為(0-255)
  223.   switch (key){
  224.     case 4://ADC Prescaler = 4
  225.       //理論 Sample Rate可達16MHz/4/13=307.6KHz
  226.       ADCSRA &=  ~(1 << ADPS2);  // 0
  227.       ADCSRA |=  (1 << ADPS1);   // 1
  228.       ADCSRA &=  ~(1 << ADPS0);  // 0
  229.       break;
  230.     case 8://ADC Prescaler = 8
  231.       //理論 Sample Rate可達16MHz/8/13=153.8KHz,實測93.5KH
  232.       ADCSRA &=  ~(1 << ADPS2); // 0
  233.       ADCSRA |=  (1 << ADPS1);  // 1
  234.       ADCSRA |=  (1 << ADPS0);  // 1
  235.       break;
  236.     case 16://ADC Prescaler = 16
  237.       //理論 Sample Rate 可達16MHz/32/13=76.8KHz
  238.       ADCSRA |=  (1 << ADPS2);   // 1
  239.       ADCSRA &=  ~(1 << ADPS1);  // 0
  240.       ADCSRA &=  ~(1 << ADPS0);  // 0
  241.       break;
  242.     case 32://ADC Prescaler = 32
  243.       //理論 Sample Rate 可達16MHz/32/13= 38.4KHz
  244.       ADCSRA |=  (1 << ADPS2);  // 1
  245.       ADCSRA &=  ~(1 << ADPS1); // 0
  246.       ADCSRA |=  (1 << ADPS0);  // 1
  247.       break;
  248.     case 64://ADC Prescaler = 64
  249.       //理論 Sample Rate 可達16MHz/64/13= 19.2KHz
  250.       ADCSRA |=  (1 << ADPS2);  // 1
  251.       ADCSRA |=  (1 << ADPS1);  // 1
  252.       ADCSRA &=  ~(1 << ADPS0); // 0
  253.       //ADCSRA  = ADCSRA&(~7)|0x06;
  254.       break;
  255.     case 128://ADC Prescaler = 128
  256.       //理論 Sample Rate 可達16MHz/128/13=9600Hz
  257.       ADCSRA |=  (1 << ADPS2);  // 1
  258.       ADCSRA |=  (1 << ADPS1);  // 1
  259.       ADCSRA |=  (1 << ADPS0);  // 1
  260.       break;
  261.     default:
  262.       break;
  263.   }
  264. }
復制代碼


回復

使用道具 舉報

5#
ID:276663 發表于 2019-12-13 09:07 | 只看該作者
厲害!
回復

使用道具 舉報

6#
ID:525052 發表于 2019-12-15 11:25 | 只看該作者
回復

使用道具 舉報

7#
ID:242562 發表于 2020-4-11 17:21 | 只看該作者
引腳圖呢???
回復

使用道具 舉報

8#
ID:377382 發表于 2020-6-9 23:43 | 只看該作者

謝謝分享
回復

使用道具 舉報

9#
ID:429705 發表于 2020-11-10 08:41 | 只看該作者
感謝分享,樓主大人有沒有接線圖啊
回復

使用道具 舉報

10#
ID:491340 發表于 2020-11-10 10:37 | 只看該作者
這個厲害了 我記得有個U  哪天試試
回復

使用道具 舉報

11#
ID:830831 發表于 2020-11-10 12:03 | 只看該作者
強人呀,給力
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 美女一级毛片 | 91免费看片 | 国产区视频在线观看 | 国产精品一区2区 | 亚洲一区二区黄 | 视频一区二区三区在线观看 | 亚洲精品在线视频 | 久热精品免费 | 日韩一区二区三区在线看 | 精品欧美一区二区久久久伦 | 国产亚洲欧美日韩精品一区二区三区 | 欧美极品在线播放 | 7777在线视频 | 在线精品亚洲欧美日韩国产 | 亚洲久久 | 精品伊人久久 | 一区二区中文 | 国产成人高清视频 | 在线视频中文字幕 | 色综合九九 | 欧美一级精品片在线看 | 日本久草视频 | 激情麻豆视频 | 在线观看国产 | 亚洲一级淫片 | 欧美精品一区二区蜜桃 | 丝袜一区二区三区 | 欧美亚洲一区二区三区 | 精品国偷自产在线 | 狠狠躁夜夜躁人人爽天天高潮 | 国产片一区二区三区 | 91精品一区二区三区久久久久久 | 亚洲精品国产第一综合99久久 | 每日更新av | 99视频免费看 | 国产美女精品视频免费观看 | 日日噜噜噜夜夜爽爽狠狠视频97 | 日韩欧美在线观看 | 精品久久久久久国产 | 粉嫩一区二区三区四区公司1 | av在线免费观看网站 |