传感器/变送器/仪表按厂商品牌选用指南按种类分类选用指南按行业应用选用指南 模块模组 隔离采集仪器仪表
产品资料 技术资料 样例工程 产品驱动 参考设计 应用电路 通讯协议 使用说明 支持软件 数据查询 问题解答 标准法规 图书资料 基础知识

超声波物位变送器超声波传感器/换能器/雾化器  压电陶瓷超声波传感器 超声波感应模块 SS-311超声波感应模块 SS-311RT超声波感应模块

  超声波测距模块/测距仪国产超声播传感器一国产超声波传感器二

 
德国Microsonic超声波传感器
Baumer超声波传感器
西门子3RG6 BERO超声波传感器
德国生产的CANKEY产品
国产超声播传感器一
国产超声波传感器二
超声波测厚仪
 
 
 
关于微波传感器
MC系列产品
MC微波模块应用产品
MC平面微带介质谐振传感器
MC波导谐振型传感器
实用电路与比较
可调范围微波传感器
微波雷达感应开关
声光控开关
LED感应开关
人体红外线感应开关
自动门微波传感器
SS-968雷达模块
SS-9261雷达探测器
TWH9251A 雷达探测器模块
振动传感器
人体接近传感器
ATM人体接近传感器
微波传感器
微波探测器传感器
ATM微波传感器
微波传感器/微波移动探测器
微波雷达测速测距传感器
超声波测距控制器
交通雷达传感器
安防报警/消防设施传感器
雷达探测器/雷达模块
射频物位开关
螺传感器/陀螺仪
磁场传感器/磁敏传感器
旋转编码器/轴角传感器/角度
霍尔元件/霍尔IC/霍尔传感器
 
 
 
 
 
 
 
 
 
  SUNSTAR 系列超声波感应模块选择指南

MSP430超声波测距

    最近有不少网友们在QQ群讨论起关于超声波距离测量的话题,本人听了此话题以后也感到有所触动。在此,本人推荐一个超声波距离测量DIY活动给广大的MSP430爱好者,希望有兴趣的朋友们一起来参与此次DIY活动。本次活动以公开的形式推荐给大家,所有的电路原理图、电路原理、超声波距离测量原理、计算公式、源程序代码都将一一公开给MSP430爱好者,因为这是TI官方一个典型范例,相信大家参与后会有很大的收获。
   因为此资料是TI官方一个典型范例,同时由利尔达公司将原理注释翻译成中文。所以这是一份较为实用和符合大众的制作资料,希望有兴趣的能一起参加。
  摘要
   本应用报告描述了一种采用MSP430F413 超低功耗微控制器的基于超声波的距离测量系统。系统向测量目标发射超声波脉冲然后接收相应的反射波。MSP430 集成的模拟比较器A 用于检测到达系统的回声。超声波脉冲从系统到目标然后反射回系统所需的时间可以由MSP430精确的测量。假设声波室温下在空气中的速度为1100 英尺/秒,MSP430 计算系统与目标间的距离并采用内部集成的LCD 驱动器将其显示在一两位的静态液晶显示器上。距离以英寸为单位显示,精度为1 英寸本系统能够测量的最小距离是8 英寸,因为受到发射器传感器稳定时间;能够测量的最大距离为99英寸,回声的强度取决于反射物的材质形状、和尺寸。地毯之类的吸音材料或者反射面积小于两平方英尺的物体反射能力很弱,这类目标最大测量范围相对较小。如果系统接收到的回声的强度很小以至于比较器A 无法检测到就超出了系统的测量范围。这时系统将显示错误信息“E”。
                                DIY样品图如下:
                    

以下将按几个部分来讲述此次超声波距离测量步骤:
  1-工作原理
  2-电路描述
  3-软件
   Ultrasonic.s43
   设备初始化子
   程序主循环程序
   计算子程序
   BT_ISR 子程序
   显示子程序
   延时子程序

工作原理
   本应用基于声波的反射。声波在其传播的介质中被定义为纵波。当声波受到尺寸大于其波长的目标物阻挡时就会发生反射;反射波称为回声。如果声波在介质中传播的速度是已知的,而且测量到声波从声源到达目标然后返回声源的时间,从声源到目标的距离就可以精确地计算出来。这就是本应用的测量原理。这里声波传播的介质就是空气,采用不可见的超声波。
   假设室温下声波在空气中的传播速度是1100 英尺/秒,测量到的声波从声源到达目标然后返回声源的时间是t,秒距离d可以由下列公式计算:
                                   d=1100 12 t (英寸)
    因为声波经过的距离是声源与目标之间距离的两倍,声源与目标之间的实际距离应该为d/2。

