【英飞凌PSOC 4000T DIY】2、基于CapSense的液位检测实验
# 一、液位检测DEMOCY8CPROTO-040T-MS提供了基于CapSense的液位检测应用,可以通过project creater拉取
!(data/attachment/forum/202504/14/130852x8j1yu7huzwyynh0.png "7.png")
下面对生成的代码进行解读。
## 1. 初始化和设置
```
/* Initialize the device and board peripherals */
result = cybsp_init();
/* Board init failed. Stop program execution */
if (result != CY_RSLT_SUCCESS)
{
CY_ASSERT(CY_ASSERT_FAILED);
}
```
* 初始化开发板和外围设备
*
```
/* Enable global interrupts */
__enable_irq();
```
* 启用全局中断
```
/* Initialize EZI2C */
initialize_capsense_tuner();
/* Initialize MSC CAPSENSE */
initialize_capsense();
```
* 初始化EZI2C接口(用于与CapSense Tuner通信)
* 初始化MSC (Mutual-Sensing Capacitance) CapSense功能
## 2. 主循环
主循环中执行以下操作:
```
/* Scan the normal Liquid Level Widget */
Cy_CapSense_ScanWidget(CY_CAPSENSE_LIQUIDLEVEL0_WDGT_ID, &cy_capsense_context);
/* Wait until the scan is finished */
while(Cy_CapSense_IsBusy(&cy_capsense_context)) {}
```
* 扫描常规液位部件(widget)
* 等待扫描完成
```
/* Scan the Foam Rejection Widget */
Cy_CapSense_ScanWidget(CY_CAPSENSE_LIQUIDLEVEL0_FR_WDGT_ID, &cy_capsense_context);
/* Wait until the scan is finished */
while(Cy_CapSense_IsBusy(&cy_capsense_context)) {}
```
* 扫描带泡沫抑制功能的液位部件
* 等待扫描完成
```
/* Process all th widgets */
Cy_CapSense_ProcessAllWidgets(&cy_capsense_context);
```
* 处理所有部件的数据
```
/* Send capsense data to the Tuner */
Cy_CapSense_RunTuner(&cy_capsense_context);
```
* 将CapSense数据发送到Tuner工具(用于调试和可视化)
```
/* store the liquid level before and after foam rejection */
level_wo_FR = CY_CAPSENSE_LIQUIDLEVEL0_PTRPOSITION_VALUE->x;
level_w_FR = CY_CAPSENSE_LIQUIDLEVEL0_FR_PTRPOSITION_VALUE->x;
```
* 存储泡沫抑制前和泡沫抑制后的液位值
# 二、使用CAOSEBSE Tuner进行实验观察和调试
为了和CAOSEBSE Tuner通信,SW2需拨到I2C
!(data/attachment/forum/202504/14/133208dg9g9gsj9868ywbg.png "9.png")
!(data/attachment/forum/202504/14/131422shz0a050l5vks353.png "8.png")
通过quick panel进入CAOSEBSE Tuner
!(https://bbs.21ic.com/data/attachment/forum/202504/14/131559lnv8eeyynexev7ql.png "5.png")
上面最左边有3个图标,第一是配置,第二个是连接,第三个是运行,点击配置弹出:
!(https://bbs.21ic.com/data/attachment/forum/202504/14/131552xgw4sw41ws4otosx.png "4.png")
选择I2C,其他参数如上。然后依次点击连接、运行,就可以进行调试了。
下面是一些截图,大家自行摸索吧。!(https://bbs.21ic.com/data/attachment/forum/202504/14/131527ho3svess7yek3wyb.png "2.png")
!(https://bbs.21ic.com/data/attachment/forum/202504/14/131546lvfvluelezeenfid.png "3.png")
!(data/attachment/forum/202504/14/131642k5egkzam6td56e6q.png "6.png")
下面是校准界面,校准后可以保存到工程中,为下一次编译做准备。
!(data/attachment/forum/202504/14/131604fp8ghfjy6jbj5wgg.png "1.png")
简单的利用这个工具,进行液位测量
!(data/attachment/forum/202504/14/132516o66mp2zihvpp9m2e.jpg "1.jpg")
# 三、增加串口打印液位结果功能
Device Configurator中
!(data/attachment/forum/202504/14/135831qpzd5b1c4np1zmui.png "10.png")
取消I2C配置,这个和UART冲突了(P2_2、P2_3)。
将SCB_0配置为UART-1.0
!(data/attachment/forum/202504/14/135845roywwaz0q56745i0.png "11.png")
配置一个921.4的时钟用于UART
!(data/attachment/forum/202504/14/135859huuii7302eezjjib.png "12.png")
UART的配置,时钟,RX、TX
!(data/attachment/forum/202504/14/135921rqgbqngwb2ak2swq.png "13.png")
**修改main.c**
将所有了capsense\_tuner 、i2c有关的部分注释掉,不再用TUNER调试了,将P2_2、P2_3分配给UART
改完的main
```java
int main(void)
{
cy_rslt_t result;
cy_stc_scb_uart_context_t CYBSP_UART_context;
char buf;
/* Initialize the device and board peripherals */
result = cybsp_init();
/* Board init failed. Stop program execution */
if (result != CY_RSLT_SUCCESS)
{
CY_ASSERT(CY_ASSERT_FAILED);
}
/* Configure and enable the UART peripheral */
Cy_SCB_UART_Init(scb_0_HW, &scb_0_config, &CYBSP_UART_context);
Cy_SCB_UART_Enable(scb_0_HW);
/* Enable global interrupts */
__enable_irq();
/* Send a string over serial terminal */
Cy_SCB_UART_PutString(scb_0_HW, "UART INITr\n");
/* Initialize EZI2C */
//initialize_capsense_tuner();
/* Initialize MSC CAPSENSE */
initialize_capsense();
for (;;)
{
uint32_t level_w_FR, level_wo_FR;
/* Scan the normal Liquid Level Widget */
Cy_CapSense_ScanWidget(CY_CAPSENSE_LIQUIDLEVEL0_WDGT_ID, &cy_capsense_context);
/* Wait until the scan is finished */
while(Cy_CapSense_IsBusy(&cy_capsense_context)) {}
/* Scan the Foam Rejection Widget */
Cy_CapSense_ScanWidget(CY_CAPSENSE_LIQUIDLEVEL0_FR_WDGT_ID, &cy_capsense_context);
/* Wait until the scan is finished */
while(Cy_CapSense_IsBusy(&cy_capsense_context)) {}
/* Process all th widgets */
Cy_CapSense_ProcessAllWidgets(&cy_capsense_context);
/* Send capsense data to the Tuner */
//Cy_CapSense_RunTuner(&cy_capsense_context);
/* store the liquid level before and after foam rejection */
level_wo_FR = CY_CAPSENSE_LIQUIDLEVEL0_PTRPOSITION_VALUE->x;
level_w_FR = CY_CAPSENSE_LIQUIDLEVEL0_FR_PTRPOSITION_VALUE->x;
sprintf(buf,"level_wo_FR=%ld,level_w_FR=%ld\r\n",level_wo_FR,level_w_FR);
Cy_SCB_UART_PutString(scb_0_HW, buf);
/* keep the compiler happy */
(void)level_wo_FR;
(void)level_w_FR;
}
}
```
其中:
```
Cy_SCB_UART_Init(scb_0_HW, &scb_0_config, &CYBSP_UART_context);
Cy_SCB_UART_Enable(scb_0_HW);
```
初始化UART
```java
sprintf(buf,"level_wo_FR=%ld,level_w_FR=%ld\r\n",level_wo_FR,level_w_FR);
Cy_SCB_UART_PutString(scb_0_HW, buf);
```
打印常规液位检测和带泡沫抑制的液位检测值。
将SW2拨到UART
!(data/attachment/forum/202504/14/135942kpd6c3c36binpb5u.png "14.png")
测量农夫山泉的水位
!(data/attachment/forum/202504/14/140229x3k2bzoobooow1nv.jpg "3.jpg")
UART打印出结果:
!(data/attachment/forum/202504/14/140244rwc915i02c05wl7u.png "15.png")
这种检测原理实际应用价值不大,太局限了。
页:
[1]