有人用过fdc1004液位探测芯片吗?请教单端电容测试代码

luojie_fighting 2017-08-09 03:19:12
我偏移量都没设置,全是0。不加电容测出来值2.124。加个20pf电容(现在手上最小的电容了),应该是超过量程,输出应该是15pf,,输出结果只是在2.124的基础上,小数位的第二位和第三位有所增加。
int main(void)
{
u8 i;
float value;
delay_init(); //延时函数初始化
uart_init(115200); //串口初始化为115200

LED_Init();
//初始化与LED连接的硬件接口
IIC_Init(); //初始化IIC的IO口
FDC_data = 0;
FDC_offset = 0x00;

FDC_data1H = 0;
FDC_data1L = 0;

FDC_data2H = 0;
FDC_data2L = 0;

LED0=1;

FDC_data = FDC1004_ReadOneByte(0xFF); //读取FDC1004的ID号(0xFF为器件序列号,返回值为0x1004;0xFE为德州仪器公司ID号,返回值为0x5449)
printf("%x\r\n",FDC_data);

// FDC1004_WriteOneByte(0x08,0x1C00); //FDC1004_WriteOneByte(u8 WriteAddr,u16 DataToWrite); 配置通道1
// FDC1004_WriteOneByte(0x09,0x3C00); //FDC1004_WriteOneByte(u8 WriteAddr,u16 DataToWrite); 配置通道2
// FDC1004_WriteOneByte(0x0A,0x5C00); //FDC1004_WriteOneByte(u8 WriteAddr,u16 DataToWrite); 配置通道3
delay_us(5);

// FDC1004_WriteOneByte(0x0C,0x0D80); //触发单端测量通道1,采样率为400S/s
// FDC1004_WriteOneByte(0x0C,0x0D40); //触发单端测量通道2,采样率为400S/s
// FDC1004_WriteOneByte(0x0C,0x0D20); //触发单端测量通道3,采样率为400S/s

delay_ms(5);

while(1)
{
FDC_CapdataX1 = 0;
FDC_CapdataX2 = 0;
FDC_data1H = 0;
FDC_data1L = 0;

FDC1004_WriteOneByte(0x0C,0x0800);
printf("test = %x\r\n",FDC1004_ReadOneByte(0x0C)>>8);

FDC1004_WriteOneByte(0x08,0x1C00); //FDC1004_WriteOneByte(u8 WriteAddr,u16 DataToWrite); 配置通道1
FDC1004_WriteOneByte(0x09,0x3C00);
FDC1004_WriteOneByte(0x0A,0x5C00); //FDC1004_WriteOneByte(u8 WriteAddr,u16 DataToWrite); 配置通道3
FDC1004_WriteOneByte(0x0B,0x7C00);
//FDC1004_WriteOneByte(0x0D,0xED70);
FDC1004_WriteOneByte(0x0D,FDC_offset);
FDC1004_WriteOneByte(0x0C,0x0D80); //触发单端测量通道1,采样率为400S/s
// FDC1004_WriteOneByte(0x0C,0x0C20); //触发单端测量通道3,采样率为400S/s

FDC_data = FDC1004_ReadOneByte(0x0C);

while(!(FDC_data & 0x0008)) //等待测量结束 通道1和通道3
{
FDC_data = FDC1004_ReadOneByte(0x0C);
}
FDC_data1H = FDC1004_ReadOneByte(0x00); //读取通道1的高16位测量结果

delay_us(5);
FDC_data1L = FDC1004_ReadOneByte(0x01); //读取通道1的低16位测量结果,其中只有高8位有效
//FDC_offset = FDC1004_ReadOneByte(0x0D);

while(FDC1004_ReadOneByte(0x0C) & 0x0008); //判断测量数据是否取完

printf("FDC_data1L = %x,FDC_data1H = %x\n",FDC_data1L>>8,FDC_data1H);
// FDC_data2H = FDC1004_ReadOneByte(0x04); //读取通道3的高16位测量结果
// delay_us(5);
// FDC_data2L = FDC1004_ReadOneByte(0x05); //读取通道3的低16位测量结果,其中只有高8位有效
// while(FDC1004_ReadOneByte(0x0C) & 0x0002); //判断测量数据是否取完

FDC_CapdataX1 = (((FDC_CapdataX1 | FDC_data1H) << 16) + FDC_data1L) >> 8; //计算电容值
// FDC_CapdataX2 = (((FDC_CapdataX2 | FDC_data2H) << 16) + FDC_data2L) >> 8; //计算电容值

// FDC_Capdata1 = (double)FDC_CapdataX1 / 524288;
// FDC_Capdata2 = (double)FDC_CapdataX2 / 524288;
if(FDC_CapdataX1 > 0x7fffff)
FDC_CapdataX1 = 0;
value = (float)FDC_CapdataX1 / 559240;
value = value * 1000;
printf("value1 = %6.3f\r\n",value);

FDC1004_WriteOneByte(0x08,0x1000); //FDC1004_WriteOneByte(u8 WriteAddr,u16 DataToWrite); 配置通道1
FDC1004_WriteOneByte(0x09,0x3000);
FDC1004_WriteOneByte(0x0A,0x5000); //FDC1004_WriteOneByte(u8 WriteAddr,u16 DataToWrite); 配置通道3
FDC1004_WriteOneByte(0x0B,0x7000);

for(i = 0;i < 10;i++)
value += FDC_CapdataX1;
value /= 10;
// //FDC_Capdata1 = ((double)FDC_CapdataX1 / 524288)*100;
// temp = (int)FDC_Capdata1;
// buf[0] = temp/100;
// buf[1] = temp/10%10;
// buf[2] = temp%10;
// // FDC_Capdata1 = ((double)FDC_CapdataX1 / 524288)*100;
// for(i=0;i<3;i++)
// {
// USART_SendData(USART1, buf[i]);
// while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
// }
// printf("%d\r\n",temp);
printf("%x\r\n",FDC_offset);
// printf(" %6.3f\r\n",FDC_Capdata1);
//printf(" %6.3f\r\n",FDC_Capdata2);
printf("%x\r\n",FDC_CapdataX1);
printf("value2 = %6.3f\r\n",value/559240*1000);

LED0=~LED0;
for(i=0;i<10;i++)
{
delay_ms(100);
}

}
}
...全文
1003 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

27,382

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