电路描述
   本应用中中用来发射和接收超声波的装置是40KHz 的陶瓷超声波传感器。MSP430 采用晶体振荡器产生的一个40KHz 方波信号的12 周期脉冲序列驱动发射传感器,接收传感器则接收回声。MSP430 的定时器A被定义为40KHz 晶振频率计数器,因此时间测量精度为25 微秒,这对本应用来说足够用了。测量的时间基准是非常稳定的因为它由石英晶体振荡器产生。接收传感器收到的回声由运算放大器放大后送到比较器A 的输入端。比较器A 检测到其输入端的回声信号后触发定时器A 计数值的捕捉来捕获比较寄存器CCR1 的值。捕捉在回声到达系统的瞬间进行。捕获的计数值就是超声波脉冲序列从系统出发到达目标然后返回系统的时间。从系统到目标的距离(用英寸表示)就可由MSP430 用测得的时间算出并显示在两位静态液晶显示器上。显示更新后MSP430 马上转入LPM3 睡眠模式来降低功耗。基本定时器1 被编程用来每205 毫秒中断MSP430 一次。基本定时器1的中断信号唤醒MSP430 并重复测量周期更新显示。
    图1 显示的是本应用的电路原理图。其中MSP430F413 U1 是系统的核心部分。参考文献[1]是这个芯片的技术资料。LCD1 是一由MSP430F413内部集成的LCD 驱动器驱动的两位低压静态液晶显示器。R03 连接到Vss R13 和R23, 悬空将LCD 外围电路设置为静态LCD 驱动模式。这里方便的选用了一个40KHz 的低频晶振,与本应用中采用的超声波传感器的谐振频率相匹配。R12 作为复位线的上拉电阻,内部集成的掉电保护电路可以预防掉电情况。C9 位于靠近芯片电源线的位置,提供MSP430 的电源耦合。14 脚的接插件(J1) 提供JTAG 接口与MSP430 相连,可使用MSP430FLASH 仿真工具进行在线调试和编程LED1 用来指示测量周期。端口引脚P1.5 被定义为输出超声波发射器所需要的40KHz 方波ACLK信号。
   传感器的输出驱动电路直接由9V 电池供电并提供18Vpp 驱动超声波发射器。18Vpp 是通过一个二进制非门CD4049(U4)桥电路实现的。参考文献[6]是它的技术资料。其中一个非门用来为驱动器的一侧提供180 度的相移信号。另一侧由相内信号驱动。这种结构使输出端的电压提高了一倍,为发射传感器提供了18Vpp 电压。两个门并联连接以便每一侧能够为传感器提供足够的驱动电流。电容C6 C7 阻断了到传感器的直流通路。因为CD4049 工作于9V 而MSP430 工作于Vcc 3.6V。 MSP430 和输出驱动器之间的逻辑电平是不匹配的,双极性晶体管Q1 就作为这两种逻辑电平之间的转换器。
   运算放大器U3 是TI 公司的高速运算放大器TLV2771 。参考文献[5]是它的技术资料。这个放大器具有高增益带宽并在40KHz 时提供充分的高增益。运算放大器连接成反相放大器构造。R7、R5 设置增益为55、C5 提供高频滚降。R3、R4 偏置非反相输入端,为运算放大器的单输入工作提供一个虚拟中间值。放大后的超声波信号在这个虚拟中间值。上下波动传感器RX1 的高Q 值提供选择性并丢弃除了40KHz 之外的频率。运算放大器的输出端连接到比较器A 的输入端CA0 (即端口引脚P1.6)。 比较器A 的参考电平内部选择为0.5Vcc 。当接收到回声时电压高于参考电平从而触发比较器A 的输出CAOUT 。调整R3 可以得到需要的灵敏度并优化测量范围。
   MSP430 和超声波信号放大器电路由9V 电池经TI 公司的LDO 芯片TPS77001 调制后的3.6V 电压供电。参考文献[4]是它的技术资料。电阻R1和R2 调整稳压器输出电压为3.6V。 C1和C2 是推荐使用的稳压器的正常工作的供电电容。发射器的驱动电路是由9V 电池直接供电的。开关S1 是本应用的电源开关。
   图2 显示的是12 周期的40KHz 脉冲序列的波形轨迹图。我们注意到19.2V 的峰峰电压波动。方波顶部的正弦响铃波是由于传感器内部的谐振。
   图3 显示的是一个完整测量周期的波形轨迹。轨迹1显示的是发射传感器输出端的12周期的40KHz脉冲序列。轨迹2 显示的是接收传感器输出经运算放大器放大后在引脚1上的输出。轨迹上的第一个脉冲序列信号,代表直接从发射器上收到的信号被MSP430忽略。接下去的脉冲序列代表目标反射的回声,被MSP430 用于测量。轨迹3 显示的是MSP430 测得的时间间隔的宽度。这个宽度代表该脉冲序列从系统到达目标再返回所花的时间,显然它取决于所测量的距离。

                           图1

     
                           图2

     
                           图3
