FDC2212电容传感器
FDC2212电容传感器
- 前言
- 一、原理图
- 二、代码
- 总结
前言
关于FDC2212电容传感器,TI有参考设计手册“Capacitive-Based Liquid Level Sensing Sensor Reference Design”。讲述了电容传感器的计算,设计,实现液位高度探测,可以应用于咖啡机,洗衣机,实验室自动化,生物医疗等领域。
一、原理图
STM32主控,FDC2212,LDO
二、代码
FDC2212代码如下(示例):
#include "fdc2214.h"
#include <math.h>int8_t ec = 0;
int8_t ret = 0;/* data buffer */
uint8_t buffer[20];
uint64_t channel_freq_data[4];
uint64_t channel_freq_hz[4];union FDC2214_REG data_wr;
union FDC2214_REG data_rb;uint8_t fdc2214_Check(void)
{if(IIC_CheckAddress())return 1;elsereturn 0;
}int8_t DRV_FDC2214_WriteReg(uint8_t Reg, uint8_t *pData_wr, uint16_t byteSize)
{if(HAL_I2C_Mem_Write(&hi2c1, (FDC2214_ADDR << 1), Reg, I2C_MEMADD_SIZE_8BIT, pData_wr, byteSize, 100) == HAL_OK){return HAL_OK;}else{return HAL_ERROR;}
}int8_t DRV_FDC2214_ReadReg(uint8_t Reg, uint8_t *pData_wr, uint16_t byteSize)
{if(HAL_I2C_Mem_Read(&hi2c1, (FDC2214_ADDR << 1), Reg, I2C_MEMADD_SIZE_8BIT, pData_wr, byteSize, 100) == HAL_OK){return HAL_OK;}else{return HAL_ERROR;}
}int8_t DRV_FDC2214_Config(void)
{/*REG_RESET_DEV: reset the device*/data_wr.byte[0] = (REG_RESET_DEV_CFG & 0xff00) >> 8;data_wr.byte[1] = REG_RESET_DEV_CFG & 0x00ff;ret = DRV_FDC2214_WriteReg(REG_RESET_DEV, (uint8_t *)&data_wr, 2);HAL_Delay(10);/*REG_CLOCK_DIVIDERS_CH0/1/2/3*/data_wr.byte[0] = (REG_CLOCK_DIVIDERS_CHx_CFG & 0xff00) >> 8;data_wr.byte[1] = REG_CLOCK_DIVIDERS_CHx_CFG & 0x00ff;ret = DRV_FDC2214_WriteReg(REG_CLOCK_DIVIDERS_CH0, (uint8_t *)&data_wr, 2);HAL_Delay(1);data_rb.all = 0;ret = DRV_FDC2214_ReadReg(REG_CLOCK_DIVIDERS_CH0, (uint8_t *)&data_rb, 2);if(data_wr.all != data_rb.all){ec |= FDC_CONF_EC2;}ret = DRV_FDC2214_WriteReg(REG_CLOCK_DIVIDERS_CH1, (uint8_t *)&data_wr, 2);HAL_Delay(1);data_rb.all = 0;ret = DRV_FDC2214_ReadReg(REG_CLOCK_DIVIDERS_CH1, (uint8_t *)&data_rb, 2);if(data_wr.all != data_rb.all){ec |= FDC_CONF_EC2;}ret = DRV_FDC2214_WriteReg(REG_CLOCK_DIVIDERS_CH2, (uint8_t *)&data_wr, 2);HAL_Delay(1);data_rb.all = 0;ret = DRV_FDC2214_ReadReg(REG_CLOCK_DIVIDERS_CH2, (uint8_t *)&data_rb, 2);if(data_wr.all != data_rb.all){ec |= FDC_CONF_EC2;}ret = DRV_FDC2214_WriteReg(REG_CLOCK_DIVIDERS_CH3, (uint8_t *)&data_wr, 2);HAL_Delay(1);data_rb.all = 0;ret = DRV_FDC2214_ReadReg(REG_CLOCK_DIVIDERS_CH3, (uint8_t *)&data_rb, 2);if(data_wr.all != data_rb.all){ec |= FDC_CONF_EC2;}/*REG_DRIVE_CURRENT_CH0/1/2/3 */data_wr.byte[0] = (REG_DRIVE_CURRENT_CHx_CFG & 0xff00) >> 8;data_wr.byte[1] = REG_DRIVE_CURRENT_CHx_CFG & 0x00ff;ret = DRV_FDC2214_WriteReg(REG_DRIVE_CURRENT_CH0, (uint8_t *)&data_wr, 2);HAL_Delay(1);data_rb.all = 0;ret = DRV_FDC2214_ReadReg(REG_DRIVE_CURRENT_CH0, (uint8_t *)&data_rb, 2);if((data_wr.all & 0xf800) != (data_rb.all & 0xf800)){ec |= FDC_CONF_EC5;}ret = DRV_FDC2214_WriteReg(REG_DRIVE_CURRENT_CH1, (uint8_t *)&data_wr, 2);HAL_Delay(1);data_rb.all = 0;ret = DRV_FDC2214_ReadReg(REG_DRIVE_CURRENT_CH1, (uint8_t *)&data_rb, 2);if((data_wr.all & 0xf800) != (data_rb.all & 0xf800)){ec |= FDC_CONF_EC5;}ret = DRV_FDC2214_WriteReg(REG_DRIVE_CURRENT_CH2, (uint8_t *)&data_wr, 2);HAL_Delay(1);data_rb.all = 0;ret = DRV_FDC2214_ReadReg(REG_DRIVE_CURRENT_CH2, (uint8_t *)&data_rb, 2);if((data_wr.all & 0xf800) != (data_rb.all & 0xf800)){ec |= FDC_CONF_EC5;}ret = DRV_FDC2214_WriteReg(REG_DRIVE_CURRENT_CH3, (uint8_t *)&data_wr, 2);HAL_Delay(1);data_rb.all = 0;ret = DRV_FDC2214_ReadReg(REG_DRIVE_CURRENT_CH3, (uint8_t *)&data_rb, 2);if((data_wr.all & 0xf800) != (data_rb.all & 0xf800)){ec |= FDC_CONF_EC5;}/*REG_SETTLECOUNT_CH0/1/2/3*/data_wr.byte[0] = (REG_SETTLECOUNT_CHx_CFG & 0xff00) >> 8;data_wr.byte[1] = REG_SETTLECOUNT_CHx_CFG & 0x00ff;ret = DRV_FDC2214_WriteReg(REG_SETTLECOUNT_CH0, (uint8_t *)&data_wr, 2);HAL_Delay(1);data_rb.all = 0;ret = DRV_FDC2214_ReadReg(REG_SETTLECOUNT_CH0, (uint8_t *)&data_rb, 2);if(data_wr.all != data_rb.all){ec |= FDC_CONF_EC1;}ret = DRV_FDC2214_WriteReg(REG_SETTLECOUNT_CH1, (uint8_t *)&data_wr, 2);HAL_Delay(1);data_rb.all = 0;ret = DRV_FDC2214_ReadReg(REG_SETTLECOUNT_CH1, (uint8_t *)&data_rb, 2);if(data_wr.all != data_rb.all){ec |= FDC_CONF_EC1;}ret = DRV_FDC2214_WriteReg(REG_SETTLECOUNT_CH2, (uint8_t *)&data_wr, 2);HAL_Delay(1);data_rb.all = 0;ret = DRV_FDC2214_ReadReg(REG_SETTLECOUNT_CH2, (uint8_t *)&data_rb, 2);if(data_wr.all != data_rb.all){ec |= FDC_CONF_EC1;}ret = DRV_FDC2214_WriteReg(REG_SETTLECOUNT_CH3, (uint8_t *)&data_wr, 2);HAL_Delay(1);data_rb.all = 0;ret = DRV_FDC2214_ReadReg(REG_SETTLECOUNT_CH3, (uint8_t *)&data_rb, 2);if(data_wr.all != data_rb.all){ec |= FDC_CONF_EC1;}/*REG_RCOUNT_CH0/1/2/3*/data_wr.byte[0] = (REG_RCOUNT_CHx_CFG & 0xff00) >> 8;data_wr.byte[1] = REG_RCOUNT_CHx_CFG & 0x00ff;ret = DRV_FDC2214_WriteReg(REG_RCOUNT_CH0, (uint8_t *)&data_wr, 2);HAL_Delay(1);data_rb.all = 0;ret = DRV_FDC2214_ReadReg(REG_RCOUNT_CH0, (uint8_t *)&data_rb, 2);if(data_wr.all != data_rb.all){ec |= FDC_CONF_EC0;}ret = DRV_FDC2214_WriteReg(REG_RCOUNT_CH1, (uint8_t *)&data_wr, 2);HAL_Delay(1);data_rb.all = 0;ret = DRV_FDC2214_ReadReg(REG_RCOUNT_CH1, (uint8_t *)&data_rb, 2);if(data_wr.all != data_rb.all){ec |= FDC_CONF_EC0;}ret = DRV_FDC2214_WriteReg(REG_RCOUNT_CH2, (uint8_t *)&data_wr, 2);HAL_Delay(1);data_rb.all = 0;ret = DRV_FDC2214_ReadReg(REG_RCOUNT_CH2, (uint8_t *)&data_rb, 2);if(data_wr.all != data_rb.all){ec |= FDC_CONF_EC0;}ret = DRV_FDC2214_WriteReg(REG_RCOUNT_CH3, (uint8_t *)&data_wr, 2);HAL_Delay(1);data_rb.all = 0;ret = DRV_FDC2214_ReadReg(REG_RCOUNT_CH3, (uint8_t *)&data_rb, 2);if(data_wr.all != data_rb.all){ec |= FDC_CONF_EC0;}/*REG_ERROR_CONFIG:*/data_wr.byte[0] = (REG_ERROR_CONFIG_CFG & 0xff00) >> 8;data_wr.byte[1] = REG_ERROR_CONFIG_CFG & 0x00ff;ret = DRV_FDC2214_WriteReg(REG_ERROR_CONFIG, (uint8_t *)&data_wr, 2);HAL_Delay(1);data_rb.all = 0;ret = DRV_FDC2214_ReadReg(REG_ERROR_CONFIG, (uint8_t *)&data_rb, 2);if((data_wr.all & 0x01) == (data_rb.all & 0x01)){ec |= FDC_CONF_EC0;}/*REG_MUX_CONFIG*/data_wr.byte[0] = (REG_MUX_CONFIG_CFG & 0xff00) >> 8;data_wr.byte[1] = REG_MUX_CONFIG_CFG & 0x00ff;ret = DRV_FDC2214_WriteReg(REG_MUX_CONFIG, (uint8_t *)&data_wr, 2);HAL_Delay(1);data_rb.all = 0;ret = DRV_FDC2214_ReadReg(REG_MUX_CONFIG, (uint8_t *)&data_rb, 2);if((data_wr.all & 0xe007) == (data_rb.all & 0xe007)){ec |= FDC_CONF_EC0;}/*REG_CONFIG*/data_wr.byte[0] = (REG_CONFIG_CFG & 0xff00) >> 8;data_wr.byte[1] = REG_CONFIG_CFG & 0x00ff;ret = DRV_FDC2214_WriteReg(REG_CONFIG, (uint8_t *)&data_wr, 2);HAL_Delay(1);data_rb.all = 0;ret = DRV_FDC2214_ReadReg(REG_CONFIG, (uint8_t *)&data_rb, 2);if((data_wr.all & 0xffc0) != (data_rb.all & 0xffc0)){ec |= FDC_CONF_EC6;}return ec;
}void get_channel_cap_pf(double* channel_cap_pf)
{while(GPIO_PIN_SET == HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_9));
// if(GPIO_PIN_SET == HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_9))DRV_FDC2214_ReadReg(REG_DATA_CH0, buffer, 2);channel_freq_data[0] = (buffer[0] << 8) + buffer[1];DRV_FDC2214_ReadReg(REG_DATA_LSB_CH0, buffer, 2);channel_freq_data[0] = (channel_freq_data[0] << 16) + (buffer[0] << 8) + buffer[1];channel_freq_hz[0] = channel_freq_data[0] * CRYSTAL_FREQ_HZ >> 28;channel_cap_pf[0] = pow(10, 12) / (pow(2 * PI * channel_freq_hz[0], 2) * INDUCTANCE_UH * pow(10, -6));DRV_FDC2214_ReadReg(REG_DATA_CH1, buffer, 2);channel_freq_data[1] = (buffer[0] << 8) + buffer[1];DRV_FDC2214_ReadReg(REG_DATA_LSB_CH1, buffer, 2);channel_freq_data[1] = (channel_freq_data[1] << 16) + (buffer[0] << 8) + buffer[1];channel_freq_hz[1] = channel_freq_data[1] * CRYSTAL_FREQ_HZ >> 28;channel_cap_pf[1] = pow(10, 12) / (pow(2 * PI * channel_freq_hz[1], 2) * INDUCTANCE_UH * pow(10, -6));DRV_FDC2214_ReadReg(REG_DATA_CH2, buffer, 2);channel_freq_data[2] = (buffer[0] << 8) + buffer[1];DRV_FDC2214_ReadReg(REG_DATA_LSB_CH2, buffer, 2);channel_freq_data[2] = (channel_freq_data[2] << 16) + (buffer[0] << 8) + buffer[1];channel_freq_hz[2] = channel_freq_data[2] * CRYSTAL_FREQ_HZ >> 28;channel_cap_pf[2] = pow(10, 12) / (pow(2 * PI * channel_freq_hz[2], 2) * INDUCTANCE_UH * pow(10, -6));DRV_FDC2214_ReadReg(REG_DATA_CH3, buffer, 2);channel_freq_data[3] = (buffer[0] << 8) + buffer[1];DRV_FDC2214_ReadReg(REG_DATA_LSB_CH3, buffer, 2);channel_freq_data[3] = (channel_freq_data[3] << 16) + (buffer[0] << 8) + buffer[1];channel_freq_hz[3] = channel_freq_data[3] * CRYSTAL_FREQ_HZ >> 28;channel_cap_pf[3] = pow(10, 12) / (pow(2 * PI * channel_freq_hz[3], 2) * INDUCTANCE_UH * pow(10, -6));DRV_FDC2214_ReadReg(REG_STATUS, buffer, 2);
}
总结
本文中设计的FDC2电容传感器可以读取外置电容数值,测量液位高度。FDC2212扩展应用领域包括纸张计数,手势控制等。
FDC2212电容传感器相关推荐
- FDC系列电容传感器及FDC2214使用要点
陈拓 2021/02/21-2021/02/21 1. 概述 电容式传感是一种低功耗.低成本且高分辨率的非接触式感测技术, 适用于从接近检测.手势识别到远程液位感测的各项应用.电容式传感系统中的传感器 ...
- 维斯乐乐高机器人_成为智能机器人服装检测人体细微运动的新型高度灵敏柔性电容传感器...
最近,来自美国哈佛大学维斯生物启发工程研究所和约翰·保尔森工程和应用科学学院的研究团队创造出一种高度灵敏的柔性电容传感器.它由硅胶和织物组成,能够随着人体运动和弯曲,准确自如地监测人体运动情况. 如今 ...
- 电容传感器FDC2214单通道应用寄存器计算
陈拓 2021/03/10-2021/03/14 1. 概述 在<FDC系列电容传感器及FDC2214使用要点> https://zhuanlan.zhihu.com/p/35348180 ...
- 用ESP8266_RTOS_SDK v3的I2C控制电容传感器FDC2214
陈拓 2021/02/09-2021/02/19 1. 概述 电容式传感是一种低功耗.低成本且高分辨率的非接触式感测技术, 适用于从接近检测.手势识别到远程液位感测的各项应用.电容式传感系统中的传感器 ...
- FDC2214——电容传感器芯片的使用与配置(STM32控制)
这里介绍Ti公司的一款低功耗高精度的电容传感器芯片FDC2214,这里我们主要讲的是其简单配置及其使用. 以下大多数的图片都来自于FDC2214的芯片手册,本人只是用来讲解,不做它用.(如有更多需要, ...
- 电容传感器FDC2214计算工具FDC_Tools-development5的使用
陈拓 2021/03/14-2021/03/15 1. 概述 在 <FDC系列电容传感器及FDC2214使用要点> https://zhuanlan.zhihu.com/p/3534818 ...
- 动画演示电容工作原理、电容传感器原理
1.电容充放电实验 2.电容工作原理 3.电容滤波电路工作原理 4.电容式液位计 5.电容式传声器工作原理 6.电容式液位计原理 7.电容传感器原理 8.电容式耳机原理 9.湿敏电容原理 10.电容加 ...
- 基于电容传感器的压力检测系统的设计
基于电容传感器的压力检测系统的设计 本系统以电容式传感器为压力感应元件,将压力信号转换为相应的电信号,经ADC0809模数转化芯片将电信号转化为数学信号再经单片机在输出端显示电感式传感器所受到的压力值 ...
- 动图|演示电容和电容传感器原理,简单明了!
1.电容充放电实验 2.电容工作原理 3.电容滤波电路工作原理 4.电容式液位计 5.电容式传声器工作原理 6.电容式液位计原理 7.电容传感器原理 8.电容式耳机原理 9.湿敏电容原理 10.电容加 ...
最新文章
- 皮一皮:谁来解释下一无所有的字典含义?
- java entry
- hibernate中一对多关系的映射
- 计算机二级证书如何考取,计算机二级证书怎么领 考试成绩怎么算
- 关于开发工具环境准备事项作为故事来处理的对话
- 什么是 TypeScript 的 Module Augmentation
- JS类似Java String.format的函数
- 比赛2016年暑假集训盲打首秀赛结果
- C++中用函数模板实现和优化抽象操作
- testng查看覆盖率_使用Cobertura统计单元测试覆盖率
- vector中resize和reserve接口的异同
- hbase 使用disruptor_一条数据的HBase之旅,简明HBase入门教程-Write全流程
- ROS入门 SLAM
- quartus仿真27:JK触发器构成的同步十进制可逆计数器(分析)
- 2021泰迪杯B题数据处理4.1
- 如何走出创新者的窘境?走向2049
- paxos算法例子图解
- php 的一元二次方程_php扩展 求解一元二次方程
- word maze 单词迷宫 (java语言编写)
- 荣耀绽放 | 白玉兰酒店荣膺金光奖“中国发展潜力酒店品牌”奖项
热门文章
- 计算机无法登录网页,如果无法打开192.168.1.100登录页面该怎么办? 192.168.1
- LGO 软件静态后处理及坐标转换操作流程
- CG/hlsl 内置函数
- 深入解读A/B 测试的统计学原理
- 程序帝国四大操作之单表修改
- HDLBits-Circuits学习小结(六)移位寄存器(shift registers)
- 用友erp沙盘_关于ERP培训,能聊的那些事。
- VS+QT 无法打开源文件解决方案
- SpringBoot前后端分离项目中如何制作前端jar包(类似swaggerUI前端jar包制作方法)
- 用软件构造的思维理解猴子摘香蕉问题