lt_fdc2214.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629
  1. #include "lt_fdc2214_iic.h"
  2. #include "lt_fdc2214.h"
  3. #include "stdlib.h"
  4. #include "math.h"
  5. #include "main.h"
  6. #include "cmsis_os.h"
  7. #include "queue.h"
  8. extern osMessageQueueId_t filterqueue1Handle;
  9. extern osMessageQueueId_t filterqueue2Handle;
  10. extern volatile float filtered_oil_cap; // 滤波之后的油水电容值
  11. extern volatile float oil_percent; // 油水百分比
  12. /**
  13. ******************************************************************************
  14. * @file lt_fdc2214.c
  15. ******************************************************************************
  16. * @attention
  17. * FDC2214的SD引脚,拉高关机,拉低开机。
  18. *
  19. ******************************************************************************
  20. */
  21. uint8_t CHx_FIN_SEL[4];
  22. double fREFx[4];
  23. double FRE[4];
  24. uint32_t ch0,ch1,ch2,ch3;
  25. /*!
  26. * @brief IIC写FDC2214
  27. * @param Slve_Addr 器件地址
  28. * @param reg 寄存器
  29. * @param data 数据
  30. * @since v1.0
  31. * Sample usage: FDC2214_Write16(FDC2214_Addr, FDC2214_CONFIG, 0xFFFF);
  32. */
  33. void FDC2214_Write16(uint8_t Slve_Addr, uint8_t reg, uint16_t data)
  34. {
  35. uint8_t dat;
  36. FDC2214_IIC_Start();
  37. FDC2214_IIC_Send_Byte(Slve_Addr << 1);
  38. FDC2214_IIC_Wait_Ack();
  39. FDC2214_IIC_Send_Byte(reg);
  40. FDC2214_IIC_Wait_Ack();
  41. dat=(data >> 8);
  42. FDC2214_IIC_Send_Byte(dat);
  43. FDC2214_IIC_Wait_Ack();
  44. dat=data & 0xFF;
  45. FDC2214_IIC_Send_Byte(dat);
  46. FDC2214_IIC_Wait_Ack();
  47. FDC2214_IIC_Stop();
  48. }
  49. /*!
  50. * @brief IIC读FDC2214
  51. * @param Slve_Addr 器件地址
  52. * @param reg 寄存器
  53. * @return 寄存器值
  54. * @since v1.0
  55. * Sample usage: FDC2214_Read16(FDC2214_Addr, FDC2214_CONFIG);
  56. */
  57. uint16_t FDC2214_Read16(uint8_t Slve_Addr, uint8_t reg)
  58. {
  59. uint16_t temp;
  60. FDC2214_IIC_Start();
  61. FDC2214_IIC_Send_Byte(Slve_Addr << 1);
  62. FDC2214_IIC_Wait_Ack();
  63. FDC2214_IIC_Send_Byte(reg);
  64. FDC2214_IIC_Wait_Ack();
  65. FDC2214_IIC_Start();
  66. FDC2214_IIC_Send_Byte((Slve_Addr << 1) | 0x01);
  67. FDC2214_IIC_Wait_Ack();
  68. temp = (uint16_t)(FDC2214_IIC_Read_Byte(1) << 8);
  69. temp |= FDC2214_IIC_Read_Byte(0);
  70. FDC2214_IIC_Stop();
  71. return temp;
  72. }
  73. /*!
  74. * @brief 读取FDC2214一个通道的转换值
  75. * @param channel 通道
  76. * @param *data 读取的数据
  77. * @return 0:失败;1:成功
  78. * @since v1.0
  79. * Sample usage: FDC2214_GetChannelData(FDC2214_Channel_0, &CH0_DATA);
  80. */
  81. uint8_t FDC2214_GetChannelData(FDC2214_channel_t channel, uint32_t *data)
  82. {
  83. int16_t timeout = 100;
  84. uint8_t dateReg_H;
  85. uint8_t dateReg_L;
  86. uint8_t bitUnreadConv;
  87. uint16_t status;
  88. uint32_t dataRead;
  89. switch(channel)
  90. {
  91. case FDC2214_Channel_0:
  92. dateReg_H = FDC2214_DATA_CH0;
  93. dateReg_L = FDC2214_DATA_LSB_CH0;
  94. bitUnreadConv = 0x0008;
  95. break;
  96. case FDC2214_Channel_1:
  97. dateReg_H = FDC2214_DATA_CH1;
  98. dateReg_L = FDC2214_DATA_LSB_CH1;
  99. bitUnreadConv = 0x0004;
  100. break;
  101. case FDC2214_Channel_2:
  102. dateReg_H = FDC2214_DATA_CH2;
  103. dateReg_L = FDC2214_DATA_LSB_CH2;
  104. bitUnreadConv = 0x0002;
  105. break;
  106. case FDC2214_Channel_3:
  107. dateReg_H = FDC2214_DATA_CH3;
  108. dateReg_L = FDC2214_DATA_LSB_CH3;
  109. bitUnreadConv = 0x0001;
  110. break;
  111. }
  112. status = FDC2214_Read16(FDC2214_Addr, FDC2214_STATUS);//读取状态寄存器的值
  113. while(timeout && !(status & bitUnreadConv))//检查是否有未读数据
  114. {
  115. status = FDC2214_Read16(FDC2214_Addr, FDC2214_STATUS);
  116. timeout--;
  117. }
  118. if(timeout)
  119. {
  120. dataRead = (uint32_t)(FDC2214_Read16(FDC2214_Addr, dateReg_H) << 16);
  121. dataRead |= FDC2214_Read16(FDC2214_Addr, dateReg_L);
  122. *data = dataRead;
  123. return 1;
  124. }
  125. else
  126. {
  127. //超时
  128. return 0;
  129. }
  130. }
  131. /*!
  132. * @brief 设置FDC2214一个通道的转换时间,转换时间(tCx)=(CHx_RCOUNT?16) / fREFx。
  133. * @param channel 通道
  134. * @param rcount CHx_RCOUNT
  135. * @since v1.0
  136. * Sample usage: FDC2214_SetRcount(FDC2214_Channel_0, 0x0FFF);
  137. */
  138. void FDC2214_SetRcount(FDC2214_channel_t channel, uint16_t rcount)
  139. {
  140. if(rcount <= 0x00FF) return;
  141. switch(channel)
  142. {
  143. case FDC2214_Channel_0:
  144. FDC2214_Write16(FDC2214_Addr, FDC2214_RCOUNT_CH0, rcount);
  145. break;
  146. case FDC2214_Channel_1:
  147. FDC2214_Write16(FDC2214_Addr, FDC2214_RCOUNT_CH1, rcount);
  148. break;
  149. case FDC2214_Channel_2:
  150. FDC2214_Write16(FDC2214_Addr, FDC2214_RCOUNT_CH2, rcount);
  151. break;
  152. case FDC2214_Channel_3:
  153. FDC2214_Write16(FDC2214_Addr, FDC2214_RCOUNT_CH3, rcount);
  154. break;
  155. }
  156. }
  157. /*!
  158. * @brief 设置FDC2214一个通道的建立时间,使LC传感器可以在通道x开始转换之前稳定下来,建立时间(tSx) = (CHx_SETTLECOUNT?16) ÷ fREFx。
  159. CHx_SETTLECOUNT = 0x00, 0x01时(tSx) = 32 ÷ fREFx。
  160. * @param channel 通道
  161. * @param count CHx_SETTLECOUNT
  162. * @since v1.0
  163. * @note CHx_SETTLECOUNT > Vpk × fREFx × C × π^2 / (32 × IDRIVEX)
  164. * Sample usage: FDC2214_SetSettleCount(FDC2214_Channel_0, 0x00FF);
  165. */
  166. void FDC2214_SetSettleCount(FDC2214_channel_t channel, uint16_t count)
  167. {
  168. switch(channel)
  169. {
  170. case FDC2214_Channel_0:
  171. FDC2214_Write16(FDC2214_Addr, FDC2214_SETTLECOUNT_CH0, count);
  172. break;
  173. case FDC2214_Channel_1:
  174. FDC2214_Write16(FDC2214_Addr, FDC2214_SETTLECOUNT_CH1, count);
  175. break;
  176. case FDC2214_Channel_2:
  177. FDC2214_Write16(FDC2214_Addr, FDC2214_SETTLECOUNT_CH2, count);
  178. break;
  179. case FDC2214_Channel_3:
  180. FDC2214_Write16(FDC2214_Addr, FDC2214_SETTLECOUNT_CH3, count);
  181. break;
  182. }
  183. }
  184. /*!
  185. * @brief 设置FDC2214一个通道的的时钟频率,
  186. 差分传感器配置:
  187. 0x01 -- 传感器频率0.01MHz和8.75MHz
  188. 0x02 -- 传感器频率5MHz和10MHz
  189. 单端传感器配置:
  190. 0x01 -- 传感器频率0.01MHz和10MHz
  191. * @param channel 通道
  192. * @param frequency_select 时钟选择
  193. * @param divider 分频器,fREFx = fCLK / CHx_FREF_DIVIDER,
  194. * @note fREFx is > 4 × fSENSOR(外部LC振荡器频率)
  195. * @since v1.0
  196. * Sample usage: FDC2214_SetChannelClock(FDC2214_Channel_0, 0x01, 0xFF);
  197. */
  198. void FDC2214_SetChannelClock(FDC2214_channel_t channel, uint8_t frequency_select, uint16_t divider)
  199. {
  200. uint16_t temp = 0;
  201. temp = (uint16_t)(frequency_select << 12) | (divider & 0x03FF);
  202. CHx_FIN_SEL[channel] = frequency_select;//记录时钟选择
  203. FDC_PRINTF("Frequency_select : %d \r\n",frequency_select);
  204. fREFx[channel] = (double)ClockFrequency / divider;//记录时钟频率
  205. switch(channel)
  206. {
  207. case FDC2214_Channel_0:
  208. // DEBUG_PRINTF("CHx_FIN_SEL[0] %d \r\n",CHx_FIN_SEL[0]);
  209. // DEBUG_PRINTF("FREFx[0] : [%f] \r\n",fREFx[0]);
  210. FDC2214_Write16(FDC2214_Addr, FDC2214_CLOCK_DIVIDERS_CH0, temp);
  211. break;
  212. case FDC2214_Channel_1:
  213. FDC2214_Write16(FDC2214_Addr, FDC2214_CLOCK_DIVIDERS_CH1, temp);
  214. break;
  215. case FDC2214_Channel_2:
  216. FDC2214_Write16(FDC2214_Addr, FDC2214_CLOCK_DIVIDERS_CH2, temp);
  217. break;
  218. case FDC2214_Channel_3:
  219. FDC2214_Write16(FDC2214_Addr, FDC2214_CLOCK_DIVIDERS_CH3, temp);
  220. break;
  221. }
  222. }
  223. /*!
  224. * @brief 配置INTB引脚中断功能
  225. * @param mode 1:开中断;0:关中断
  226. * @since v1.0
  227. * Sample usage: FDC2214_SetDriveCurrent(FDC2214_Channel_0, FDC2214_Drive_Current_0_025);
  228. */
  229. void FDC2214_SetINTB(uint8_t mode)
  230. {
  231. uint16_t temp = 0;
  232. temp = FDC2214_Read16(FDC2214_Addr, FDC2214_CONFIG);
  233. temp &= 0xFF7F;
  234. if(mode)
  235. temp |= 0x0080;
  236. FDC2214_Write16(FDC2214_Addr, FDC2214_CONFIG, temp);
  237. temp = FDC2214_Read16(FDC2214_Addr, FDC2214_ERROR_CONFIG);
  238. temp &= 0xFFFE;
  239. if(mode)
  240. temp |= 0x0001;
  241. FDC2214_Write16(FDC2214_Addr, FDC2214_ERROR_CONFIG, temp);
  242. }
  243. /*!
  244. * @brief 激活FDC2214的一个通道,单通道模式
  245. * @param channel 通道
  246. * @since v1.0
  247. * Sample usage: FDC2214_SetActiveChannel(FDC2214_Channel_0);
  248. */
  249. void FDC2214_SetActiveChannel(FDC2214_channel_t channel)
  250. {
  251. uint16_t temp = 0;
  252. temp = FDC2214_Read16(FDC2214_Addr, FDC2214_CONFIG);
  253. temp &= 0x3FFF;
  254. temp |= (uint16_t)(channel << 14);
  255. FDC2214_Write16(FDC2214_Addr, FDC2214_CONFIG, temp);
  256. }
  257. /*!
  258. * @brief 设置FDC2214的工作模式:正常、睡眠。
  259. * @param mode 0:正常工作;1:睡激活模式选择。眠
  260. * @since v1.0
  261. * Sample usage: FDC2214_SetSleepMode(0);
  262. */
  263. void FDC2214_SetSleepMode(uint8_t mode)
  264. {
  265. uint16_t temp = 0;
  266. temp = FDC2214_Read16(FDC2214_Addr, FDC2214_CONFIG);
  267. temp &= 0xDFFF;
  268. if(mode)temp |= 0x2000;
  269. FDC2214_Write16(FDC2214_Addr, FDC2214_CONFIG, temp);
  270. }
  271. /*!
  272. * @brief FDC2214激活模式选择。
  273. * @param mode 0:全电流激活模式;1:低功率激活模式
  274. * @since v1.0
  275. * Sample usage: FDC2214_SetCurrentMode(1);
  276. */
  277. void FDC2214_SetCurrentMode(uint8_t mode)
  278. {
  279. uint16_t temp = 0;
  280. temp = FDC2214_Read16(FDC2214_Addr, FDC2214_CONFIG);
  281. temp &= 0xF7FF;
  282. if(mode)
  283. temp |= 0x800;
  284. FDC2214_Write16(FDC2214_Addr, FDC2214_CONFIG, temp);
  285. }
  286. /*!
  287. * @brief 设置FDC2214时钟源
  288. * @param src 0:内部时钟源;1:外部时钟源
  289. * @since v1.0
  290. * Sample usage: FDC2214_SetClockSource(1);
  291. */
  292. void FDC2214_SetClockSource(uint8_t src)
  293. {
  294. uint16_t temp = 0;
  295. temp = FDC2214_Read16(FDC2214_Addr, FDC2214_CONFIG);
  296. temp &= 0xFDFF;
  297. if(src)
  298. temp |= 0x200;
  299. FDC2214_Write16(FDC2214_Addr, FDC2214_CONFIG, temp);
  300. }
  301. /*!
  302. * @brief 高电流传感器驱动,只适用于单通道模式。
  303. * @param mode 0:正常(最大1.5mA);1:高电流传感器驱动(>1.5mA)
  304. * @since v1.0
  305. * Sample usage: FDC2214_SetHighCurrentMode(0);
  306. */
  307. void FDC2214_SetHighCurrentMode(uint8_t mode)
  308. {
  309. uint16_t temp = 0;
  310. temp = FDC2214_Read16(FDC2214_Addr, FDC2214_CONFIG);
  311. temp &= 0xFFBF;
  312. if(mode)
  313. temp |= 0x40;
  314. FDC2214_Write16(FDC2214_Addr, FDC2214_CONFIG, temp);
  315. }
  316. /*!
  317. * @brief 设置FDC2214的MUX CONFIG寄存器
  318. * @param autoscan 自动扫描模式 0:关闭,1:打开
  319. * @param channels 自动扫描通道
  320. * @param bandwidth 数字滤波器带宽,大于外部LC振荡器频率
  321. * @since v1.0
  322. * Sample usage: FDC2214_SetMUX_CONFIG(1, FDC2214_Channel_Sequence_0_1_2, FDC2214_Bandwidth_10M);
  323. */
  324. void FDC2214_SetMUX_CONFIG(uint8_t autoscan, FDC2214_channel_sequence_t channels, FDC2214_filter_bandwidth_t bandwidth)
  325. {
  326. uint16_t temp = 0;
  327. if(autoscan)
  328. {
  329. temp = (uint16_t)(autoscan << 15) | (channels << 13) | 0x0208 | bandwidth;
  330. }
  331. else
  332. {
  333. temp = 0x0208 | bandwidth;
  334. }
  335. FDC2214_Write16(FDC2214_Addr, FDC2214_MUX_CONFIG, temp);
  336. }
  337. /*!
  338. * @brief 传感器复位
  339. * @since v1.0
  340. * Sample usage: FDC2214_Reset();
  341. */
  342. void FDC2214_Reset(void)
  343. {
  344. FDC2214_Write16(FDC2214_Addr, FDC2214_RESET_DEV, 0x8000);
  345. }
  346. /*!
  347. * @brief 设置FDC2214的一个通道传感器驱动电流,确保振荡幅度在1.2V和1.8V之间。
  348. * @param channel 通道
  349. * @param current 电流大小
  350. * @since v1.0
  351. * Sample usage: FDC2214_SetDriveCurrent(FDC2214_Channel_0, FDC2214_Drive_Current_0_025);
  352. */
  353. void FDC2214_SetDriveCurrent(FDC2214_channel_t channel, FDC2214_drive_current_t current)
  354. {
  355. uint16_t temp = 0;
  356. temp = (uint16_t)(current << 11);
  357. switch(channel)
  358. {
  359. case FDC2214_Channel_0:
  360. FDC2214_Write16(FDC2214_Addr, FDC2214_DRIVE_CURRENT_CH0, temp);
  361. break;
  362. case FDC2214_Channel_1:
  363. FDC2214_Write16(FDC2214_Addr, FDC2214_DRIVE_CURRENT_CH1, temp);
  364. break;
  365. case FDC2214_Channel_2:
  366. FDC2214_Write16(FDC2214_Addr, FDC2214_DRIVE_CURRENT_CH2, temp);
  367. break;
  368. case FDC2214_Channel_3:
  369. FDC2214_Write16(FDC2214_Addr, FDC2214_DRIVE_CURRENT_CH3, temp);
  370. break;
  371. }
  372. }
  373. /*!
  374. * @brief 计算传感器频率
  375. * @param channel 通道
  376. * @param datax 读取的转换值
  377. * @return 频率,单位Hz
  378. * @since v1.0
  379. * Sample usage: FDC2214_CalculateFrequency(FDC2214_Channel_0, 0xFF);
  380. */
  381. double FDC2214_CalculateFrequency(FDC2214_channel_t channel, uint32_t datax)
  382. {
  383. double frequency = 0.0;
  384. frequency = (double)(CHx_FIN_SEL[channel] * fREFx[channel] * datax) / 268435456.0;//2^28 0.298*data
  385. // DEBUG_PRINTF("CHx_FIN_SEL[0] %d \r\n",CHx_FIN_SEL[0]);
  386. return frequency;
  387. }
  388. /*!
  389. * @brief 计算外部电容大小
  390. * @param frequency 频率大小,单位Hz
  391. * @param inductance 板载电感大小,单位uH
  392. * @param capacitance 板载电容大小,单位pF
  393. * @return 外部电容大小,单位pF
  394. * @since v1.0
  395. * Sample usage: FDC2214_CalculateCapacitance(FDC2214_Channel_0, 6000000, 18, 33);
  396. */
  397. double FDC2214_CalculateCapacitance(double frequency, float inductance, float capacitance)
  398. {
  399. double cap = 0.0;
  400. cap = (double)(1000000000000000000/ (inductance * (2 * PI * frequency) * (2 * PI * frequency)))-capacitance; //
  401. return cap;
  402. }
  403. /*!
  404. * @brief FDC2214初始化函数
  405. * @return 1:成功;0:失败
  406. * @since v1.0
  407. * Sample usage: FDC2214_Init();
  408. * RCOUNT:值越大,分辨率越高,但速度越慢。5000 合理,建议范围 2000 ~ 10000
  409. * SETTLECOUNT:不能太小。建议 settleCount = fSensor / fRef * 10,可先设为 500 或 1000 测试。实际电路中电容越大、阻抗越高需要越大的 settleCount。
  410. * FDC2214_Drive_Current_0_081:电容值小/感应距离短时,低电流更稳定。电容大或探测距离远时,可尝试 0.146mA、0.206mA 等更大电流
  411. */
  412. uint8_t FDC2214_Init(void)
  413. {
  414. FDC_PRINTF("\r\n=== FDC2214_deviceID ===\r\n");
  415. uint16_t deviceID = 0;
  416. deviceID = FDC2214_Read16(FDC2214_Addr, FDC2214_DEVICE_ID);//读器件ID
  417. FDC_PRINTF("FDC2214_deviceID : 0x%02x \r\n" ,deviceID );
  418. uint16_t RCOUNT = 20000; // 5000对应2000us 转换周期
  419. uint16_t SETTLECOUNT = 4000; // 200对应200 cycles 等待时间
  420. if(deviceID == FDC2214_ID)
  421. {
  422. FDC2214_Reset();
  423. // 通道0
  424. FDC2214_SetRcount(FDC2214_Channel_0, RCOUNT);// 转换周期
  425. FDC2214_SetSettleCount(FDC2214_Channel_0, SETTLECOUNT);// cycles 等待时间
  426. FDC2214_SetChannelClock(FDC2214_Channel_0, 0x02, 1);//设置时钟分频,1分频,40MHz
  427. // // 通道1
  428. // FDC2214_SetRcount(FDC2214_Channel_1, RCOUNT);//2000us 转换周期
  429. // FDC2214_SetSettleCount(FDC2214_Channel_1, SETTLECOUNT);//200 cycles 等待时间
  430. // FDC2214_SetChannelClock(FDC2214_Channel_1, 1, 1);//设置时钟分频,1分频,40MHz
  431. // // 通道2
  432. // FDC2214_SetRcount(FDC2214_Channel_2, RCOUNT);//2000us 转换周期
  433. // FDC2214_SetSettleCount(FDC2214_Channel_2, SETTLECOUNT);//200 cycles 等待时间
  434. // FDC2214_SetChannelClock(FDC2214_Channel_2, 1, 1);//设置时钟分频,1分频,40MHz
  435. // // 通道3
  436. // FDC2214_SetRcount(FDC2214_Channel_3, RCOUNT);//2000us 转换周期
  437. // FDC2214_SetSettleCount(FDC2214_Channel_3, SETTLECOUNT);//200 cycles 等待时间
  438. // FDC2214_SetChannelClock(FDC2214_Channel_3, 1, 1);//设置时钟分频,1分频,40MHz
  439. FDC2214_SetINTB(0);//关闭INTB中断
  440. FDC2214_SetCurrentMode(1);//全电流激活模式
  441. FDC2214_SetClockSource(1);//1外部时钟源 0内部晶振
  442. FDC2214_SetHighCurrentMode(0);//0:正常(最大1.5mA);1:高电流传感器驱动(>1.5mA)
  443. FDC2214_SetMUX_CONFIG(1, FDC2214_Channel_Sequence_0_1, FDC2214_Bandwidth_3_3M); // 0关闭自动扫描,设置带宽, 带宽调小,抗干扰性更强
  444. FDC2214_SetActiveChannel(FDC2214_Channel_0);//激活通道0
  445. // FDC2214_SetMUX_CONFIG(1, FDC2214_Channel_Sequence_0_1, FDC2214_Bandwidth_10M);//开启01通道采集,打开自动扫描,10MHz带宽
  446. // FDC2214_SetMUX_CONFIG(1, FDC2214_Channel_Sequence_0_1_2_3, FDC2214_Bandwidth_3_3M);//开启0123通道采集,打开自动扫描,10MHz带宽
  447. FDC2214_SetDriveCurrent(FDC2214_Channel_0, FDC2214_Drive_Current_0_356);//通道0驱动电流
  448. // FDC2214_SetDriveCurrent(FDC2214_Channel_1, FDC2214_Drive_Current_1_006);//通道1驱动电流
  449. // FDC2214_SetDriveCurrent(FDC2214_Channel_2, FDC2214_Drive_Current_1_006);//通道2驱动电流
  450. // FDC2214_SetDriveCurrent(FDC2214_Channel_3, FDC2214_Drive_Current_1_006);//通道3驱动电流
  451. FDC2214_SetSleepMode(0);//退出睡眠状态,开始工作
  452. FDC_PRINTF("FDC2214 Init OK!\r\n");
  453. FDC_PRINTF("============================\r\n");
  454. osDelay(100);
  455. return 0;
  456. }
  457. else
  458. {
  459. FDC_PRINTF("FDC2214 Init Failed!! \r\n");
  460. FDC_PRINTF("============================\r\n");
  461. return 1;
  462. }
  463. }
  464. /*
  465. long filterread(FDC2214_channel_t channel, uint32_t *data)
  466. {
  467. uint16_t i=0;
  468. long result=0;
  469. long Data[20],Sum=0,max=0,min=0;
  470. for(i=0; i<=19; i++)
  471. {
  472. if(FDC2214_GetChannelData(channel,data)==1)
  473. {
  474. Data[i]=*data;
  475. }
  476. else
  477. {
  478. i--;
  479. }
  480. delay_us(100);
  481. }
  482. Sum=Data[0];
  483. max=Data[0];
  484. min=Data[0];
  485. for(i=1; i<=19; i++)
  486. {
  487. if(max<Data[i])max=Data[i];
  488. if(min>Data[i])min=Data[i];
  489. Sum=Data[i]+Sum;//累加
  490. }
  491. result=(Sum-max-min)/18;
  492. return result;
  493. }
  494. */
  495. long filterread(FDC2214_channel_t channel, uint32_t *data)
  496. {
  497. uint16_t i = 0, try_count = 0;
  498. long result = 0;
  499. long Data[20], Sum = 0, max = 0, min = 0;
  500. while (i < 20 && try_count < 100)
  501. {
  502. try_count++;
  503. if (FDC2214_GetChannelData(channel, data) == 1)
  504. {
  505. Data[i++] = *data;
  506. }
  507. delay_us(100);
  508. }
  509. if (i < 20) {
  510. DEBUG_PRINTF("FDC2214 data read timeout! Only %d samples.\r\n", i);
  511. return -1; // 读取失败
  512. }
  513. Sum = Data[0];
  514. max = Data[0];
  515. min = Data[0];
  516. for (i = 1; i < 20; i++)
  517. {
  518. if (max < Data[i]) max = Data[i];
  519. if (min > Data[i]) min = Data[i];
  520. Sum += Data[i];
  521. }
  522. result = (Sum - max - min) / 18;
  523. return result;
  524. }
  525. double getcap(uint8_t channel,double dg,double dr)
  526. {
  527. double Cap=0.0;
  528. switch(channel)
  529. {
  530. case 0:
  531. ch0=filterread(FDC2214_Channel_0,&ch0);
  532. FRE[0]=FDC2214_CalculateFrequency(FDC2214_Channel_0,ch0);
  533. // DEBUG_PRINTF("\r\nCH0 RAW: [%u], Frequency: [%lf] MHz", ch0, FRE[0]/1000000);
  534. Cap=FDC2214_CalculateCapacitance(FRE[0], dg, dr);
  535. break;
  536. case 1:
  537. ch1=filterread(FDC2214_Channel_1,&ch1);
  538. FRE[1]=FDC2214_CalculateFrequency(FDC2214_Channel_1,ch1);
  539. DEBUG_PRINTF("CH1 RAW = %u, Frequency = %lf KHz\r\n", ch1, FRE[1]/1000);
  540. Cap=FDC2214_CalculateCapacitance(FRE[1], dg, dr);
  541. break;
  542. case 2:
  543. ch2=filterread(FDC2214_Channel_2,&ch2);
  544. FRE[2]=FDC2214_CalculateFrequency(FDC2214_Channel_2,ch2);
  545. DEBUG_PRINTF("CH2 RAW = %u, Frequency = %lf KHz\r\n", ch2, FRE[2]/1000);
  546. Cap=FDC2214_CalculateCapacitance(FRE[2], dg, dr);
  547. break;
  548. case 3:
  549. ch3=filterread(FDC2214_Channel_3,&ch3);
  550. FRE[3]=FDC2214_CalculateFrequency(FDC2214_Channel_3,ch3);
  551. DEBUG_PRINTF("CH3 RAW = %u, Frequency = %lf KHz\r\n", ch3, FRE[3]/1000);
  552. Cap=FDC2214_CalculateCapacitance(FRE[3], dg, dr);
  553. break;
  554. }
  555. return Cap;
  556. }