软件Ultrasonic.s43
   设备初始化子程序
   这个子程序初始化及设置外围电路。首先关闭看门狗电路,采用一个软件延时让低频晶振稳定,将FLL+倍频器设置为64 来产生2.56MHz 的MCLK频率。P1.0 设置为输出控制LED。未使用的端口引脚设置为输出,端口引脚P1.5 设置为输出带缓冲的40KHz ACLK。频率基本定时器1 启动并设置为提供一个150Hz LCD 频率并每205 毫秒中断CPU 开始一次测量周期比较器A 内部参考电平设置为0.5Vcc ,CAPD 位设置为关闭比较器输入引脚的输入缓冲。LCD 模块打开并在本应用中设置为静态模式驱动两位静态LCD 。LCD 存储器清零,LCD 的初始显示为00。基本定时器1 中断和全局中断打开,这样基本定时器1 就可以周期性中断CPU。

   主循环程序
   主循环用存储在DIGITS 缓冲区内的值更新液晶显示器然后MSP430置于LPM3 睡眠模式。MSP430 维持在睡眠模式直至基本定时器1 中断发生及BT_ISR 返回活动模式。这时就开始一个测量周期定时器A 设置为16 位增计数模式,选择ALCK 作为其时钟源。CCR1 设置为比较模式,初始值为12 以便在P1.5 引脚上输出12 个周期的40KHz 的脉冲序列接下去是一个36ACLK 周期的延时,保证输出传感器稳定这是通过设置CCR1为初始值36 的比较模式实现的,在CCR1 处于比较等待状态时,MSP430保持LPM0 状态。
   然后系统切换到通过接收传感器接收回声。比较器A 被设置为等待回声,在回声到达的瞬间提供一个捕获中断。定时器A 计数值从捕获比较寄存器CCR1 中得到。这个值就是超声波序列从发射传感器到达目标然后返回这段距离所需的时间。计数值加上48 加以调整,以补偿12 个周期脉冲序列和36 个周期发射传感器稳定延时的损失。CCR1调整后的值就是脉冲序列发出时刻到回声到达系统这段时间的准确值。然后,就调用计算子程序计算实际距离单位为英寸并返回结果。如果结果超出范围,回声信号就接收不到,比较器A 也不会产生捕获中断。MSP430 保持LPM 状态知道下一个基本定时器1 中断将其唤醒,通过检测其CCTL1 控制寄存器中的CAIFG 位来确“E” 。程序最终返回到主程序,更新LCD 显示并返回LPM3 睡眠模式。下一个基本定时器1 中断将MSP430 唤醒至活动状态重复程序执行过程。

计算子程序
   计算子程序负责本应用中的数学计算。CCR1 中调整后的16 位数值存储为变量Result, 这个值就代表超声波序列从系统到目标然后返回系统这段距离所需的时间。因为定时器A 计数间隔为25 微秒,对应的时间值为Result25 微秒假设室温下声音的速度为1100 英寸/秒,可以看出,从定时器A计数值得到的Result 每6 个值对应于1 英寸的距离。
   为了采用MSP430 现有的整数计算达到要求的精度,16 位的Result 首先乘以100 然后除以6。16位*16位的乘法是由子程序Mu100 完成的,32位的结果存储在变量htX100_msw 和htX100_lsw 中,然后除以6 并将结果保存在变量DIGITS 中DIGITS 中的值是二进制格式的,由hex2bcd 子程序将这个二进制值转换成BCD码然后丢弃BCD 码,的最后两个数字来补偿前面所作的与100 的乘法。两位的结果值返回到变量DIGITS中。

   BT_ISR 子程序
   基本定时器1 中断子程序BT_ISR 对保存在堆栈中的状态寄存器SR 中的位进行操作以使MSP430 能够返回活动状态继续执行主循环中LPM3之后的程序代码。

  显示子程序
  这个子程序用变量DIGITS 的值更新两位静态LCD 显示。静态显示器的段值存储在查寻表LCD_Tab 中。通过将DIGITS中的数字与LCD_Tab 查寻表中的位置相关联,LCD 存储器就可以装入所需要的段值。

  延时子程序
这个子程序产生一个16 位的软件延时。由于软件减计数的变量处于堆栈的顶部(TOS),寄存器不会受到影响。延时时间到后,子程序返回前堆栈指针(SP)恢复到原始值。

  结论
内部集成的模拟比较器A、带硬件捕获/比较寄存器的16 位定时器A、基本定时器1、 LCD 驱动电路简化了超声波测距应用的设计,提供了一种单片系统解决方案。本应用在15 英寸距离测量中的平均功耗为1.3 毫安。这包括LDO U2, 运算放大器U3 和CMOS 二进制反相器U4 的静态电流,运算放大器自身就由1 毫安的静态电流,电路其他部分的功耗为300 微安。LED 工作时需5 毫安,电流MSP430 在LCD 连续工作时需2.1 微安的平均电流。这是利用MSP430 的低功耗特性实现的,MSP430 大部分时间处于LPM3 睡眠状态,这时用到的CPU 资源仅为5.6%。
因为声波的速度与温度有关,测量值在非室温下准确度会下降。在本应用中引入一个简单的基于热电阻的温度测量和距离补偿,可以使系统在很大的温度范围内精确测量。如果需要测得的距离和温度数据可以存储在FLASH 存储器中。加上额外增益和使用多态LCD 来读出尽可能多的位数也可以增大测量范围。
 
MSP430源程序(汇编)

