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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

FDC2214紙張計數顯示裝置原理圖STM32源程序 2019電子設計大賽F題

[復制鏈接]
跳轉到指定樓層
樓主
內容包含2019一些大賽題目,以及相關的了解。主要是F題電容的程序實現,采用F4系列單片機,有FDC2214的模塊的原理圖和PCB。分享給大家。

Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)


單片機源程序如下:
  1. #include "delay.h"
  2. #include "sys.h"
  3. #include "usart.h"
  4. #include "myiic.h"
  5. #include "FDC2X2X_CMD.h"
  6. #include "FDC2214.h"

  7. #include "led.h"
  8. #include "key.h"
  9. #include "oled.h"
  10. #include "beep.h"
  11. #include "exti.h"
  12. #include "24cxx.h"

  13. #define ROUND_TO_UINT16(x)   ((uint16_t)(x)+0.5)>(x)? ((uint16_t)(x)):((uint16_t)(x)+1) //將浮點數x四舍五入為uint16_t
  14. #define MAX_SIZE   100                                //最大容量---紙張數
  15. #define GAP_MS   50                                        //校準測量采樣時間間隔
  16. #define DATA_ACQUIRE_NUMBER 20                //數據采集數
  17. #define CH 1                                                //通道數
  18. #define duty_wideth        0.5                                //濾波窗寬度調整系數


  19. u8 Flag_Work=0,Flag_Calibration=0;                        //Flag_Work   :工作標志位。Flag_Work=0,設備處于待機狀態;Flag_Work=1,設備處于測量狀態。
  20. float Cap;                                                                        //Cap         :設備兩極板間電容值,屏幕上實時顯示
  21. int Paper_Number;                                                        //Paper_Number:設備最終計算得到的A4紙張數
  22. __align(4) u8 dtbuf[50];                                           //打印緩存器  __align(4)

  23. float Data_Raw[DATA_ACQUIRE_NUMBER],Data_Level[MAX_SIZE],data_acquire[DATA_ACQUIRE_NUMBER];

  24. //排序函數
  25. void bubble(float a[],int n)
  26. {
  27.     int i,j;
  28.     for(i=0; i<n-1; i++)
  29.     {
  30.         for(j=n-1; j>i; j--)
  31.         {
  32.             if(a[j]<a[j-1])
  33.             {
  34.                 float t=a[j];
  35.                 a[j]=a[j-1];
  36.                 a[j-1]=t;
  37.             }
  38.         }
  39.     }
  40. }

  41. //短路檢測函數
  42. void Danger_Test()
  43. {
  44.     if(Cap<0)
  45.     {
  46.         OLED_ShowString(0,0,"   Danger !!!   ",16);

  47.         BEEP=1;
  48.     }
  49. }


  50. //啟動測量函數
  51. void Start_Measure()
  52. {
  53.     int i,j,k,index_min=0,counter,sum_effective;
  54.     float variance_high,variance_low,sum_div_sqr,div,div_sqr,sum,baseline,div_min,div_max,high_limit,low_limit,average_effective,data_measure_effective[MAX_SIZE];
  55.     if(Flag_Work==1)        //如果KEY1按鍵按下,觸發外部中斷(工作標志位置1),進入此程序,程序進入測量狀態
  56.     {
  57.         LED1=0;                                //LED1:測量指示燈

  58.         for(i=0; i<DATA_ACQUIRE_NUMBER; i++)
  59.         {
  60.             Cap=FDC2214_read_CHx(CH);                //Cap為設備所采的電容值
  61.             data_acquire[i]=Cap;
  62.             delay_ms(GAP_MS);
  63.         }


  64.         bubble(data_acquire,DATA_ACQUIRE_NUMBER);

  65.         for(j=0; j<DATA_ACQUIRE_NUMBER; j++)
  66.         {
  67.             sum+=data_acquire[j];
  68.         }
  69.         baseline=sum/(float)DATA_ACQUIRE_NUMBER;

  70.         div_min=(float)duty_wideth*(baseline-data_acquire[0]);
  71.         div_max=(float)duty_wideth*(data_acquire[DATA_ACQUIRE_NUMBER-1]-baseline);

  72.         high_limit=baseline+div_max;
  73.         low_limit=baseline-div_min;

  74.         counter=0;
  75.         sum_effective=0.0f;


  76.         for(k=0; k<DATA_ACQUIRE_NUMBER; k++)
  77.         {
  78.             Cap=FDC2214_read_CHx(CH);
  79.             delay_ms(GAP_MS);
  80.             if((Cap>low_limit)&&(Cap<high_limit))
  81.             {
  82.                 data_measure_effective[counter]=Cap;
  83.                 sum_effective+=Cap;
  84.                 counter++;
  85.             }
  86.         }

  87.         average_effective=sum_effective/(float)counter;

  88.         for(i=0; i<MAX_SIZE; i++)
  89.         {
  90.             if(average_effective>Data_Level[i])
  91.                 break;
  92.         }



  93.         sum_div_sqr=0.0f;
  94.         for(j=0; j<counter; j++)
  95.         {
  96.             div=data_measure_effective[j]-Data_Level[i-1];
  97.             if(div<0)
  98.                 div=-div;
  99.             else div=div;
  100.             div_sqr=div*div;
  101.             sum_div_sqr+=div_sqr;
  102.         }
  103.         variance_high=sum_div_sqr/(float)counter;


  104.         for(j=0; j<counter; j++)
  105.         {
  106.             div=data_measure_effective[j]-Data_Level[i];
  107.             if(div<0)
  108.                 div=-div;
  109.             else div=div;
  110.             div_sqr=div*div;
  111.             sum_div_sqr+=div_sqr;
  112.         }
  113.         variance_low=sum_div_sqr/(float)counter;


  114.                 if(i>=1)
  115.                        
  116.         {
  117.                         if(variance_high>variance_low)
  118.                                 index_min=i;
  119.                         else
  120.                                 index_min=i-1;
  121.                 }


  122.         Paper_Number=index_min+1;                        //下標+1得到紙張數



  123.         OLED_ShowNum(0,4,Paper_Number,10,16);        //OLED顯示紙張數

  124.         BEEP=1;
  125.         delay_ms(500);
  126.         BEEP=0;
  127.         LED1=1;
  128.         Flag_Work=0;      //將工作標志位置0,測試儀進入待機狀態
  129.     }
  130. }



  131. //校準函數
  132. void Calibration()
  133. {
  134.     int i,j,k,counter;
  135.     float sum,sum_effective,baseline,high_limit,low_limit,div_min,div_max;

  136.     Flag_Calibration=0;                //校準標志位,KEY2按鍵置1,相當于確定
  137.     OLED_ShowString(0,0,"   Calibration  ",16);

  138.     for(i=0; i<MAX_SIZE; i++)                //循環校準不同數量紙的電容值
  139.     {
  140.         sprintf((char *)dtbuf,"Place %d paper.",i+1);
  141.         OLED_ShowString(0,2,dtbuf,16);
  142.         OLED_ShowString(0,6,"  Press KEY2 !!!",16);
  143.         while(Flag_Calibration==0)
  144.         {
  145.             Cap=FDC2214_read_CHx(CH);
  146.             sprintf((char *)dtbuf,"Cap:%4.4f  pF",Cap);
  147.             OLED_ShowString(0,4,dtbuf,16);
  148.         }
  149.         sum=0;



  150.         for(j=0; j<DATA_ACQUIRE_NUMBER; j++)                                                //采集DATA_ACQUIRE_NUMBER次數據并取平均值存入AT24C02
  151.         {
  152.             Cap=FDC2214_read_CHx(CH);
  153.             Data_Raw[j]=Cap;
  154.             delay_ms(GAP_MS);
  155.         }

  156.         bubble(Data_Raw,DATA_ACQUIRE_NUMBER);

  157.         for(j=0; j<DATA_ACQUIRE_NUMBER; j++)
  158.         {
  159.             sum+=Data_Raw[j];
  160.         }
  161.         baseline=sum/(float)DATA_ACQUIRE_NUMBER;

  162.         div_min=(float)duty_wideth*(baseline-Data_Raw[0]);
  163.         div_max=(float)duty_wideth*(Data_Raw[DATA_ACQUIRE_NUMBER-1]-baseline);

  164.         high_limit=baseline+div_max;
  165.         low_limit=baseline-div_min;

  166.         counter=0;
  167.         sum_effective=0.0f;


  168.         for(k=0; k<DATA_ACQUIRE_NUMBER; k++)
  169.         {
  170.             Cap=FDC2214_read_CHx(CH);
  171.             delay_ms(GAP_MS);
  172.             if((Cap>low_limit)&&(Cap<high_limit))
  173.             {
  174.                 sum_effective+=Cap;
  175.                 counter++;
  176.             }
  177.         }

  178.         Data_Level[i]=sum_effective/(float)counter;
  179.                
  180.                 if(i==0)
  181.                 {
  182.                         storFloatData DATA_LEVEL= { Data_Level[i] };          //向AT24C02寫入數據
  183.                         Storage_WriteFloatNum(4*i,DATA_LEVEL);
  184.                         BEEP=1;
  185.                         delay_ms(500);
  186.                         BEEP=0;
  187.                 }
  188.                
  189.         if(i>=1)
  190.         {
  191.             if(Data_Level[i]<Data_Level[i-1])
  192.             {
  193.                 storFloatData DATA_LEVEL= { Data_Level[i] };          //向AT24C02寫入數據
  194.                 Storage_WriteFloatNum(4*i,DATA_LEVEL);
  195.                 BEEP=1;
  196.                 delay_ms(500);
  197.                 BEEP=0;
  198.             }
  199.             else
  200.             {
  201.                 i=i-1;
  202.                 BEEP=1;
  203.                 delay_ms(200);
  204.                 BEEP=0;
  205.                 delay_ms(200);
  206.                 BEEP=1;
  207.                 delay_ms(200);
  208.                 BEEP=0;
  209.             }
  210.         }
  211.         Flag_Calibration=0;
  212.     }
  213.     OLED_Clear();
  214.     OLED_ShowString(0,2,"Calibration OK!!",16);
  215.     BEEP=1;                                                                                //校驗通過后蜂鳴器響2秒
  216.     delay_ms(2000);
  217.     BEEP=0;
  218.     OLED_Clear();
  219. }

  220. //循環讀取AT24C02數據函數
  221. void Read_AT24C02()
  222. {
  223.     int i;
  224.     for(i=0; i<MAX_SIZE; i++)
  225.     {
  226.         storFloatData DATA=Storage_ReadFloatNum(4*i);
  227.         Data_Level[i]=DATA.value;                                                        //錄入到Data_Level數組
  228.     }
  229. }

  230. int main()
  231. {
  232.     delay_init(168);            //延時函數初始化
  233.     uart_init(115200);                 //串口初始化為115200

  234.     LED_Init();
  235.     KEY_Init();
  236.     BEEP_Init();
  237.     OLED_Init();
  238.     EXTIX_Init();
  239.     AT24CXX_Init();
  240.     FDC2214_Init();

  241.     Read_AT24C02();                        //上電復位后讀取AT24C02中存儲的紙張數的電容值均值(做比對參考電容值)
  242.     OLED_Clear();
  243.     while(1)
  244.     {
  245.         Cap=FDC2214_read_CHx(CH);             //讀取電容值

  246.         //----------OLED第一行顯示內容-------------//
  247.         OLED_ShowString(0,0,"|Paper  Counter|",16);
  248.         //----------OLED第二行顯示內容-------------//
  249.         OLED_ShowString(0,2,"----------------",16);
  250.         //----------OLED第三行顯示內容-------------//實時電容值
  251.         sprintf((char *)dtbuf,"Cap:%4.4f",Cap);
  252.         OLED_ShowString(0,4,dtbuf,16);
  253.         OLED_ShowString(112,4,"pF",16);
  254.         //----------OLED第四行顯示內容-------------//紙張數
  255.         OLED_ShowString(0,6,"Number:",16);
  256.         OLED_ShowNum(56,6,Paper_Number,9,16);
  257.         if(Flag_Calibration==1)                //如果KEY2鍵按下,觸發中斷進入校準狀態,不能退出(可復位重新開始)
  258.         {
  259.             Calibration();                        //校準函數
  260.             Flag_Calibration=0;
  261.         }
  262.         LED0=0;                                //LED0:待機指示燈--待機狀態常亮
  263.         BEEP=0;                                //蜂鳴器,待機狀態不響
  264.         Danger_Test();                //短路檢測
  265.         Start_Measure();        //啟動測量
  266.     }
  267. }
