国产免费AV|泡泡玛特欧洲总部将设在伦敦|中文天堂网www新版资源在线|一本久道综合在线中文|国精产品一二三产区的使用方法|香蕉鱼在线观看|www.27eee

 找回密碼
 注冊
搜索

STM32+FDC2214的手勢識別裝置程序+原理圖PCB文件

[復制鏈接]
樓主
路漫漫 發表于 2020-5-19 00:59:20 | 只看該作者 |只看大圖 |倒序瀏覽 |閱讀模式
用stm32做的手勢識別裝置,有原理圖和pcb文件,2018年電賽D題。以下為FDC2214部分代碼
Altium Designer畫的原理圖和PCB圖如下:(附件中可下載工程文件)
pcb文件及其原理圖.zip (15.65 MB, 售價: 1 E幣)
STM32 FDC2214的手勢識別程序源碼.zip (331.42 KB, 售價: 1 E幣)
STM32+FDC2214的手勢識別裝置程序+原理圖PCB文件 1.png STM32+FDC2214的手勢識別裝置程序+原理圖PCB文件 2.png STM32+FDC2214的手勢識別裝置程序+原理圖PCB文件 3.png
部分stm32程序源碼
  1. #include "fdc2214.h"
  2. #include "delay.h"
  3. u32 Data_FDC;
  4. void FDC_IIC_Delay(void)
  5. {
  6.         delay_us(2);
  7. }

  8. void FDC_GPIO_Init(void)
  9. {
  10.         
  11. }

  12. void FDC_IIC_Init(void)
  13. {                                             
  14.   GPIO_InitTypeDef  GPIO_InitStructure;
  15.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//先使能外設IO PORTC時鐘
  16.                
  17.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5;//端口配置
  18.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                 //推挽輸出
  19.         //GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  20.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                //IO口速度為50MHz
  21.   GPIO_Init(GPIOC, &GPIO_InitStructure);                                            //根據設定參數初始化GPIO
  22.         
  23.   GPIO_SetBits(GPIOC,GPIO_Pin_4|GPIO_Pin_5);                                  //PC.4,PC.5 輸出高        
  24. }

  25. //產生IIC起始信號
  26. void FDC_IIC_Start(void)
  27. {
  28.         FDC_SDA_OUT();     //sda線輸出
  29.         FDC_IIC_SDA=1;                    
  30.         FDC_IIC_SCL=1;
  31.         FDC_IIC_Delay();
  32.          FDC_IIC_SDA=0;//START:when CLK is high,DATA change form high to low
  33.         FDC_IIC_Delay();
  34.         FDC_IIC_SCL=0;//鉗住I2C總線,準備發送或接收數據
  35. }         
  36. //產生IIC停止信號
  37. void FDC_IIC_Stop(void)
  38. {
  39.         FDC_SDA_OUT();//sda線輸出
  40.         FDC_IIC_SCL=0;
  41.         FDC_IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
  42.          FDC_IIC_Delay();
  43.         FDC_IIC_SCL=1;
  44.         FDC_IIC_SDA=1;//發送I2C總線結束信號
  45.         FDC_IIC_Delay();                                                                  
  46. }
  47. //等待應答信號到來
  48. //返回值:1,接收應答失敗
  49. //        0,接收應答成功
  50. u8 FDC_IIC_Wait_Ack(void)
  51. {
  52.         u8 ucErrTime=0;
  53.         FDC_SDA_IN();      //SDA設置為輸入  
  54.         FDC_IIC_SDA=1;FDC_IIC_Delay();           
  55.         FDC_IIC_SCL=1;FDC_IIC_Delay();         
  56.         while(FDC_READ_SDA)
  57.         {
  58.                 ucErrTime++;
  59.                 if(ucErrTime>250)
  60.                 {
  61.                         FDC_IIC_Stop();
  62.                         return 1;
  63.                 }
  64.         }
  65.         FDC_IIC_SCL=0;//時鐘輸出0            
  66.         return 0;  
  67. }


  68. //產生ACK應答
  69. //void FDC_IIC_Ack(void)
  70. //{
  71. //        FDC_IIC_SCL=0;
  72. //        FDC_SDA_OUT();
  73. //        FDC_IIC_SDA=0;
  74. //        FDC_IIC_Delay();
  75. //        FDC_IIC_SCL=1;
  76. //        FDC_IIC_Delay();
  77. //        FDC_IIC_SCL=0;
  78. //}

  79. //debug
  80. void FDC_IIC_Ack(void)
  81. {
  82.         FDC_IIC_SCL=0;
  83.         FDC_IIC_SDA=0;
  84.         FDC_IIC_Delay();
  85.         FDC_IIC_SCL=1;
  86.         FDC_IIC_Delay();
  87.         FDC_IIC_SCL=0;
  88.         FDC_IIC_Delay();
  89.         FDC_IIC_SDA=1;
  90. }


  91. //不產生ACK應答                    
  92. void FDC_IIC_NAck(void)
  93. {
  94.         FDC_IIC_SCL=0;
  95.         FDC_SDA_OUT();
  96.         FDC_IIC_SDA=1;
  97.         FDC_IIC_Delay();
  98.         FDC_IIC_SCL=1;
  99.         FDC_IIC_Delay();
  100.         FDC_IIC_SCL=0;
  101. }                                                                              
  102. //IIC發送一個字節
  103. //返回從機有無應答
  104. //1,有應答
  105. //0,無應答                          
  106. void FDC_IIC_Send_Byte(u8 txd)
  107. {                        
  108.   u8 t;   
  109.         FDC_SDA_OUT();            
  110.     FDC_IIC_SCL=0;//拉低時鐘開始數據傳輸
  111.     for(t=0;t<8;t++)
  112.     {              
  113.         FDC_IIC_SDA=(txd&0x80)>>7;
  114.         txd<<=1;           
  115.                     FDC_IIC_SCL=1;
  116.                     FDC_IIC_Delay();
  117.                     FDC_IIC_SCL=0;        
  118.                     FDC_IIC_Delay();
  119.     }         
  120. }            
  121. //讀1個字節,ack=1時,發送ACK,ack=0,發送nACK   
  122. u8 FDC_IIC_Read_Byte(unsigned char ack)
  123. {
  124.         unsigned char i,receive=0;
  125.         FDC_SDA_IN();//SDA設置為輸入
  126.     for(i=0;i<8;i++ )
  127.         {
  128.         FDC_IIC_SCL=0;
  129.         FDC_IIC_Delay();
  130.                 FDC_IIC_SCL=1;
  131.         receive<<=1;
  132.         if(FDC_READ_SDA)receive++;   
  133.                 FDC_IIC_Delay();
  134.     }                                 
  135.     if (!ack)
  136.         FDC_IIC_NAck();//發送nACK
  137.     else
  138.         FDC_IIC_Ack(); //發送ACK   
  139.     return receive;
  140. }

  141. u8 Set_FDC2214(u8 reg,u8 MSB,u8 LSB)                                 
  142. {
  143.     FDC_IIC_Start();
  144.         FDC_IIC_Send_Byte((FDC2214_ADDR<<1)|0);//發送器件地址+寫命令        
  145.         if(FDC_IIC_Wait_Ack())        //等待應答
  146.         {
  147.                 FDC_IIC_Stop();                 
  148.                 return 1;               
  149.         }
  150.     FDC_IIC_Send_Byte(reg);//寫寄存器地址
  151.     FDC_IIC_Wait_Ack();                 //等待應答
  152.         FDC_IIC_Send_Byte(MSB);  //發送數據1
  153.         if(FDC_IIC_Wait_Ack())         //等待ACK
  154.         {
  155.                 FDC_IIC_Stop();         
  156.                 return 1;                 
  157.         }                 
  158.         FDC_IIC_Send_Byte(LSB);  //發送數據2
  159.         if(FDC_IIC_Wait_Ack())         //等待ACK
  160.         {
  161.                 FDC_IIC_Stop();         
  162.                 return 1;                 
  163.         }        
  164.     FDC_IIC_Stop();         
  165.         return 0;
  166. }

  167. u16 FDC_Read(u8 reg)
  168. {
  169.         u16 res;
  170.    FDC_IIC_Start();
  171.         FDC_IIC_Send_Byte((FDC2214_ADDR<<1)|0);//發送器件地址+寫命令        
  172.         FDC_IIC_Wait_Ack();                //等待應答
  173.     FDC_IIC_Send_Byte(reg);        //寫寄存器地址
  174.     FDC_IIC_Wait_Ack();                //等待應答
  175.     FDC_IIC_Start();
  176.         FDC_IIC_Send_Byte((FDC2214_ADDR<<1)|1);//發送器件地址+讀命令        
  177.     FDC_IIC_Wait_Ack();                //等待應答
  178.         res=FDC_IIC_Read_Byte(1)<<8;//讀取數據,發送ACK
  179.         
  180. //        FDC_IIC_Ack();
  181.         res|=FDC_IIC_Read_Byte(0);//讀取數據,發送nACK
  182.     FDC_IIC_Stop();                        //產生一個停止條件
  183.         return res;               
  184. }

  185. u32 FCD2214_ReadCH(u8 index)
  186. {
  187.         u32 result;
  188.         switch(index)
  189.         {
  190.                 case 0:
  191.                   result = FDC_Read(DATA_CH0)&0x0FFF;
  192.                   result = (result<<16)|(FDC_Read(DATA_LSB_CH0));
  193.                         break;
  194.                 case 1:
  195.                         result = FDC_Read(DATA_CH1)&0x0FFF;
  196.                   result = (result<<16)|(FDC_Read(DATA_LSB_CH1));
  197.                         break;
  198.                 case 2:
  199.                         result = FDC_Read(DATA_CH2)&0x0FFF;
  200.                   result = (result<<16)|(FDC_Read(DATA_LSB_CH2));
  201.                         break;
  202.                 case 3:
  203.                         result = FDC_Read(DATA_CH3)&0x0FFF;
  204.                   result = (result<<16)|(FDC_Read(DATA_LSB_CH3));
  205.                         break;
  206.                 default:break;
  207.         }
  208.         result =result&0x0FFFFFFF;
  209.         return result;
  210. }

  211. /*FDC2214初始化函數
  212. *返回值:0:初始化正常
  213. *       1:不正常
  214. */
  215. u8 FDC2214_Init(void)
  216. {
  217.         u16 res,ID_FDC2214;
  218.         FDC_GPIO_Init();
  219.         FDC_IIC_Init();
  220.         res=FDC_Read(MANUFACTURER_ID);//測試設備讀取是否正常
  221.         ID_FDC2214 = FDC_Read(DEVICE_ID);
  222.         
  223.         printf("DEVICE_ID:0X%x\r\n",ID_FDC2214);
  224.         if(res==0x5449)
  225.         {
  226.                 //設置Set_FDC2214寄存器
  227.                 Set_FDC2214(RCOUNT_CH0,0x34,0xFB);//參考計數轉換間隔時間(T=(RCOUNT_CH0*16)/Frefx)
  228.                 Set_FDC2214(RCOUNT_CH1,0x34,0xFB);
  229.                 Set_FDC2214(RCOUNT_CH2,0x34,0xFB);
  230.                 Set_FDC2214(RCOUNT_CH3,0x34,0xFB);
  231.                
  232.                 Set_FDC2214(SETTLECOUNT_CH0,0x00,0x1B);//轉換之前的穩定時間(T=(SETTLECOUNT_CHx*16)/Frefx)
  233.                 Set_FDC2214(SETTLECOUNT_CH1,0x00,0x1B);
  234.                 Set_FDC2214(SETTLECOUNT_CH2,0x00,0x1B);
  235.                 Set_FDC2214(SETTLECOUNT_CH3,0x00,0x1B);
  236.                
  237.                 Set_FDC2214(CLOCK_DIVIDERS_C_CH0,0x20,0x02);//選擇在0.01MHz ~ 10MHz的傳感器頻率
  238.                 Set_FDC2214(CLOCK_DIVIDERS_C_CH1,0x20,0x02);//Frefx = Fclk = 43.4MHz/2(2分頻)
  239.                 Set_FDC2214(CLOCK_DIVIDERS_C_CH2,0x20,0x02);//CHx_REF_DIVIDER=2;CHx_FIN_SEL=2
  240.                 Set_FDC2214(CLOCK_DIVIDERS_C_CH3,0x20,0x02);//CHx_REF_DIVIDER=2;CHx_FIN_SEL=2
  241.                
  242.                 Set_FDC2214(DRIVE_CURRENT_CH0,0x78,0x00);//0.146ma(傳感器時鐘建立+轉換時間的驅動電流)
  243.                 Set_FDC2214(DRIVE_CURRENT_CH1,0x78,0x00);
  244.                 Set_FDC2214(DRIVE_CURRENT_CH2,0x78,0x00);
  245.                 Set_FDC2214(DRIVE_CURRENT_CH3,0x78,0x00);
  246.                
  247.                 Set_FDC2214(ERROR_CONFIG,0x00,0x00);//全部禁止錯誤匯報
  248.                
  249.                 Set_FDC2214(MUX_CONFIG,0xC2,0x0D);//通道0,1,2 ,3;選擇10Mhz為超過振蕩槽振蕩頻率的最低設置,多通道,四通道
  250.                
  251.                 Set_FDC2214(CONFIG,0x14,0x01);//激活模式,使用內部振蕩器做參考頻率,INTB引腳會隨狀態寄存器更新被置位
  252.         }
  253.         else return 1;
  254.         
  255.         return 0;
  256. }

  257. float Cap_Calculate(u8 chx)
  258. {
  259.         float Cap;
  260.         Data_FDC = FCD2214_ReadCH(chx);
  261.         Cap = 232021045.248/(Data_FDC);
  262.         return (Cap*Cap);
  263. }
復制代碼


沙發
cainiao12 發表于 2023-5-17 13:27:19 | 只看該作者
不錯看著可以i
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規則

手機版|小黑屋|ELEOK |網站地圖

GMT+8, 2026-5-26 00:09

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回復 返回頂部 返回列表