;******************************************************************************
;    MSP430F413 超声波距离测量示范程序
;    
;******************************************************************************
;    寄存器定义
;******************************************************************************
#define      DIGITS  R11
#define      Result  R10
#define      IRBT    R9
#define      IROP1   R4
#define      IROP2L  R5
#define      IROP2M  R6
#define      IRACL   R7
#define      IRACM   R8

;******************************************************************************
;   变量定义
;******************************************************************************
             RSEG UDATA0             
             htX100_msw: DS 2 ;         字变量存贮在RAM 200h和201h
             htX100_lsw: DS 2 ;                         202h和203h
                       
;******************************************************************************
             RSEG    CSTACK                  ; 指向开始堆栈段区
             DS      0                         
             RSEG    CODE                    ; 指向开始代码段区
RESET        mov.w   #SFE(CSTACK),SP         ; 定义堆栈
             call    #Init_Device            ; MSP430 初始化
             mov.w   #0,DIGITS               ; 初始化DIGITS 为'0'
Mainloop    
             bic.b   #CAON,&CACTL1           ; 比较器A关闭
             call    #Display                ; 显示数据在LCD上
             bis.w   #LPM3,SR                ; 在LPM3模式等待
            
;************************开始超声波发出和捕获测量******************************                                      
            
             clr.w   &CCTL1                  ; 不使用CCTL1
             clr.w   &TACTL                  ; 不使用timer_A      
             bis.b   #BIT0,&P1OUT            ; LED开           
SetupTimerA  mov.w   #TASSEL0+TACLR+MC1,&TACTL
                                             ; TACLK = ACLK,16位向上模式
             bis.b   #BIT5,&P1SEL            ; ACLK o/p on P1.5
             mov.w   #12,&CCR1               ; 12 周期 40KHz爆发
             mov.w   #CCIE,&CCTL1            ; 比较模式中断
             bis.w   #LPM0,SR                ; 等待CCR1中断
             bic.b   #BIT5,&P1SEL            ; ACLK o/p on P1.5 OFF        
TimerCLR     bis.w   #TACLR,&TACTL
             mov.w   #36,&CCR1               ; Delay for transducer to settle                                     
             mov.w   #CCIE,&CCTL1            ; 比较模式中断
             bis.w   #LPM0,SR                ; 等待CCR1中断                          
             bis.b   #CAON,&CACTL1           ; 比较器A 开
             bic.b   #CAIFG,&CACTL1          ; 使能比较器A中断标志
             mov.w   #CM0+CCIS0+SCS+CAP+CCIE,&CCTL1
                                             ; 正边沿, CCIB,Cap,中断
             push    &TAR                    ; TOS = TAR 在测量的开始
             bis.w   #LPM0,SR                ; 等待CCR1中断(Echo)
             clr.w   &CCTL1                  ; 不使用CCTL1
             bic.b   #BIT0,&P1OUT            ; LED关闭
             bit.b   #CAIFG,&CACTL1          ; 检查回声波不接收
             jz      Next                    ; '超出范围'条件
             mov.w   &CCR1,Result            ; Result = TAR (CCR1) at EOC
             sub.w   @SP+,Result             ; Result = time taken
             add.w   #48,Result              ; 补偿爆发12个时钟
                                             ; 传递时间 + 36个时钟延时
                                                                              
;****************** 测量完成 **************************************************             

             call    #Math_calc              ; 调用数学子程序
             swpb    DIGITS                  ; Shift left by two digits for /100        
             jmp     Mainloop                ; 下一次测量周期          
Next         mov.w   #0beh,DIGITS            ; 不回声接收显示'E' 表示错误
             jmp     Mainloop
            
;******************************************************************************
Init_Device                                  ; 初始化MSP430x41x             
;******************************************************************************
             mov.w   #WDTPW+WDTHOLD,&WDTCTL  ; 停止WDT
             bis.b   #030h,&FLL_CTL0         ; 开启负载电容器对于XTAL振荡器开始振荡
                                             ;  
             call    #Delay                  ; 延时对于振荡器到稳定为止
             mov.b   #03fh,&SCFQCTL          ; MCLK = 40KhzX64 = 2.56Mhz  
             call    #Delay                  ; 延时对于FLL到稳定为止
SetupP1      mov.b   #000h,&P1OUT            ; 清除P1 输出寄存器
             bis.b   #0bfh,&P1DIR            ; 不用的Pin设置为输出          
             bis.b   #040h,&P1SEL            ; 比较器A输入功能                         
SetupP2      mov.b   #000h,&P2OUT            ; 清除P2输出寄存器
             bis.b   #0ffh,&P2DIR            ; 不用的Pin设置为输出                                                 
SetupP6      mov.b   #000h,&P6OUT            ; 清除P6输出寄存器
             bis.b   #0ffh,&P6DIR            ; 不用的Pin设置为输出
SetupBT      mov.b   #BTFRFQ0+BTFRFQ1+BTIP2+BTDIV,&BTCTL
                                             ; Enable BT with 150Hz LCD freq.
                                             ; and 205 milli-second interrupt
