找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 12438|回復(fù): 21
收起左側(cè)

新學(xué)習(xí)的FDC2214并用OLED顯示出電容值的stm32源程序

  [復(fù)制鏈接]
ID:373863 發(fā)表于 2018-7-18 10:06 | 顯示全部樓層 |閱讀模式
最近要用到FDC2214模塊,所以查了一下技術(shù)手冊學(xué)習(xí)了一下,F(xiàn)DC2214采用IIC通信,源碼平臺采用的是STM32F103系列并且用OLED顯示出電容值。FDC可用于測量非導(dǎo)電容器中的液位。由于其非常高的激發(fā)速率能力,它能夠測量肥皂水、油墨、肥皂和其他導(dǎo)電液體。它的工作原理是基于比率測量的。
以下是FDC部分源代碼:
  1. #include "fdc2214.h"
  2. #include "delay.h"
  3. #include "led.h"

  4. u32 Data_FDC;
  5. //FDC_I2C及讀寫操作**************************************************

  6. //FDC IIC 延時(shí)函數(shù)
  7. void FDC_IIC_Delay(void)
  8. {
  9.         delay_us(2);
  10. }

  11. void FDC_GPIO_Init(void)
  12. {
  13.         
  14. }

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

  28. //產(chǎn)生IIC起始信號
  29. void FDC_IIC_Start(void)
  30. {
  31.         FDC_SDA_OUT();     //sda線輸出
  32.         FDC_IIC_SDA=1;                    
  33.         FDC_IIC_SCL=1;
  34.         FDC_IIC_Delay();
  35.          FDC_IIC_SDA=0;//START:when CLK is high,DATA change form high to low
  36.         FDC_IIC_Delay();
  37.         FDC_IIC_SCL=0;//鉗住I2C總線,準(zhǔn)備發(fā)送或接收數(shù)據(jù)
  38. }         
  39. //產(chǎn)生IIC停止信號
  40. void FDC_IIC_Stop(void)
  41. {
  42.         FDC_SDA_OUT();//sda線輸出
  43.         FDC_IIC_SCL=0;
  44.         FDC_IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
  45.          FDC_IIC_Delay();
  46.         FDC_IIC_SCL=1;
  47.         FDC_IIC_SDA=1;//發(fā)送I2C總線結(jié)束信號
  48.         FDC_IIC_Delay();                                                                  
  49. }
  50. //等待應(yīng)答信號到來
  51. //返回值:1,接收應(yīng)答失敗
  52. //        0,接收應(yīng)答成功
  53. u8 FDC_IIC_Wait_Ack(void)
  54. {
  55.         u8 ucErrTime=0;
  56.         FDC_SDA_IN();      //SDA設(shè)置為輸入  
  57.         FDC_IIC_SDA=1;FDC_IIC_Delay();           
  58.         FDC_IIC_SCL=1;FDC_IIC_Delay();         
  59.         while(FDC_READ_SDA)
  60.         {
  61.                 ucErrTime++;
  62.                 if(ucErrTime>250)
  63.                 {
  64.                         FDC_IIC_Stop();
  65.                         return 1;
  66.                 }
  67.         }
  68.         FDC_IIC_SCL=0;//時(shí)鐘輸出0            
  69.         return 0;  
  70. }
  71. //產(chǎn)生ACK應(yīng)答
  72. void FDC_IIC_Ack(void)
  73. {
  74.         FDC_IIC_SCL=0;
  75.         FDC_SDA_OUT();
  76.         FDC_IIC_SDA=0;
  77.         FDC_IIC_Delay();
  78.         FDC_IIC_SCL=1;
  79.         FDC_IIC_Delay();
  80.         FDC_IIC_SCL=0;
  81. }
  82. //不產(chǎn)生ACK應(yīng)答                    
  83. void FDC_IIC_NAck(void)
  84. {
  85.         FDC_IIC_SCL=0;
  86.         FDC_SDA_OUT();
  87.         FDC_IIC_SDA=1;
  88.         FDC_IIC_Delay();
  89.         FDC_IIC_SCL=1;
  90.         FDC_IIC_Delay();
  91.         FDC_IIC_SCL=0;
  92. }                                                                              
  93. //IIC發(fā)送一個(gè)字節(jié)
  94. //返回從機(jī)有無應(yīng)答
  95. //1,有應(yīng)答
  96. //0,無應(yīng)答                          
  97. void FDC_IIC_Send_Byte(u8 txd)
  98. {                        
  99.   u8 t;   
  100.         FDC_SDA_OUT();            
  101.     FDC_IIC_SCL=0;//拉低時(shí)鐘開始數(shù)據(jù)傳輸
  102.     for(t=0;t<8;t++)
  103.     {              
  104.         FDC_IIC_SDA=(txd&0x80)>>7;
  105.         txd<<=1;           
  106.                     FDC_IIC_SCL=1;
  107.                     FDC_IIC_Delay();
  108.                     FDC_IIC_SCL=0;        
  109.                     FDC_IIC_Delay();
  110.     }         
  111. }            
  112. //讀1個(gè)字節(jié),ack=1時(shí),發(fā)送ACK,ack=0,發(fā)送nACK   
  113. u8 FDC_IIC_Read_Byte(unsigned char ack)
  114. {
  115.         unsigned char i,receive=0;
  116.         FDC_SDA_IN();//SDA設(shè)置為輸入
  117.     for(i=0;i<8;i++ )
  118.         {
  119.         FDC_IIC_SCL=0;
  120.         FDC_IIC_Delay();
  121.                 FDC_IIC_SCL=1;
  122.         receive<<=1;
  123.         if(FDC_READ_SDA)receive++;   
  124.                 FDC_IIC_Delay();
  125.     }                                 
  126.     if (!ack)
  127.         FDC_IIC_NAck();//發(fā)送nACK
  128.     else
  129.         FDC_IIC_Ack(); //發(fā)送ACK   
  130.     return receive;
  131. }

  132. //FDC寄存器操作***********************************************************************

  133. /*FDC2214設(shè)置函數(shù)
  134. *IIC寫2個(gè)字節(jié)
  135. *reg:寄存器地址
  136. *data1:數(shù)據(jù)1
  137. *data2:數(shù)據(jù)2
  138. *返回值:0    正常
  139. *     其他  錯(cuò)誤代碼
  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);//發(fā)送器件地址+寫命令        
  145.         if(FDC_IIC_Wait_Ack())        //等待應(yīng)答
  146.         {
  147.                 FDC_IIC_Stop();                 
  148.                 return 1;               
  149.         }
  150.     FDC_IIC_Send_Byte(reg);//寫寄存器地址
  151.     FDC_IIC_Wait_Ack();                 //等待應(yīng)答
  152.         FDC_IIC_Send_Byte(MSB);  //發(fā)送數(shù)據(jù)1
  153.         if(FDC_IIC_Wait_Ack())         //等待ACK
  154.         {
  155.                 FDC_IIC_Stop();         
  156.                 return 1;                 
  157.         }                 
  158.         FDC_IIC_Send_Byte(LSB);  //發(fā)送數(shù)據(jù)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. /*讀取FDC2214寄存器數(shù)據(jù)
  168. *IIC讀2個(gè)字節(jié)
  169. *reg:寄存器地址
  170. *返回值:讀到的數(shù)據(jù)
  171. */
  172. u16 FDC_Read(u8 reg)
  173. {
  174.         u16 res;
  175.    FDC_IIC_Start();
  176.         FDC_IIC_Send_Byte((FDC2214_ADDR<<1)|0);//發(fā)送器件地址+寫命令        
  177.         FDC_IIC_Wait_Ack();                //等待應(yīng)答
  178.     FDC_IIC_Send_Byte(reg);        //寫寄存器地址
  179.     FDC_IIC_Wait_Ack();                //等待應(yīng)答
  180.     FDC_IIC_Start();
  181.         FDC_IIC_Send_Byte((FDC2214_ADDR<<1)|1);//發(fā)送器件地址+讀命令        
  182.     FDC_IIC_Wait_Ack();                //等待應(yīng)答
  183.         res=FDC_IIC_Read_Byte(1)<<8;//讀取數(shù)據(jù),發(fā)送ACK
  184.          
  185.         res|=FDC_IIC_Read_Byte(0);//讀取數(shù)據(jù),發(fā)送nACK
  186.     FDC_IIC_Stop();                        //產(chǎn)生一個(gè)停止條件
  187.         return res;               
  188. }

  189. /*得到通道x轉(zhuǎn)換后的數(shù)據(jù)
  190. *index:0 -> CH0
  191. *      1 -> CH1
  192. *      2 -> CH2
  193. *      3 -> CH3
  194. *返回值:讀到的數(shù)據(jù)
  195. */
  196. //u16 FCD2214_ReadCH(u8 index)
  197. //{
  198. //        u16 result;
  199. //        switch(index)
  200. //        {
  201. //                case 0:
  202. //                  result = FDC_Read(DATA_CH0)&0x0FFF;
  203. //                  result = (result<<4)|(FDC_Read(DATA_LSB_CH0)>>12);
  204. //                        break;
  205. //                case 1:
  206. //                        result = FDC_Read(DATA_CH1)&0x0FFF;
  207. //                  result = (result<<4)|(FDC_Read(DATA_LSB_CH1)>>12);
  208. //                        break;
  209. //                case 2:
  210. //                        result = FDC_Read(DATA_CH2)&0x0FFF;
  211. //                  result = (result<<4)|(FDC_Read(DATA_LSB_CH2)>>12);
  212. //                        break;
  213. //                case 3:
  214. //                        result = FDC_Read(DATA_CH3)&0x0FFF;
  215. //                  result = (result<<4)|(FDC_Read(DATA_LSB_CH3)>>12);
  216. //                        break;
  217. //                default:break;
  218. //        }
  219. //        return result;
  220. //}

  221. u32 FCD2214_ReadCH(u8 index)
  222. {
  223.         u32 result;
  224.         switch(index)
  225.         {
  226.                 case 0:
  227.                   result = FDC_Read(DATA_CH0)&0x0FFF;
  228.                   result = (result<<16)|(FDC_Read(DATA_LSB_CH0));
  229.                         break;
  230.                 case 1:
  231.                         result = FDC_Read(DATA_CH1)&0x0FFF;
  232.                   result = (result<<16)|(FDC_Read(DATA_LSB_CH1));
  233.                         break;
  234.                 case 2:
  235.                         result = FDC_Read(DATA_CH2)&0x0FFF;
  236.                   result = (result<<16)|(FDC_Read(DATA_LSB_CH2));
  237.                         break;
  238.                 case 3:
  239.                         result = FDC_Read(DATA_CH3)&0x0FFF;
  240.                   result = (result<<16)|(FDC_Read(DATA_LSB_CH3));
  241.                         break;
  242.                 default:break;
  243.         }
  244.         result =result&0x0FFFFFFF;
  245.         return result;
  246. }

  247. /*FDC2214初始化函數(shù)
  248. *返回值:0:初始化正常
  249. *       1:不正常
  250. */
  251. u8 FDC2214_Init(void)
  252. {
  253.         u16 res;
  254.         //FDC2214芯片IO口初始化
  255.         FDC_GPIO_Init();
  256.         
  257.         //軟件IIC總線初始化
  258.         FDC_IIC_Init();
  259.         
  260.         //檢測ID是否正確,再初始化寄存器
  261.         res=FDC_Read(MANUFACTURER_ID);
  262.         if(res==0x5449)
  263.         {
  264.                 //設(shè)置Set_FDC2214寄存器
  265.                 Set_FDC2214(RCOUNT_CH0,0x34,0xFB);//參考計(jì)數(shù)轉(zhuǎn)換間隔時(shí)間(T=(RCOUNT_CH0*16)/Frefx)
  266.                 Set_FDC2214(RCOUNT_CH1,0x34,0xFB);
  267.                 Set_FDC2214(RCOUNT_CH2,0x34,0xFB);
  268.                 Set_FDC2214(RCOUNT_CH3,0x34,0xFB);
  269.                
  270.                 Set_FDC2214(SETTLECOUNT_CH0,0x00,0x1B);//轉(zhuǎn)換之前的穩(wěn)定時(shí)間(T=(SETTLECOUNT_CHx*16)/Frefx)
  271.                 Set_FDC2214(SETTLECOUNT_CH1,0x00,0x1B);
  272.                 Set_FDC2214(SETTLECOUNT_CH2,0x00,0x1B);
  273.                 Set_FDC2214(SETTLECOUNT_CH3,0x00,0x1B);
  274.                
  275.                 Set_FDC2214(CLOCK_DIVIDERS_C_CH0,0x20,0x02);//選擇在0.01MHz ~ 10MHz的傳感器頻率
  276.                 Set_FDC2214(CLOCK_DIVIDERS_C_CH1,0x20,0x02);//Frefx = Fclk = 43.4MHz/2(2分頻)
  277.                 Set_FDC2214(CLOCK_DIVIDERS_C_CH2,0x20,0x02);//CHx_REF_DIVIDER=2;CHx_FIN_SEL=2
  278.                 Set_FDC2214(CLOCK_DIVIDERS_C_CH3,0x20,0x02);
  279.                
  280.                 Set_FDC2214(DRIVE_CURRENT_CH0,0x78,0x00);//0.146ma(傳感器時(shí)鐘建立+轉(zhuǎn)換時(shí)間的驅(qū)動(dòng)電流)
  281.                 Set_FDC2214(DRIVE_CURRENT_CH1,0x78,0x00);
  282.                 Set_FDC2214(DRIVE_CURRENT_CH2,0x78,0x00);
  283.                 Set_FDC2214(DRIVE_CURRENT_CH3,0x78,0x00);
  284.                
  285.                 Set_FDC2214(ERROR_CONFIG,0x00,0x00);//全部禁止錯(cuò)誤匯報(bào)
  286.                
  287.                 Set_FDC2214(MUX_CONFIG,0xC2,0x0D);//通道0,1,2 ,3;選擇10Mhz為超過振蕩槽振蕩頻率的最低設(shè)置,多通道,四通道
  288.                
  289.                 Set_FDC2214(CONFIG,0x14,0x01);//激活模式,使用內(nèi)部振蕩器做參考頻率,INTB引腳會(huì)隨狀態(tài)寄存器更新被置位
  290.         }
  291.         else return 1;
  292.         
  293.         return 0;
  294. }

  295. /*測量線路電容
  296. *index:0:線路0
  297. *      1:線路1
  298. *      2:線路2
  299. *      3:線路3
  300. *返回值:線路總電容C
  301. */
  302. float Cap_Calculate(u8 index)
  303. {
  304.         float Cap;
  305.         Data_FDC = FCD2214_ReadCH(index);
  306. //        Cap = 56645.763f/((float)Data_FDC);
  307. //        return ((Cap*Cap)-33);
  308.         Cap = 232021045.248/(Data_FDC);
  309.         return (Cap*Cap);
  310. }



