(十五)CX20106A 中超声波测量的应用

文章目录

  • CX20106A原理图
  • 芯片说明
  • 部分引脚功能和使用
  • 超声波测距应用
    • 如何发8个40KHZ的波
    • 如何判断接收了返回波
    • 如何计算距离
      • 方法一(Timer1):
      • 方法二(PCA):
    • 现象演示


CX20106A原理图

(十五)CX20106A 中超声波测量的应用_第1张图片
(十五)CX20106A 中超声波测量的应用_第2张图片

芯片说明

CX20106A,红外线/超声波接收专用芯片

1. CX20106A红外线遥控接收前置放大电路,多适用于电视机。
2. CX20106A也同样适用于超声波测试,主要频率在38KHZ~41KHZ,在超声波应用中通常选取40KHZ

部分引脚功能和使用

当CX20106A 接收到40KHz(发射频率和解制必须一致)信号时,会在OUT引脚上产生一个低电平下降脉冲,这个信号可以接到单片机的引脚,进而进行监测。

在实际调试的时候只关心芯片OUT脚在收到信号是否有一个下降沿产生。如果探头一直接收到超声波(也就是40KHZ波),在OUT脚将会有周期的低电平产生。不会像通常认为的那样,OUT脚一直为低电平。这是刚用CX20106A时的一个常见错误。

最后只要通过单片机来来计算发射信号时到收到信号(也就是用单片机检测下降沿)时这段时间的长度,再通过数学计算,转化为距离,即可。

超声波测距应用

总体思路:发波->开启定时器1开始计时->检测超声波返回探头(下降沿)->停止计时->计算距离->清除定时器1计数值以方便下次测量

如何发8个40KHZ的波

大家要和 HC-SR04 超声波模块区分,因为 HC-SR04 模块内置硬件发送超声波的模块(只要给一个发送波的信号,就会自动的发送8个40khz的超声波)而 我们现在是用:CX20106A 配合 超声波T/R发射/接收管 使用的,也就是下图:

(十五)CX20106A 中超声波测量的应用_第3张图片

(十五)CX20106A 中超声波测量的应用_第4张图片

void SendSave()
{
	u8 i;
	for(i=0;i<8;i++){
		P10 = 1;
		Delay13us();
		//持续13us
		P10 = 0;
		Delay13us();
		//持续13us
	}
}

如何判断接收了返回波

由高电平跳转回低电平,表示波回来了

while(P11==1);//下降沿就跳出了

如何计算距离

公式:距离=速度(340m/s)*时间/2

方法一(Timer1):

其中开启定时器1注意用12T模式因为一个计数值刚好是12/12MHZ = 1us
1T的话 一个计数值是1/12MHZ,时间不是整数不好算(这里借助isp生成)

void Timer1Init(void)		//@12.000MHz
{
	AUXR &= 0xBF;		//定时器时钟12T模式
	TMOD &= 0x0F;		//设置定时器模式
	TL1 = 0x00;		//设置定时初始值
	TH1 = 0x00;		//设置定时初始值
	TF1 = 0;		//清除TF1标志
	TR1 = 0;		//定时器1暂时不开始计时
}
u16 GetDistance()
{
	u16 dis = 0;
	
	SendSave();
	TR1 = 1;
	while((TF1==0)&&(P11==1));
	TR1=0;
	if(TF1==1){
		dis  = 999;
		TF1 = 0;
	}else{
		dis = ((TH1<<8)|TL1)*0.017;
	}
	TH1=TL1=0;
	
	return dis;
}

为什么乘以0.017,这里换算关系计数值乘以10的-6次方换算成秒,在乘以340m/s再除以2得到单位是m,再换算成cm即可;


方法二(PCA):

类比Timer1学习

PCA做计数器用,并且配置成12T模式(12分频)

如何配置呢?查手册可知

复位数值:
(十五)CX20106A 中超声波测量的应用_第5张图片
怎么配置(模式寄存器,控制寄存器):
(十五)CX20106A 中超声波测量的应用_第6张图片
(十五)CX20106A 中超声波测量的应用_第7张图片

综上看见复位值就是我们要设置的模式,其实不用动就可以了,只需要记住CR是计数器运行控制位,CH,CL存储计数值,CF是计时器溢出标志位,并且只可以通过软件清零(手动清零)

为了安全起见:

void PcaInit()
{
	CMOD = 0x00;//12T
	CCON = 0x00;//技术开关关闭 清除CH,CL
}
u16 SonicDistance()
{
	u16 dis = 0;
	
	SendSave();
	CR = 1;
	while((CF==0)&&(P11==1));
	CR=0;
	if(CF==1){
		dis  = 999;
		CF = 0;
	}else{
		dis = ((CH<<8)|CL)*0.017;
	}
	CH=CL=0;
	
	return dis;
}

现象演示

(十五)CX20106A 中超声波测量的应用



----- 如有错误欢迎大家批评指正!!!

你可能感兴趣的:(蓝桥杯电子类,c语言,蓝桥杯,单片机,sonic,超声波)