SetupCA      mov.b   #CAPD6,&CAPD            ; o/p buffer disable for comp i/p          
             mov.b   #P2CA0,&CACTL2          ; P1.6为比较输入          
             mov.b   #CARSEL+CAREF1+CAON,&CACTL1           
                                             ; 比较器A开, 0.5Vcc整. 参考
SetupLCD     bis.b   #LCDON+LCDSON+LCDSG0_7,LCDCTL
                                             ; LCD模块开和静态模式
ClearLCD     mov     #15,R15                 ; 15 LCD mem位置清除
             mov.b   #LCDMEM,R14
Clear1       mov.b   #0,0(R14)               ; 写零在LCD RAM中
             inc.b   R14                      
             dec     R15                     ; 是否清除所有LCD mem?
             jnz     Clear1                  ; 清除更多LCD mem              
             bis.b   #BTIE,&IE2              ; 使能基本定时器中断
             eint                            ; 使能中断                                            
             ret
;******************************************************************************

;******************************************************************************
BT_ISR                                       ; Basic Timer ISR, CPU returns
                                             ; to active mode on RETI
;******************************************************************************             
             bic     #LPM3,0(SP)             ; Clear LPM3 bits on TOS
             reti                            ; on return from interrupt
            
;******************************************************************************
TAX_ISR;     Common ISR for CCR1-4 and overflow
;******************************************************************************
             add.w   &TAIV,PC                ; Add TA interrupt offset to PC
             reti                            ; CCR0 - no source
             jmp     CCR1_ISR                ; CCR1
             reti                            ; CCR2
             reti                            ; CCR3
             reti                            ; CCR4
TA_over      reti                            ; Timer_A overflow

CCR1_ISR     bic.w   #CCIFG,&CCTL1
             bic.w   #LPM0,0(SP)             ; Exit LPM0 on reti
             reti                            ;
                                               
;******************************************************************************
Display      ;Subroutine to Display values DIGIT1 & DIGIT2
             ;CPU Registers used R15, R14, R13 and R12,  not saved
;******************************************************************************
             mov.w   #LCDM1,R15              ; R15 points to first LCD location
             mov.b   DIGITS,R14              ; LSD value moved to R14
OutLCD       mov.b   R14,R13                 ; Copy value in R14 to R13
             rra.b   R13                     ; Right Shift
             rra.b   R13                     ; four times to
             rra.b   R13                     ; swap
             rra.b   R13                     ; nibbles
             and.b   #0Fh,R14                ; low nibble now in R14
             and.b   #0Fh,R13                ; high nibble now in R13
             mov.b   LCD_Tab(R14),R12        ; Low nibble to LCD digit 1
             mov.b   R12,0(R15)              ; Low nibble segments a & b to LCD
             rra.w   R12
             inc.b   R15
             mov.b   R12,0(R15)              ; Low nibble segments c & d to LCD
             rra.w   R12
             inc.b   R15
             mov.b   R12,0(R15)              ; Low nibble segments e & f to LCD
             rra.w   R12
             inc.b   R15
             mov.b   R12,0(R15)              ; Low nibble segments g & h to LCD
             rra.w   R12
             inc.b   R15             
             mov.b   LCD_Tab(R13),R12        ; High nibble to LCD digit 2
             mov.b   R12,0(R15)              ; High nibble segments a & b to LCD
             rra.w   R12
             inc.b   R15
             mov.b   R12,0(R15)              ; High nibble segments c & d to LCD
             rra.w   R12
             inc.b   R15
             mov.b   R12,0(R15)              ; High nibble segments e & f to LCD
             rra.w   R12
             inc.b   R15
             mov.b   R12,0(R15)              ; High nibble segments g & h to LCD
             rra.w   R12                                     
             ret                                                       
;******************************************************************************
;            LCD Type Definition
;******************************************************************************
;Segments definition
a            equ     001h
b            equ     010h
c            equ     002h
d            equ     020h
e            equ     004h
f            equ     040h
g            equ     008h
h            equ     080h
Blank        equ     000h
           
LCD_Tab      db      a+b+c+d+e+f             ; Displays "0"
             db      b+c                     ; Displays "1"
             db      a+b+d+e+g               ; Displays "2"
             db      a+b+c+d+g               ; Displays "3"
             db      b+c+f+g                 ; Displays "4"
             db      a+c+d+f+g               ; Displays "5"
             db      a+c+d+e+f+g             ; Displays "6"
             db      a+b+c                   ; Displays "7"
             db      a+b+c+d+e+f+g           ; Displays "8"
             db      a+b+c+d+f+g             ; Displays "9"
             db      a+b+c+e+f+g             ; Displays "A"
             db      Blank                   ; Displays  Blank
             db      a+d+e+f                 ; Displays "C"
             db      b+c+d+e+g               ; Displays "D" d
             db      a+d+e+f+g               ; Displays "E"
             db      a+e+f+g                 ; Displays "F"
;******************************************************************************
Delay;       Software delay
;******************************************************************************
             push    #0FFFFh                 ; Delay to TOS
DL1          dec.w   0(SP)                   ; Decrement TOS
             jnz     DL1                     ; Delay over?
             incd    SP                      ; Clean TOS
             ret                             ; Return from subroutine
           
