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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

Arduino學習13-最簡單的Arduino頻率計

[復制鏈接]
跳轉到指定樓層
樓主
想測量一個聲音的頻率或是占空比,但是又沒頻率計?我們可以用一塊arduino去搞定這事情。

需要的材料僅是一塊普通arduino,無需外圍元件。

特性:
1. 可以測量20~20kHz的信號,超過的話誤差越來越大。
2. 誤差大致是±5%。玩玩還行。
3. 輸出的結果有:頻率,占空比,周期,高電平時間,低電平時間。
4. 只能測量單頻,復合波形就不行了。

步驟:
1.寫下面程序到arduino里面
  1.     /*
  2.     Arduino Frequency meter
  3.     Ansifa
  4.     2013/1/5
  5.     */
  6.     int divider[6] = {0, 1, 8, 64, 256, 1024};
  7.     int prescaler = 5;
  8.     double count = 0;
  9.     double middle = 0;
  10.     char x = 0;
  11.     ISR(TIMER1_OVF_vect)
  12.     {
  13.         if (prescaler < 4)
  14.         {
  15.             prescaler++;
  16.         }
  17.     }
  18.     void interrupt()
  19.     {
  20.         if (!x)
  21.         {
  22.             count = TCNT1;
  23.             TCNT1 = 0x000;
  24.             TCCR1B = prescaler;
  25.             attachInterrupt(0, interrupt, FALLING);
  26.         }
  27.         else
  28.         {
  29.             middle = TCNT1;
  30.             attachInterrupt(0, interrupt, RISING);
  31.         }
  32.         x = ~x;
  33.     }
  34.     void setup()
  35.     {
  36.         Serial.begin(57600);
  37.         TIMSK1 = 0x01;
  38.         TCCR1A = 0x00;
  39.         attachInterrupt(0, interrupt, RISING);
  40.     }
  41.     void loop()
  42.     {
  43.         Serial.print("Freq: ");
  44.         Serial.print(16000000.0 / divider[prescaler] / count);
  45.         Serial.print(" Hz                Duty: ");
  46.         Serial.print(middle / count * 100);
  47.         Serial.print(" %                Period: ");
  48.         Serial.print(0.0000625 * divider[prescaler]*count);
  49.         Serial.print(" ms                H-time: ");
  50.         Serial.print(0.0000625 * divider[prescaler]*middle);
  51.         Serial.print(" ms                L-time: ");
  52.         Serial.print(0.0000625 * divider[prescaler]*(count - middle));
  53.         Serial.println(" ms");
  54.         if (prescaler > 1)
  55.         {
  56.             prescaler--;
  57.             delay(200);
  58.         }
  59.         delay(100);
  60.     }
復制代碼

2. 將你的信號從D2和GND引腳輸入。由于沒有經過任何放大處理,信號必須滿足開關arduino引腳的電平值,就是最好可以有0-5v的振幅。。

電路圖太簡單


3. 打開串口監視器,調波特率到57600,即可看到結果。因為沒有任何防干擾措施,出現偏差特別大的結果請自行忽略。



4. 如果你愿意的話,也可以擴展一下這個電路的性能:
* 振幅不夠的話,可以使用運放或者三極管進行預放大;
* 測量頻率不夠高,可以使用74HEF4060進行分頻。74HEF4060可以支持高達2^14=16384級分頻,理論可以將量程提高16384倍。但是由于74HEF4060性能限制,可以將輸入頻率提高到20MHz。但是分頻之后就只能看到頻率,而測不到波形的占空比了。并且注意不要使用CD4060,那是低速版本。

問題解答:
請教
1)這個interrupt函數用的是遞歸嗎?

2)TCNT1 = 0x000;
  TCCR1B = prescaler;
  TIMSK1 = 0x01;
   TCCR1A = 0x00;

這幾句話分別代表什么意思呢?
是定義時鐘的寄存器?
這幾句

答:
我就是懶得解釋才刪掉所有注釋的。。。

   1)這個interrupt函數用的是遞歸嗎?
   
   不是,因為沒有調用,attachInterrupt只是設置上升觸發中斷還是下降觸發,因為輸入波形上升下降是輪流發生的,所以設置一個檢測完一種立即換另外一個,x就是不斷在換。

2)TCNT1 = 0x000;
  TCCR1B = prescaler;
  TIMSK1 = 0x01;
   TCCR1A = 0x00;

這幾句話分別代表什么意思呢?
是定義時鐘的寄存器?

這幾句都是寄存器,TCNT1存著計數器當前值,就是計次結果;TCCR1B預分頻器,調整量程;TIMSK1允許計數器1溢出中斷;TCCR1A是其他零碎的。。。請參看http://wenku.baidu.com/view/ec6961f09e3143323968931b.html

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久这里只有精品首页 | 中文字幕在线一区 | 99爱在线免费观看 | 亚洲毛片在线 | 亚洲在线一区 | 国产综合网址 | 久久久国产精品视频 | 久久神马| 国产欧美一区二区精品久导航 | 91欧美激情一区二区三区成人 | 自拍偷拍亚洲一区 | 欧美韩一区二区三区 | 99久久婷婷国产综合精品 | 亚洲欧美激情精品一区二区 | 成人小视频在线观看 | 毛片a级 | 日韩成人免费视频 | 久亚州在线播放 | 91高清免费 | 国产一区二区三区久久久久久久久 | 超碰av在线 | 一区二区三区在线观看免费视频 | 日韩电影中文字幕 | 亚洲+变态+欧美+另类+精品 | 久久久久亚洲精品 | 欧美精品1区2区3区 免费黄篇 | 伊人伊人 | 亚州午夜精品 | 欧美精品一区二区三区在线 | 99久久精品国产一区二区三区 | 久久国产日韩 | 日本五月婷婷 | 国产伦精品一区二区三区精品视频 | 欧美一区二区三区四区五区无卡码 | 欧美精品第三页 | av在线一区二区三区 | 99久久久久 | 午夜在线影院 | 欧美日韩精品一区二区天天拍 | 91精品国产色综合久久 | 亚洲一区中文 |