復(fù)制代碼
0.png
全部資料51hei下載地址:
FDC2214程序STM32OLED串口.rar (362.77 KB, 下載次數(shù): 418)


回復(fù)

使用道具 舉報(bào)

ID:374695 發(fā)表于 2018-7-19 14:35 | 顯示全部樓層
單位是什么呢
回復(fù)

使用道具 舉報(bào)

ID:106167 發(fā)表于 2018-7-19 23:16 | 顯示全部樓層
非常好,剛好可以用上,謝謝哈
回復(fù)

使用道具 舉報(bào)

ID:314699 發(fā)表于 2018-7-20 16:33 | 顯示全部樓層
非常好,很有幫助,謝謝!
回復(fù)

使用道具 舉報(bào)

ID:376137 發(fā)表于 2018-7-20 20:07 | 顯示全部樓層
hex12138 發(fā)表于 2018-7-20 16:33
非常好,很有幫助,謝謝!

你好,請問你們是做的手勢識別嗎?
回復(fù)

使用道具 舉報(bào)

ID:375175 發(fā)表于 2018-7-20 21:56 | 顯示全部樓層
請問你們用起來了嗎
回復(fù)

使用道具 舉報(bào)

ID:376289 發(fā)表于 2018-7-21 00:08 來自手機(jī) | 顯示全部樓層
Cap = 232021045.248/(Data_FDC);這個(gè)是怎么理解的啊
回復(fù)

