当前位置:   article > 正文

PCAP01介绍和STM32模拟SPI驱动

pcap01

一.芯片介绍

Pcap01是德国acam公司设计的一款革命性的电容测量芯片。该芯片 内部有DSP计算单元,可以直接将电容元件接到Pcap01芯片,然后芯片计算出容值大小,通过SPI总线将电容容值数据传送给CPU,电容测量完全数字化。
在这里插入图片描述

二,测量原理

PCAP测量的原理是基于电容的充放电时间比。
在这里插入图片描述
PCAP01有8个通道,每一个通道都可以读取相对应的电容充放电时间比,当我们把PC0通道的电容值确定后,再通过这个比值,就可以计算出相对应的电容。
在这里插入图片描述

三.硬件设计

下图是PCAP01芯片的引脚定义
在这里插入图片描述
PC0到PC7为8个测量通道,接电容。此外PCAP01还有测量温度的功能,不过笔者暂时没有用到。
电容的理解方式有两种,一种为漂移模式,另一种为接地模式。

在这里插入图片描述在这里插入图片描述

在本次设计中,我选择了单传感器接地模式。
PCAP01与MCU的通信模式有两种,一种为I2C,另一种为SPI,本次设计选择模拟SPI。通过设置IIC_EN脚就可以选择相对应的通信方式。
在这里插入图片描述
下面为原理图设计,最好是有一个LDO把PCAP01的电源和其他电源隔离开。

四.软件编写

PCAP01测量可以按照官方的例程编写。
1.初始化IO
2.写固件
3.写配置寄存器
4.开始测量
5.读结果寄存器
第一步先看通信协议和操作码。
在这里插入图片描述
其中读写寄存器都是32位操作,SRAM为24位,操作码位8位

void write_date_8(u8 date);   //写入一个8位数据
void write_date_16(u16 date); //写入一个16位数据
void write_date_32(u32 date); //写入一个32位数据
  • 1
  • 2
  • 3

第一步为初始化IO

void PCAP_SPI_Init(void)
{ 
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 |GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	GPIO_SetBits(GPIOA,GPIO_Pin_5|GPIO_Pin_7);
	GPIO_ResetBits(GPIOA,GPIO_Pin_4);

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
	GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOATING;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	GPIO_SetBits(GPIOA,GPIO_Pin_6);
	

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

第2步写固件和写配置寄存器放在一起写。配置寄存器为下图。
在这里插入图片描述
寄存器0为操作OTP,寄存器1到4设置电容测量的相关参数,寄存器5-6为设置温度测量的相关参数,寄存器10设置功耗模式。详细的可以看具体手册。
在这里插入图片描述

void Pcap01_init(void)   
{
	PCAP_SPI_Init();
	write_date_8(0x88);       
	write_firmware(); 
	write_date_32(0xc04200F0);       
    write_date_32(0xc1201022); 
    write_date_32(0xc207160B);  
    write_date_32(0xc3066064);   
    write_date_32(0xc4040300);  
    write_date_32(0xc5000000);  
	write_date_32(0xc6008040);   
    write_date_32(0xc71F0000);    
    write_date_32(0xc8800030);     
    write_date_32(0xc9FF000F);     
    write_date_32(0xca180047);     
    write_date_32(0xcd000011); 
	write_date_32(0xce002ff0);    
	write_date_32(0xcf000000); 
    write_date_32(0xD0000000);   
    write_date_32(0xD1000000);   
    write_date_32(0xD2000000);   
    write_date_32(0xD3200001);  
    write_date_32(0xD4000001);   
	write_date_8(0x8A); //复位输出结果数据。          
    printf("PCAP01 cofing\r\n");
   //8bit操作码8CH表示开始一次电容测量
   write_date_8(0x8C);   
   delay_ms(500);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

开始测量后就可以读结果寄存器了,注意要开始测量后要延时一小段时间,在这可以读取状态寄存器,如果数值是900000或者100000就没有错误。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

float Get_cap(void)
{
    //读一次状态寄存器
    write_date_8(0x48);   
    cap_status = spi_read();//返回结果代表测量结果,返回10000或者90000	
	printf("cap_status= %lx \r\n", cap_status);	 
	//读一次PC1电容/PC0电容
	write_date_8(0x41);   
	cap_reszult1 = spi_read();
	cap_time = (double)cap_reszult1/(double)cap_temp;  // PC1电容/PC0电容的放电时间比
	cap_c1 =cap_time*cap_ref;     //  计算PC1的数值
	printf("cap_c1=%.4f \r\n",cap_c1);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

目前的版本楼主只写到用软件SPI,争取接下来写一版硬件SPI的

更新了原理图和PCB,直接开源
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实际视频可以到B站看
https://www.bilibili.com/video/BV13C4y1D7mN/

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/182964
推荐阅读
相关标签
  

闽ICP备14008679号