电容传感器制作

目录

        前言

        1. 总体方案设计

        1.1 电容式传感器及原理简介

        1.2 功能模块划分及信号流向

        1.3 软件平台及相关说明

         2. 电路设计

        2.1 正弦发生电路

        2.2 信号载波+交流放大+滤波(电容/电压转换电路)

        2.3 交流放大+乘法器+滤波+直流放大(调制解调电路)

        2.4 Altium Designer电路设计

        2.5 PCB绘制

        2.6 BOOM表

        3. 软件设计

                3.1 CC2530采集外部电压

       3.2 上位机显示电压与波形


前言

该电容传感器是基于CC2530单片机设计的,对于其他单片机设计思路基本一样,只是程序需要根据不同单片机进行修改编写。

1. 总体方案设计

1.1 电容式传感器及原理简介

        电容式传感器是以各种类型的电容器作为传感元件,将被测物理量或机械量转换成为电容变化量变化的一种转换装置,实际上就是一个具有可变参数的电容器。电容式传感器广泛用于位移、角度、振动、速度、压力、成分分析、介质特性等方面的测量。最常用的是平行板型电容器或圆筒型电容器。
        由物理学可知,电容器的电容是构成电容器的两极板形状、大小、相互位置及极板间电介质介电常数的函数。以最简单的平板电容器为例,当不考虑边缘电场影响时,其电容量为:C=\frac{\xi S}{\delta },式中ε为极板间介质的介电常数;S为基板面积;δ为极板间距离。由此可知,平板电容器的电容是εδS的函数,即C=f\left ( \xi ,\delta ,S \right )。电容的工作原理正是建立在上述关系上的。

         测量电容基本工作原理:只要被测物理量的变化能使电容器中任意一个参数产生相应改变而引起电容变化,再通过一定的测量线路将其转换为有用的电信号输出,即可根据这种输出信号大小来判定被测物理量的大小

1.2 功能模块划分及信号流向

正弦发生器:电容测距传感器的输出具有非线性,所以对输出的波形首先进行载波调制,方便后续信号的整流、放大、滤波
交流放大:进行一定程度的放大方便后续处理
二阶有源带通滤波滤除电容变化时及正弦产生时的噪声
模拟乘法器与低通滤波:获得直流分量方便后续处理
ADC数据采集:采集外部电压
上位机显示:显示单片机采集到的电压与波形
(以上为简介,后面会进行详细的说明)

1.3 软件平台及相关说明

        (1)IAR:IAR功能与Keil C51类似,是兼容单片机C语言软件开发系统。其提供了包括C编译器、宏汇编、链接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境将这些部分组合在一起。方便CC2530程序的设计。
        (2)Visual Studio:VS是一个基本完整的开发工具集,它包括了软件整个生命周期中所需要的大部分工具,如UML工具、代码管控工具、集成开发环境等等,而Visual Studio .NET是用于快速生成企业级ASP.NET Web应用程序和高性能桌面应用程序的工具。方便上位机采集电容传感器所测电压数据,波形显示等等。
        (3)Altium Designer:AD是一个设计原理图和PCB的专业软件,功能十分强大,且使用方便,比较容易上手,方便后续的电路加工设计。
        (4)Multisim:美国国家仪器(NI)有限公司推出的以Windows为基础的仿真工具,适用于板级的模拟/数字电路板的设计工作。它包含了电路原理图的图形输入、电路硬件描述语言输入方式,具有丰富的仿真分析能力。本实验用于对所设计电路进行仿真实验。

 2. 电路设计

