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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

Arduino LGT8F328激光轉速計制作 附程序

[復制鏈接]
跳轉到指定樓層
樓主
激光轉速計,反射式。
須要用反光紙貼到轉軸上。
當被測零件完成一圈時,來自轉速計的持續發射的激光束會反射回來,
傳感器被其光觸發并向LGT8F328發送脈沖,
LGT8F328會保持這些脈沖發生的準確時間,
并以 RPM 為單位計算旋轉速度並運算顯示。

1. 激光二極管LED調制式發射頻率200hkz。
2. 激光接收傳感器調制式+消光座透鏡。
3. 128 x 32'' I2C OLED 顯示器。
4. arduino LGT8F328。
5. 電池3.7V400ma。
6. 反光紙。

制作出來的實物圖如下:


電路原理圖如下:


Arduino源程序如下:
  1. //CPU Frequency "16MHz"
  2. #include <Wire.h>
  3. #include "U8glib.h"
  4. #include <SimpleKalmanFilter.h>
  5. SimpleKalmanFilter simpleKalmanFilter(1, 1, 0.1);
  6. //Nano: SDA (A4); SCL (A5);
  7. U8GLIB_SSD1306_128X32 u8g(U8G_I2C_OPT_NONE); //0.96
  8. //U8X8_SSD1306_128X64_NONAME_HW_I2C u8x8(/* reset=*/ U8X8_PIN_NONE);
  9. unsigned long rpmtime;
  10. unsigned long rpmtd[8]={};
  11. unsigned int rpm;
  12. unsigned int rpmcount=0;
  13. unsigned int rpm_tcnt=0;
  14. unsigned int MaxX;   
  15. unsigned int MinX;  
  16. unsigned int Sumrpm=0;
  17. unsigned int valmap;
  18. float rpmfloat=0.0;
  19. float K_rpmfloat=0.0;
  20. float rpmtime_dy=0.0;
  21. float kal_rpm=0.0;
  22. bool  rpmslow = 1;
  23. //------------------------------------------------------
  24. //電壓表 voltage meter
  25. float vout = 0.0;
  26. float vin = 0.0;
  27. float R1 = 40000.0; // resistance of R1 (40K)
  28. float R2 = 10000.0; // resistance of R2 (10K)
  29. int value = 0;
  30. int analogInput = 1;
  31. unsigned int voltmap;
  32. //-------------------------------------------------------
  33. //顯示時間間隔 DisplayTime
  34. unsigned long previousBlinkTime;
  35. unsigned int TimeInterval = 500;
  36. bool toggleTime=0;
  37. bool DisplayTime=0;
  38. //------------------------------------------------
  39. //lgt328p
  40. //INTERNAL1V024 , uses a 1.024v reference voltage from inside the board.
  41. //--------------------------------------------------------------------
  42. void setup() {
  43.     Serial.begin(115200);
  44.    // pinMode(LED_BUILTIN, OUTPUT);
  45.     analogReference(INTERNAL1V024);//INTERNAL lgt328p
  46.     analogReadResolution(12);
  47. //----------------------------------------------------------
  48. //激光LED調制約200hkz輸出
  49.    noInterrupts();
  50.    TCCR2A =
  51.     1 << COM2B1 |
  52.     1 << COM2B0 |
  53.     1 << WGM21 |
  54.     1 << WGM20;
  55.   TCCR2B =
  56.     1 << WGM22 |
  57.     1 << CS20;
  58.   OCR2A = 80;
  59.   OCR2B = 60;
  60.   pinMode(3, OUTPUT);
  61. //-----------------------------------------------------------
  62. //RPM讀取時間
  63.   TCCR1A = 0;
  64.   TCCR1B = 0;
  65.   TCCR1B |= (1 << CS12); //Prescaler 256
  66.   TIMSK1 |= (1 << TOIE1); //enable timer overflow  
  67.   pinMode(2, INPUT);
  68.   attachInterrupt(0, RPM2, RISING);//CHANGE
  69. //-----------------------------------------------------  
  70.   u8g.firstPage();
  71.      do {
  72.      display_rpm_stop();
  73.      } while (u8g.nextPage());

  74.   interrupts();   
  75. }
  76. //-----------------------------------------------------------------
  77. void loop() {
  78.   
  79.     voltmeter();
  80.    millisTime();
  81.    
  82. if(DisplayTime){     
  83.     if (rpmslow) {      
  84.       if(vin<3.3){
  85.         u8g.firstPage();
  86.       do {
  87.        display_Volmeter();
  88.         } while (u8g.nextPage());  
  89.       }   
  90.      else{  
  91.       u8g.firstPage();
  92.      do {
  93.       display_rpm_stop();
  94.       } while (u8g.nextPage());
  95.     }
  96. }   
  97.   else {  
  98.     kalman_rpm();   
  99.     u8g.firstPage();
  100.   do {
  101.     display_rpm();
  102.      } while (u8g.nextPage() );
  103.   }
  104.   DisplayTime=0;
  105. }

  106. //----------------------------------------------------------   
  107.    // Serial.print(vout);
  108.    // Serial.print("\t");
  109.    // Serial.print( kal_rpm );
  110.    // Serial.print("\t");
  111.    // Serial.print(K_rpmfloat);
  112.    // Serial.print("\t");
  113.    // Serial.println();
  114.    
  115. }
  116. //---------------------------------------------------------
  117. void kalman_rpm(){
  118.          kal_rpm = simpleKalmanFilter.updateEstimate(rpmtime);
  119.          K_rpmfloat = 120/(kal_rpm/31250.00);
  120.          rpmtime_dy=K_rpmfloat;   
  121. }
  122. //----------------------------------------------------------
  123. void voltmeter(){
  124. // read the value at analog input
  125.     value = analogRead(VCCM);
  126.      vout = (value * 5.0)/4096.0;    //lgt328p
  127.       vin = vout;   
  128.     unsigned int val = vin*10;
  129.     voltmap = map(val, 30, 40, 0, 50);
  130. }
  131. //--------------------------------------------------------
  132. ISR(TIMER1_OVF_vect) {
  133.   rpmslow = 1;
  134. }
  135. //------------------------------------------------------
  136. void RPM2 () {
  137.    rpmtd[7]=TCNT1;
  138.    TCNT1 = 0;
  139.    rpmslow = 0;
  140.    rpmtd[0]=rpmtd[1];
  141.    rpmtd[1]=rpmtd[2];
  142.    rpmtd[2]=rpmtd[3];
  143.    rpmtd[3]=rpmtd[4];
  144.    rpmtd[4]=rpmtd[5];
  145.    rpmtd[5]=rpmtd[6];
  146.    rpmtd[6]=rpmtd[7];
  147.    rpmtime = (rpmtd[0]+rpmtd[1]+rpmtd[2]+rpmtd[3]+rpmtd[4]+rpmtd[5]+rpmtd[6]+rpmtd[7])/8;   
  148. }
  149. //----------------------------------------------------------------------------------
  150. void millisTime() {
  151.    unsigned long currentTime = millis();                         // 獲取當前時間                                                           
  152.   if (currentTime - previousBlinkTime >= TimeInterval) {         //如果時間間隔達到了
  153.       previousBlinkTime = currentTime;                           // 將檢查時間復位
  154.       toggleTime = (toggleTime == 1) ? 0 : 1;  
  155.       DisplayTime =  toggleTime;
  156.   }   
  157. else if (currentTime - previousBlinkTime <= 0) {                 // 如果millis時間溢出
  158.   previousBlinkTime = currentTime;
  159.   }
  160. }
  161. //-----------------------------------------------------------------------------------
  162.   void display_rpm(void) {
  163.    u8g.setFont(u8g_font_ncenR08);
  164.    u8g.drawBox(100,4,2,4);
  165.    u8g.drawFrame(103,0,25,12);
  166.    u8g.setPrintPos(108, 10);
  167.    u8g.println((voltmap*2));
  168.   // u8g.println("%");
  169.    u8g.setPrintPos(104, 32);
  170.    u8g.print("RPM");
  171.    u8g.setFont(u8g_font_ncenR24);
  172.    u8g.setPrintPos(0, 32);
  173.    if(rpmtime_dy>=10000) {u8g.print(rpmtime_dy,0);}  
  174.    else{u8g.print(rpmtime_dy,1);}  
  175. }
  176. //-----------------------------------------------------------
  177. void display_rpm_stop(void) {
  178.   u8g.setFont(u8g_font_ncenR08);
  179.   u8g.drawBox(100,4,2,4);
  180.   u8g.drawFrame(103,0,25,12);
  181.   u8g.setPrintPos(107, 10);
  182. // u8g.println((voltmap*2));
  183.   u8g.println(vout,2);  
  184.   u8g.setPrintPos(104, 32);
  185.   u8g.print("RPM");
  186.   u8g.setFont(u8g_font_ncenR24);
  187.   u8g.setPrintPos(0, 32);
  188.   if(rpmtime_dy>=10000) {u8g.print(rpmtime_dy,0);}  
  189.   else{u8g.print(rpmtime_dy,1);}
  190. }
  191. //-----------------------------------------------------------
  192. //display the voltage
  193. void display_Volmeter(void) {
  194.   u8g.setFont(u8g_font_ncenR08);  
  195.   u8g.drawBox(3,11,5,10);
  196.   u8g.drawBox(10,6,voltmap,20);
  197.   u8g.drawFrame(10,6,50,20);
  198.   u8g.setPrintPos(103, 16);
  199.   u8g.println(vin);
  200.   u8g.println("v");
  201.   if(vin<3.3){
  202.   u8g.setPrintPos(32, 20);
  203.   u8g.println((voltmap*2));
  204.   u8g.println("%");  
  205.   u8g.setPrintPos(103,32);
  206.   u8g.print("LOW");
  207.   }
  208. }
  209. //------------------------------------------------