;******************************************************************************
Math_calc;   calculation subroutine
;******************************************************************************
             mov.w   #0h, DIGITS             ; Initialise DIGIT to 0
             cmp.w   #0h, Result             ; Check if Result count=0
             jeq     calc_over               ; Exit if 0
             call    #Mul100                 ; Multiply Result count by 100
             call    #Divide                 ; Divide the result with #06d
             call    #Hex2bcd                ; Convert 16bit binary to BCD number
                                             ; Result xx.xx                          
calc_over    ret                             ; Return from subroutine                
;******************************************************************************
Mul100       ;subroutine for multiplying Result with 100d
             ;inputs Result 16bit and constant 64h (100d) 16bit
             ;output 32bit htX100_msw & htX100_lsw
;******************************************************************************             
             mov.w   #100,IROP1              ; Load IROP1 with 100 (multiplier)
mpyu         clr.w   htX100_lsw              ; Clear buffer for least
                                             ; significant word
             clr.w   htX100_msw              ; Clear buffer for most
                                             ; significant word
macu         clr.w   IROP2M                  ; Clear multiplier high word
L$002        bit.w   #1,IROP1                ; Test actual bit
             jz      L$01                    ; If 0: do nothing
             add.w   Result,htX100_lsw       ; If 1: Add multiplier to Result
             addc.w  IROP2M,htX100_msw       ;
L$01         rla.w   Result                  ; Multiplier X 2
             rlc.w   IROP2M                  ;
             rrc.w   IROP1                   ; Next bit to test
             jnz     L$002                   ; If bit in carry : finished                                  
             ret
;******************************************************************************
Divide       ;Subroutine for 32/16 bits division
             ;inputs 32bit htX100_msw & htX100_lsw and #06 16bit, output DIGIT 16bit
;******************************************************************************
             clr.w   DIGITS                  ; Clear buffer to hold new Result
             mov.w   #17,IRBT                ; Initialize loop counter
div1         cmp.w   #06,htX100_msw          ; Compare divisor with dividend high word
             jlo     div2                    ; If less : jump to div2
             sub.w   #06,htX100_msw          ; Subtract 6 from high word  
div2         rlc.w   DIGITS                  ; Rotate result left through carry 1 bit
             jc      div4                    ; If carry set: finished
             dec.w   IRBT                    ; Decrement bit counter
             jz      div3                    ; If counter = 0 : finished
             rla.w   htX100_lsw              ; Dividend X 2
             rlc.w   htX100_msw              ;
             jnc     div1                    ; If carry not set jump to step div1
             sub.w   #06,htX100_msw          ; Subtract 6 from high word
             setc                            ; Set carry
             jmp div2                        ; Jump to repeat
div3         clrc                            ; Clear carry
div4         ret                             ; Return from subroutine
;******************************************************************************
Hex2bcd      ;Subroutine for converting 16bit hexadecimal value to BCD value
             ;input in DIGITS 16bit hexadecimal, output in DIGITS 16bit BCD
;******************************************************************************
             mov #16,r9                     ; R9 no of bits
             clr r8                         ; Clear R8
             clr r7                         ; Clear R7
L$1          rla DIGITS                     ; Rotate left arithmetic DIGITS
             dadd r7,r7                     ; Add source and carry decimally
             dadd r8,r8                     ; to destination
             dec r9                         ; Decrement bit counter
             jnz L$1                        ; Is 16 bits over ?
             mov r7,DIGITS                  ; Result in DIGITS
             ret                            ; Return from subroutine                                                                                     
;******************************************************************************
             COMMON  INTVEC                  ; MSP430x41x Interrupt vectors             
;******************************************************************************             
             ORG     BASICTIMER_VECTOR
BT_VEC       DW      BT_ISR                  ; Basic Timer Vector

             ORG     TIMERA1_VECTOR          ; Timer_AX Vector
TIMA_VEC     DW      TAX_ISR                 ;

             ORG     RESET_VECTOR
RESET_VEC    DW      RESET                   ; POR, ext. Reset, Watchdog

;******************************************************************************  
             END
 我连材料清单都提供给你,问你心动吗?
-----------------------------------------------------------------------------
元件编号                                   参数值
R1                               200K  1 % - 0805 SMD
R2, R3, R4, R6, R7, R12          100K  1 % - 0805 SMD
R5                               1.8K  0.1 % - 0805 SMD
R8, R9, R10                    10K  0.1 % - 0805 SMD
R11                               560  5 % - 0805 SMD
C1, C3, C4, C8, C9                    0.1uF 16V PPS 1210 SMD
C6, C7                               2 X 0.1uF 16V PPS 1210 SMD
C5                               22pF 50V CERM  0805 SMD
C2                               4.7F 10V CERM 0805 SMD
Q1                               NPN 三极管 MMBT3904
X1                                40KHz Quartz Crystal
TX1                                TRANS 40KHz 超声波 S类型
RX1                                RCVR 40KHz 超声波 S类型
LED1                                  RED LED
S1                                  滑动开关
9V                                     电池合(PCB装配式)
9V                                     9V碱性的电池
U1                                  MSP430F413 单片机
U2                                  TI LDO稳压器 TPS77001
U3                                  TI 运放 TLV2771
U4                                  十六进制反相缓冲器 SO-16
J1                                   14 Pin插座
LCD1                                  LCD 0.5” 2 Digit
PCB                                    自制PCB
 