2.1 正弦发生电路

        上图为典型的正弦发生电路:文氏电桥自激振荡电路。如果在放大器的输入端不加输入信号,输出端仍有一定的幅值和频率的输出信号,这种现象就是自激震荡。而自激振荡产生条件有种子条件、相位条件、幅值条件、稳幅条件四者。
        种子条件:正弦发生电路中需要产生微小的噪声信号用来放大,而生活中广谱噪声无处不在,所以该条件自然满足。
        其中C8、C9、R10、R11构成选频(反馈)部分,所以有:

         所以当虚部为0,即w=w_{0}=1/RC时,此时输入与输出之间没有相位差,且正反馈(选频)增益最大。此时相位条件确定。所产生的正弦信号频率为f=\frac{1}{2\pi RC}=\frac{1}{2\times 3.14\times 5\times10^{4}\times 300\times 10^{-12} }\approx 10kHz
        起振时需要整体增益大于1,由于反馈增益为1/3,所以需要使R8、R9、R12组成的同相比例放大电路的放大倍数大于3,其放大倍数为A_{1}=1+\left ( R12+R9 \right )/R8=4,此时 A选频×A1>1,满足起振条件,此时幅值条件确定。
        而最终为了稳定振荡,依据巴克豪森稳定性准则,电子振荡器系统信号由输入到输出再反馈到输入的相差为360°,且增益为1。因此同相反馈端的增益和正反馈的增益乘积需要由大于1降为等于1。所以该电路中加了两个二极管用来稳幅。

         二极管D1和D2分别在输出电压的正、负半周内导通。当电路的输出电压很小时,流过二极管的电流也很小,二极管呈现很大的电阻,此时,A_{1}=1+\left ( R12+R9{}' \right )/R8\approx 4,整体增益大于1;随着输出电压增大,二极管流过的电流增大,正向电阻逐渐减小,直到A_{1}=3,整体增益为1,振荡稳定,此时稳幅条件确定。

         如上图所示,产生10kHz、5.5V左右的正弦交流信号(根据所选放大器选择合适的幅值和频率)。

2.2 信号载波+交流放大+滤波(电容/电压转换电路)

         在Multisim里,用可调节电容C3来表示被测电容变化,上部分电路是反相交流放大电路,放大后方便波形的观察。下部分电路是带通滤波电路,用来消除正弦发生电路噪声、被测电容变化过程产生的噪声等对后面电路的影响。此时被测电容就会被比较纯净的10KHz的正弦波载波至后续电路进行信号处理。
        快速设计滤波器网站:https://tools.analog.com/en/filterwizard/,在这个网站里可以根据需要设置好参数,就可以自动生成滤波器电路。

2.3 交流放大+乘法器+滤波+直流放大(调制解调电路)

         调制解调电路左侧部分为同相交流放大电路,中间部分为模拟乘法器,其有两路输入,一路为10KHz正弦波,另一路为被测电容调幅电路。所采用的方法是同步解调法,“同步”指解调时所乘的信号与调制时的载波信号具有相同的频率和相位,用已调制波与原载波信号再相乘一次,以复现原信号的频谱(幅值减小一半),从而可用低通滤波电路滤除高频分量。

         g\left ( t \right )=x\left ( t \right )y\left ( t \right )=x_{m}y_{m}sin\left ( 2\pi f_{0}t \right )sin\left ( 2\pi f_{0}t \right )=x_{m}y_{m}\cdot \frac{1}{2}\left ( 1-cos\left ( 4\pi f_{0}t \right ) \right )
        滤波之后对信号进行一定的直流放大即可由单片机通过串口输出到上位机软件显示波形,如下图所示,最后通过示波器测得:电路输出1-3.3V对应被测电容0-100pF。

2.4 Altium Designer电路设计

         由于CC2530单片机不能提供-5V电源,所以与Multisim不同的是加了一个电源模块(5V转-5V),注意-5V要用电荷泵负压芯片产生,不要用开关电源芯片。

2.5 PCB绘制

        由于要求是在40×40的板子上绘制PCB,且尽可能节省器件,所以不太美观整洁。

2.6 BOOM表

        所选器件均为在立创商城有货源,且性价比较高的器件。

3. 软件设计

3.1 CC2530采集外部电压

#include <ioCC2530.h>
#define uchar unsigned char  //宏定义uchar为unsigned char
#define uint unsigned int    //宏定义uint为unsigned int

#define LED P1_0             //宏定义LED为P1_0脚

int ADC_value=0;            //定义ADC转换值
float ADC_result=0;          //定义ADC最终值

char ADC_data[8]="0.00V ";    //定义串口数组,用来存储读取的电压

void Init_LED();             //声明LED 初始化函数
void Init_ADC();             //声明ADC初始化函数
void Init_UART0();           //声明串口0初始化函数
void UR0_SendString(char *str,char len);//声明字符串发送函数
void LED_RUN();              //声明LED闪烁函数
void Delay(uint ms);         //声明延时函数

/*======================主程序入口==================*/
void main(void)              
{ 
  CLKCONCMD &= ~0x40;               //设置系统时钟源为32MHZ晶振
  while(CLKCONSTA & 0x40);          //等待晶振稳定为32M
  CLKCONCMD &= ~0x47;   
  
  Init_LED();                //LED 初始化
  Init_ADC();                //ADC初始化
  Init_UART0();              //串口0初始化
  
  while(1)                   //死循环
  {
    if(ADCIF)                //是否转换完毕
    {
      ADCIF = 0;             //采样标志位清零
      //读取adc数值
      ADC_value = ADCH;      //读取高8位
      ADC_value <<= 8;       //将ADCH移到高位
      ADC_value |= ADCL;     //读取低8位
      ADC_value >>= 3;       //去掉空位
      
      // 0 表示 0V ,3.3V--4096
      // 电压值 = (ADC_value*3.3)/4096 (V)
      ADC_result = ADC_value*3.3/4096;
      
      ADC_data[0]=(char)(ADC_result)%10+'0';//取结果第一位转数值
      ADC_data[2]=(char)((ADC_result)*10)%10+'0';//取结果的第二位转数值
      ADC_data[3]=(char)((ADC_result)*100)%10+'0';//取结果的第三位转数值
      UR0_SendString(ADC_data,8);//将结果通过串口发送给上位机
      LED_RUN();//发送完一次LED状态改变一次
      Delay(1000);//延时一段时间
      Init_ADC();//继续开启ADC采集
    }
  }
}
/*==================声明函数的具体实现===============*/
void Delay(uint ms)             //ms级延时函数
{
  uint i,j;
  for(i=0; i<ms; i++)
    for(j=0; j<535;j++);
}
void Init_LED()            //初始化LED 
{
  P1SEL &= ~0x01;          //LED P1.0为普通IO口
  P1DIR |= 0x01;           //LED P1.0为输出
  LED = 0;                 //LED P1.0 置低
}
void LED_RUN()
{
  LED ^=1;//LED状态改变
}
void Init_ADC()
{
  ADCH &= 0x00;
  ADCL &= 0x00;       //清空ADC数据寄存器
  
  APCFG |= 0x02;      //P0.1配置为模拟I/O口
  ADCCON3 = 0xB1;     //参考电压:VDD5 引脚;512 抽取率(12 位 );通道1
  
}
void Init_UART0()
{
  PERCFG = 0x00;     //选串口0的备用位置1;即(P0.2和P0.3)
  P0SEL |= 0x0c;     //将P0_2和P0_3管脚设置成外设功能
  U0CSR |= 0x80;     //1: UART模式
  //查手册,配置为115200波特率
  U0BAUD |= 216;
  U0GCR |= 11;      
  U0UCR |=0x80;      //禁止流控,无校验,8位数据,1位停止位,清除缓冲器
  UTX0IF = 0;        //串口0发送中断标志位清零
  EA = 1;            //开总中断
}
void UR0_SendString(char *str,char len)
{
  while(len--)
  {
    U0DBUF = *str++;//将要发送的1字节数据写入U0DBUF数据缓冲区
    while(!UTX0IF); //等待数据发送完成
    UTX0IF = 0;     //TX中断标志位清零,以便下一次发送
  }
}

         由于程序中配置的P0.1为模拟I/O口,所以具体思路为:一根线由P0_1接到与一侧电容极板连接的PCB(第2节的电路),另一根线由GND接到另一侧电容极板,即可完成对电容的测量。

扩展:如果要测0V(GND地侧)电压时,此时电压在0V左右,有可能有负值,所以需要将程序中第二、三行宏定义删掉,大部分程序中写这两行宏定义是为了节省单片机运算空间 

        如果条件受限,CC2530单片机除了采集外部电压,还可以以产生随机数的方式显示电压:CC2530产生随机电压 

3.2 上位机界面显示电压与波形


做的这个电容传感器时的学习链接:
Altium Designer 20 19(入门到精通全38集)四层板智能车PCB设计视频教程AD19 AD20 凡亿_哔哩哔哩_bilibili
C#上位机开发串口通信编程_哔哩哔哩_bilibili
CC2530基础+ZigBee开发学习和基础实验_哔哩哔哩_bilibili
以上就是一种简单的电容传感器设计方案,其重点就是硬件电路的设计,感兴趣的可以自己动手设计,或者文件下载链接: 

https://download.csdn.net/download/weixin_49220054/86403742

  • 6
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值