復制代碼

評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:430492 發表于 2022-9-29 10:45 | 只看該作者
需要反光貼紙的話,使用場合就會受限不少啊,很多地方無法貼紙,況且貼了也可能容易掉。
回復

使用道具 舉報

板凳
ID:367080 發表于 2022-12-18 15:52 | 只看該作者
這個很好,正好有配件有空做一個試試。先收藏
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91在线一区 | 精品久久久久国产 | 欧美日韩中文字幕在线播放 | 在线观看免费福利 | 欧美精品在线播放 | 99久久精品免费看国产小宝寻花 | 中文字幕四虎 | 自拍 亚洲 欧美 老师 丝袜 | 超碰97人人人人人蜜桃 | 国产高清视频 | 亚洲国产精品激情在线观看 | 国产在线视频一区二区 | 免费福利视频一区二区三区 | 国产成人福利视频 | 欧美激情久久久 | 国产精品178页 | 亚洲精品欧美 | 最新伦理片 | 在线不卡| 国产三级 | 日韩av第一页 | 免费v片 | 亚洲成人福利在线观看 | 成人av一区二区三区 | 国产在线一区二区 | 日韩三级电影一区二区 | 欧美色综合一区二区三区 | 日本不卡高字幕在线2019 | 日本黄色一级片视频 | 黄色一级大片视频 | 精品久久久久香蕉网 | 日韩一区二区在线视频 | 国产69久久精品成人看动漫 | 久久精品国产一区 | 久久精品一区 | 欧美黑人一区二区三区 | 欧美日韩亚洲一区 | 亚洲精品乱码久久久久久久久 | 欧美福利视频 | 殴美一级片 | 久久精品国产免费高清 |