復制代碼

所有資料51hei提供下載:
FDC2214_PCB.zip (5.44 MB, 下載次數: 99)
Paper_Counter_V4.0.7z (330.13 KB, 下載次數: 105)


評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:786920 發表于 2020-12-3 17:50 | 只看該作者
有實物展示嗎
回復

使用道具 舉報

板凳
ID:901785 發表于 2021-4-21 08:05 | 只看該作者
編譯出來有兩個錯誤呀
回復

使用道具 舉報

地板
ID:497515 發表于 2021-7-17 10:04 | 只看該作者
不能用,后面讀的通道地址返回的數據都是0
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 黑人巨大精品 | 麻豆精品一区二区三区在线观看 | 久久国产婷婷国产香蕉 | 亚洲一区中文字幕 | 日韩和的一区二区 | 中文字幕一区二区在线观看 | 欧美欧美欧美 | 精品一区二区在线观看 | 中国大陆高清aⅴ毛片 | 国产亚洲精品一区二区三区 | 欧美1页 | 国产视频一区二区三区四区五区 | 日本午夜在线视频 | 一级黄色毛片免费 | 日韩中文一区 | 毛片免费看 | 亚洲视频1区 | 欧美视频三区 | 91精品国产综合久久婷婷香蕉 | 在线国产欧美 | 日本三级在线网站 | www.日韩| 在线成人av | 国产精品免费一区二区三区四区 | 欧美日韩综合一区 | 成人精品久久日伦片大全免费 | 久久av网站| 欧美激情 亚洲 | 手机三级电影 | 成人在线免费视频 | 国产精品一区视频 | av手机在线免费观看 | 国产清纯白嫩初高生在线播放视频 | 亚洲国产精品视频 | 欧美日韩在线精品 | 在线一区二区三区 | 亚洲色图在线观看 | 99视频免费 | 亚洲精品aⅴ | 精品一二区 | 亚洲一区二区在线播放 |