本站提供该文中的部分超声测距元件,请电话联系

超声波传感器   T-40-16/R-40-16    5元/对    防水型:13元/只.   批发另仪

 在超声波测距DIY活动开展以来,全国各地网友反应非常热列。吸引了不少电子爱好者前来参与;为了能够让爱好者更方便地参与本次活动,为此为大家准备了此活动的主要元件材料。如果有需要的网友可以通过邮购方式购买。
   另外,此超声波测距项目也可以采用其形号的MSP430单片机来实现。所以用户未必一定要选择MSP430F413,还可以选择其它MSP430型号。
 

 

 

基于CX20106和TA8141S超声波测距的调试

 

 

(大量提供TA8141S芯片:3元/只)
 

经过大量测试,做超声测距

TA8141S性能超过CX20106本站部分产品将使用TA8141S

 

用TA8141S代换CX20106时要注意:

 TA8141S ①脚为空脚,其②一⑨脚与 CX20106 ①一⑧脚对应

 


     
在超声测距中,一般采用40KHz的信号。可以通过硬件来产生,比如555CMOS电路CD4046。还可以通过软件来产生。本方案中采用 单片机软件产生。

关于40KHz信号的产生。如果用单片机定时器中断产生,要特别注意中断服务程序的编写。中断服务不能过长,如果过长,单片机在前一个中断服务程序还没执行完之前,又会有下一个中断产生。所以,单片机将会产生一个错误频率的信号。往往这个错误的频率会比预期的值偏低。比如程序原本要产生一个40KHz的信号。实际单片机只能产生一个20KHz左右的信号。

 40KHz的信号可以用一个汇编语言子程序来产生。程序如下:

    NAME      CS_T

 ? PR? CS_T? CS_T  SEGMENT   CODE

                  PUBLIC    CS_T

                  RSEG      ?PR?CS_T?CS_T

 CS_T:            PUSH      ACC

                  MOV      TH0,  #00H

                  MOV      TL0,  #00H

                  MOV      A,    #4D

                  SETB      TR0

 CST_1:           CPL       P1.0

                  NOP

                  NOP

                  NOP

                  NOP

                  NOP

                  NOP

                  NOP

                  NOP

                  NOP

                  DJNZ     ACC,CS_T1

                  POP      ACC

                  RET

;

                  END

平常C语言用的很多,我个人觉得C语言更富有亲切感。40KHz的信号可以用一个汇编语言子程序来产生。程序如下

 

/************************************

*输入整型i,p3_5端口产生i/2个方波 

*************************************

*/

 

cs_t(unsigned char i)

{

  while(i--)

     {

      P3_5=!P3_5;

      Some_Nop_T();

     }

}

 

 

 

 

 关于TA8141S的调试。其内部结构如图1
 

 

                       1

在图2

R4C3 是控制TA8141S 内部放大增益,R5控制带通滤波器的中心频率。一般取R4=4欧,C3=1Uf.。其余元件按图2取值。US_T为超声波接收头,OUT_INT当收到超声波是产生一个下降沿,接到单片机的外部中断上。

一些资料表示,在TA8141S2脚输入0.2mV的信号。在8脚将会输出滤波后放大的有用信号。在实测中,8脚并没有一个放大的信号输出。实际调试的时候只关心芯片的8脚在收到信号是是否有一个下降沿产生。

在本电路的调试中,如果一直发射超声波,在8脚将会有周期的低电平产生。不会像通常认为的那样,即一直发射信号时,8脚一直为低电平。这是刚用TA8141S时的一个常见错误。只要通过单片机来来计算发射信号时到收到信号是产生下降沿这段时间的长度,再通过数学计算,转化为距离,然后在显示器上显示。

 

 

发射电路

 

下图是使用 TA8141S 作为超声波接收处理的典型电路,供参考。(当 TA8141S接收到40KHz的信号时,会在第8脚产生一个低电平下降脉冲,这个信号可以接到单片机的外部中断引脚作为中断信号输入)

 

 

图:2

 

注意事项

 

一、超声波发射部分应该注意的地方

  1、首先确定你发射出的超声波的频率为标准的 40KHz(占空比50%),并保证有足够的驱动电压。

  2、如果你驱动的是开放式的非防水探头(就是铝外壳,探头表面有金属网,可以看到里面有一锥形的金属),则使用反相器串联再并联做BTL推动就可以了(短距离测距,10vpp以上的电压即可)。

  3、如果使用的探头是全封闭的防水头,那就要主要必须有足够的驱动电压才能驱动得了探头(至少要60vpp以上,必须使用倒车雷达专用的中周变压器,这个器件可以找电感生产厂家,已经批量产业化的器件,所以容易购买。注意下匝数比就可以,一般有1:10、1:7几种匝数比,都可以用)。

  二、TA8141S的第6脚的电阻决定接收的中心频率,200k的电阻决定了接收的中心频率为40KHz。

  使用TA8141S优点: 简单易用,电路简单,减少了生产调试的麻烦。
 

  三、关于超声波的应用在里有很多的资料可以参考,请自己查找。
 