使用道具 舉報(bào)

ID:375324 發(fā)表于 2018-7-21 08:27 | 顯示全部樓層
@樓上,這代碼有用么,我res總是0XFFFF過不了fdc2214的初始化,是我fdc2214引腳沒焊好的原因么
回復(fù)

使用道具 舉報(bào)

ID:374280 發(fā)表于 2018-7-21 10:37 | 顯示全部樓層
這個(gè)程序里面OLED是怎么和STM32F103的引腳接線的
回復(fù)

使用道具 舉報(bào)

ID:374280 發(fā)表于 2018-7-21 10:43 | 顯示全部樓層
請問這個(gè)用OLED顯示電容的值是怎么顯示的
回復(fù)

使用道具 舉報(bào)

ID:366624 發(fā)表于 2018-7-21 22:07 | 顯示全部樓層
幫助很大,謝謝!
回復(fù)

使用道具 舉報(bào)

ID:294123 發(fā)表于 2018-7-22 16:55 | 顯示全部樓層
看一看 哈哈
回復(fù)

使用道具 舉報(bào)

ID:375186 發(fā)表于 2018-7-23 16:59 | 顯示全部樓層
一萬年 發(fā)表于 2018-7-21 00:08
Cap = 232021045.248/(Data_FDC);這個(gè)是怎么理解的啊