大量提供TA8141S芯片:3元/只
           CX20106芯片:3元/只(拆机件)  
 

 

超声波传感器   T-40-16/R-40-16    5元/对    防水型:13元/只.   批发另仪

 

拆机板,上面有做超声波测距的CX20106A,及其电阻和电容,大量现货。

积压红外接收头,上面有做超声波测距的CX20106A,及其电阻和电容,大量现货。

 

超声波物位变送器超声波传感器/换能器/雾化器  压电陶瓷超声波传感器 超声波感应模块 SS-311超声波感应模块 SS-311RT超声波感应模块   超声波测距模块/测距仪国产超声播传感器一国产超声波传感器二 超声波传感器测距模块   SUNSTAR 系列超声波感应模块选择指南

超声波模块(串口输出方式)

超声波模块(PWM脉冲方式输出)

超声波测距模块SSD-ME007V2

超声波模块显示板+串口超声波

超声波控制板

超声波显示板+一体化超声波

超声波显示板SSD-ME008

一体化超声波SSD-ME007Y(带

一体化超声波SSD-ME007Y

串口超声波SSD-ME007TX

超声波显示板+带温补超声波

超声波测距模块SSD-ME007V2

一体化超声波SSD-ME007WG

可调开关量超声波+显示模块

可调开关量超声波测距模块SSD-ME

超声波身高测量传感器模块

超声波车位探测器

超声波测距模块(带继电器)\防水型超声波模块

超声波距离控制器

USB接口超声波模块

长距离(10米)超声波测距模块/机器人避障模块

1米开关量输出超声波模块

一体化50K超声波模块

125K 超声波模块

     

超声波传感器  超声波测距模块 

压电陶瓷超声传感器 超声波测距系统的电路设计
40RS防水型超声波传感器

超声波测距电路板CJ-1B  RS232接口

超声波汽车测距告警装置
CJ-1超声波传感器测距电路板  0.24--5M 40kHZ超声波发射/接收电路 综述
超声波物体位移探测器 51单片机设计测距仪原理及其简单应用
LED数显超声波测距控制器  0.24---10M 超声波液位/物位传感器
CJ-2超声波测距板(可提供散件) MSP430超声波测距
CJ-3超声波测距板 (可提供散件) 0.27--5米 基于TA8141S超声波测距的调试
超声波距离传感器  新 超声波驱鼠器传感器
 超声波传感器

 

超声波 TC33-10D TC40-14D TC40-16D TC40-18D
TCT40系列 UT-180 S-3001雷达感应器  
超声雾化片 超声雾化器 D-2001汽车倒车雷达  
超声物液位探测 SC0025 SC0026 SC0027 SC0028
SC0029 SC0030 SC0031 SC0032
SC0033 产品距离说明
产品名称: 超声波传感器(总)
资料下载
产品名称: 超声波传感器 25.0KHz
资料下载
产品名称: 超声波传感器 32.8KHz
资料下载
产品名称: 超声波传感器 40.0KHz(分开)
资料下载
产品名称: 超声波传感器 40.0KHz(一体)
资料下载
产品名称: 超声波传感器(附加类型)
资料下载
产品名称: 超声波传感器(开放)
资料下载
产品名称: 超声波传感器(封闭)
资料下载
 

 

 

更多产品请看本公司产品专用销售网站:

中国传感器科技信息网:http://www.sensor-ic.com/

SSTKJ工控安防网:http://www.pc-ps.net/

SSTKJ电子 元器件网:http://www.sunstare.com/

SSTKJ微波光电产品网:HTTP://www.rfoe.net/

消费电子产品网://www.icasic.com/

科技产品网://www.sunstars.cn/传感器销售热线:

    地址:深圳市福田区福华路福庆街鸿图大厦9732室

    电话:0755-83376489 83376549 83607652 83370250   83370251   83376549

    传真:0755-83376182  (0)13902971329  MSN: xjr5@163.com

    邮编:518033   E-mail:szss20@163.com     QQ: 195847376

    深圳赛格展销部:深圳华强北路赛格电子市场9583号 电话:0755-83665529   13823648918

    技术支持: 0755-83394033 13501568376

欢迎索取免费详细资料、设计指南和光盘 ;产品凡多,未能尽录,欢迎来电查询。

    北京分公司:北京海淀区知春路132号中发电子大厦3097

               TEL  13823791822  FAX010-62543996 

    上海分公司:上海市北京东路668号上海賽格电子市场地下一层D25号

               TEL  56703037  13823676822  FAX021-56703037

    西安分公司:西安高新开发区20(中国电子科技集团导航技术研究所

           西安劳动南路88号电子商城二楼D23 

            TEL  18926764199  FAX:029-77678271