同問!!。。!
回復(fù)

使用道具 舉報(bào)

ID:282650 發(fā)表于 2019-3-19 17:46 | 顯示全部樓層
正好用的到,參考一下
回復(fù)

使用道具 舉報(bào)

ID:576248 發(fā)表于 2019-8-8 11:45 | 顯示全部樓層
請問我這個(gè)編譯沒錯(cuò)誤,接口也沒問題,下載后沒反應(yīng),燈也不亮怎么回事啊。。
回復(fù)

使用道具 舉報(bào)

ID:437828 發(fā)表于 2019-12-24 17:51 來自手機(jī) | 顯示全部樓層
l420ll 發(fā)表于 2018-7-19 23:16
非常好,剛好可以用上,謝謝哈

FDC2214初始化失敗,請問什么問題
回復(fù)

使用道具 舉報(bào)

ID:384489 發(fā)表于 2020-1-3 11:59 | 顯示全部樓層
正好參考一下,不知道有誰測非導(dǎo)電液位成功了嗎?
回復(fù)

使用道具 舉報(bào)

ID:591191 發(fā)表于 2020-12-28 10:03 | 顯示全部樓層
sadasfsa 發(fā)表于 2019-8-8 11:45
請問我這個(gè)編譯沒錯(cuò)誤,接口也沒問題,下載后沒反應(yīng),燈也不亮怎么回事啊。。

請問硬件怎么連接,有原理圖pcb圖嗎
回復(fù)

使用道具 舉報(bào)

ID:882758 發(fā)表于 2021-8-13 14:49 | 顯示全部樓層
為啥我就只有通道0有數(shù)據(jù)  其他串口輸出nan
回復(fù)

使用道具 舉報(bào)

ID:1051480 發(fā)表于 2022-11-11 17:43 | 顯示全部樓層
267310301 發(fā)表于 2018-7-21 08:27
@樓上,這代碼有用么,我res總是0XFFFF過不了fdc2214的初始化,是我fdc2214引腳沒焊好的原因么

你好,我也是這樣的,這是為啥,請問你解決了嗎?
回復(fù)

使用道具 舉報(bào)

ID:1051480 發(fā)表于 2022-11-11 17:44 | 顯示全部樓層
這個(gè)我初始化也一直是0xffff,這是為什么啊
回復(fù)

使用道具 舉報(bào)

ID:1062684 發(fā)表于 2023-2-15 03:51 | 顯示全部樓層
OLED不亮 啊

回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表