永利yl23411|官方网站|欢迎您

永利yl23411|官方网站
专注电子产品研发外包服务 基于客户要求的个性化设计
021-51360000

艾灸理疗仪软件设计说明书

浏览数:2961 

理疗仪软件设计说明书

  • 引言
  •    理疗仪是一种家用理疗仪,是指在家通过物理治疗的方法来进行保健的仪器,主要是通过将艾草的功效作用于人体,使病变组织或者整体好转的仪器。现代疗的防病保健作用已成为重要保健方法之一。本设备可以自己控制温度,自动化调控,方便、无烟、养生。


    1.1 本设计说明书的主要目的是为本产品相关的设计人员提供本控制软件的设计思路和代码的解释,从而可以对现有的代码进行维护和进一步完善,以及在现有的基础上增加新的功能。


    1.2项目背景:

    ● 本项目属于产学研合作项目,主要解决理疗仪的软件控制和一体化配合,为理疗仪实用化创造条件。

    该软件系统接收蓝牙发来的信息,根据人为的温度控制来调节。


    1.3该软件所用到的具体的硬件:

     JDY-08---蓝牙模块

    STM32F030---该软件所使用的处理器

    3P50---该软件所使用的一种传感器

     热敏电阻


    1.4 参考资料:

    ● 《嵌入式产品分析与设计》电子工业出版社2013年10月

    ISBN:978-7-121-20618-4


  • 任务概述
  •    电子技术,计算机技术和图像分析技术,广泛应用于医药,理疗设备。现今使用的理疗仪功能多化,操作方便,并且也很安全高效,在国外,家庭保健和理疗起步很早,技术也得到了改善,而且推广很大众化,最近几年国内也掀起了理疗热,各种理疗仪,例如低频治疗仪,如红外治疗仪,磁场探测器和其他小的工具,现在已经进入了家庭在国内和国外

    本设计利用蓝牙模块控制输出脉冲信号,利用电源等外部硬件组成一个脉冲理疗仪,对各方案进行了细心的比较,并对设计中使用的芯片进行了仔细的分析。因此,本系统的安全性和扩展性都比较好。

      系统软件是一种不需要用户干预的程序集合,也控制和协调计算机和外部设备,主要功能是调度,监控,维护计算机系统,负责管理计算机系统中各种独立的硬件才能协调工作。所以,可以说软件系统是连接需求分析、硬件系统以及使得系统实现的桥梁,对软件的设计应首先了解软件设计的设计原则:  

    1.可靠性:软件可靠性是指软件,可以避免失败的测试运行期间发生的能力,和失败的事件之后,逃生能力和故障排除。  

    2.可修改性:合理的要求,设计了软件,它具有良好的结构,完整的文档的科学方法,完备系统的性能。

    3.易于调整,程序简便。  

    4.可测试性 :可测试性就是设计一个适当的数据集合,用来测试所建立的系统,并保证系统得到全面的检验。  

    5.标准化原则 :在结构上实现开放,基于业界开放式标准,符合国家和信息产业部的规范。


  • 总体设计
  • PWM控制部分:
  • 脉宽调制PWM是开关型稳压电源中的术语。这是按稳压的控制方式分类的,除了PWM型,还有PFM型和PWM、PFM混合型。脉宽宽度调制式(PWM)开关型稳压电路是在控制电路输出频率不变的情况下,通过电压反馈调整其占空比,从而达到稳定输出电压的目的。  随着电子技术的发展,出现了多种PWM技术,其中包括:相电压控制PWM、脉宽PWM法、随机PWM、SPWM法、线电压控制PWM等,而在镍氢电池智能充电器中采用的脉宽PWM法,它是把每一脉冲宽度均相等的脉冲列作为PWM波形,通过改变脉冲列的周期可以调频,改变脉冲的宽度或占空比可以调压,采用适当控制方法即可使电压与频率协调变化。可以通过调整PWM的周期、PWM的占空比而达到控制充电电流的目的。  pwm的定义   脉宽调制(PWM)是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。   模拟信号的值可以连续变化,其时间和幅度的分辨率都没有限制。9V电池就是一种模拟器件,因为它的输出电压并不精确地等于9V,而是随时间发生变化,并可取任何实数值。与此类似,从电池吸收的电流也不限定在一组可能的取值范围之内。模拟信号与数字信号的区别在于后者的取值通常只能属于预先确定的可能取值集合之内,例如在{0V, 5V}这一集合中取值。   模拟电压和电流可直接用来进行控制,如对汽车收音机的音量进行控制。在简单的模拟收音机中,音量旋钮被连接到一个可变电阻。拧动旋钮时,电阻值变大或变小;流经这个电阻的电流也随之增加或减少,从而改变了驱动扬声器的电流值,使音量相应变大或变小。与收音机一样,模拟电路的输出与输入成线性比例。

    尽管模拟控制看起来可能直观而简单,但它并不总是非常经济或可行的。其中一点就是,模拟电路容易随时间漂移,因而难以调节。能够解决这个问题的精密模拟电路可能非常庞大、笨重(如老式的家庭立体声设备)和昂贵。模拟电路还有可能严重发热,其功耗相对于工作元件两端电压与电流的乘积成正比。模拟电路还可能对噪声很敏感,任何扰动或噪声都肯定会改变电流值的大小。   通过以数字方式控制模拟电路,可以大幅度降低系统的成本和功耗。此外,许多微控制器和DSP已经在芯片上包含了PWM控制器,这使数字控制的实现变得更加容易了。


    PWM相关概念

    占空比:就是输出的PWM中,高电平保持的时间 与 该PWM的时钟周期的时间 之比  如,一个PWM的频率是1000Hz,那么它的时钟周期就是1ms,就是1000us,如果高电平出现的时间是200us,那么低电平的时间肯定是800us,那么占空比就是200:1000,也就是说PWM的占空比就是1:5。  分辨率也就是占空比最小能达到多少,如8位的PWM,理论的分辨率就是1:255(单斜率), 16位的PWM理论就是1:65535(单斜率)。  频率就是这样的,如16位的PWM,它的分辨率达到了1:65535,要达到这个分辨率,T/C就必须从0计数到65535才能达到,如果计数从0计到80之后又从0开始计到80.......,那么它的分辨率最小就是1:80了,但是,它也快了,也就是说PWM的输出频率高了。 双斜率 / 单斜率  假设一个PWM从0计数到80,之后又从0计数到80.......   这个就是单斜率。 假设一个PWM从0计数到80,之后是从80计数到0.......   这个就是双斜率。 可见,双斜率的计数时间多了一倍,所以输出的PWM频率就慢了一半,但是分辨率却是1:(80+80) =1:160,就是提高了一倍。    假设PWM是单斜率,设定最高计数是80,我们再设定一个比较值是10,那么T/C从0计数到10时(这时计数器还是一直往上计数,直到计数到设定值80),单片机就会根据你的设定,控制某个IO口在这个时候是输出1还是输出0还是端口取反。

    模拟电路  

    模拟信号的值可以连续变化,其时间和幅度的分辨率都没有限制。9V电池就是一种模拟组件,因为它的输出电压并不精确地等于9V,而是随时间产生变化,并可取任何实数值。与此类似,从电池吸收的电流也不限定在一组可能的取值范围之内。模拟信号与数字信号的区别在于后者的取值通常只能属于预先确定的可能取值集合之内,例如在(0V, 5V)这一集合中取值。   模拟电压和电流可直接用来进行控制,如对汽车收音机的音量进行控制。在简单的模拟收音机中,音量旋钮被连接到一个可变电阻。拧动旋钮时,电阻值变大或变小;流经这个电阻的电流也随之增加或减少,从而改变了驱动扬声器的电流值,使音量相应变大或变小。与收音机一样,模拟电路的输出与输入成线性比例。   尽管模拟控制看起来可能直观而简单,但它并不总是非常经济或可行的。其中一点就是,模拟电路容易随时间漂移,因而难以调节。能够解决这个问题的精密模拟电路可能非常庞大、笨重(如老式的家庭立体声设备)和昂贵。模拟电路还有可能严重发热,其功耗相对于工作组件两端电压与电流的乘积成正比。模拟电路还可能对噪声很敏感,任何扰动或噪声都肯定会改变电流值的大小。  

    数字控制  

    由以数字方式控制模拟电路,可以大幅度降低系统的成本和功耗。此外,许多微控制器和DSP已经在芯片上包含了PWM控制器,这使数字控制的实现变得更加容易了。   简而言之,PWM是一种对模拟信号电平进行数字编码的方法。由高分辨率计数器的使用,方波的占空比被调变用来对一个具体模拟信号的电平进行编码。PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要频宽足够,任何模拟值都可以使用PWM进行编码。

    硬件控制器  

    许多微控制器内部都包含有PWM控制器。例如,Microchip公司的PIC16C67内含两个PWM控制器,每一个都可以选择接通时间和周期。占空比是接通时间与周期之比;调变频率为周期的倒数。执行PWM作业之前,这种微处理器要求在软件中完成以下工作:  设置提供调变方波的片上定时器/计数器的周期  在PWM控制缓存器中设置接通时间   设置PWM输出的方向,这个输出是一个通用I/O管脚  启动定时器  使能PWM控制器   虽然具体的PWM控制器在编程细节上会有所不同,但它们的基本方向通常是相同的。  

    通讯与控制  

    PWM的一个优点是从处理器到被控系统信号都是数字形式的,无需进行数字模拟转换。让信号保持为数字形式可将噪声影响降到最小。噪声只有在强到足以将逻辑1改变为逻辑0或将逻辑0改变为逻辑1时,也才能对数字信号产生影响。   对噪音抵抗能力的增强是PWM相对于模拟控制的另外一个优点,而且这也是在某些时候将PWM用于通讯的主要原因。从模拟信号转向PWM可以极大地延长通讯距离。在接收端,藉由适当的RC或LC网络可以滤除调变高频方波并将信号还原为模拟形式。   PWM广泛应用在多种系统中。作为一个具体的例子,我们来考察一种用PWM控制的制动器。简单地说,制动器是紧夹住某种东西的一种装置。许多制动器使用模拟输入信号来控制夹紧压力(或制动功率)的大小。加在制动器上的电压或电流越大,制动器产生的压力就越大。   可以将PWM控制器的输出连接到电源与制动器之间的一个开关。要产生更大的制动功率,只需藉由软件加大PWM输出的占空比就可以了。如果要产生一个特定大小的制动压力,需要藉由测量来确定占空比和压力之间的数学关系(所得的公式或查找表藉由变换可用于控制温度、表面磨损等等)。   例如,假设要将制动器上的压力设定为100psi,软件将作一次反向查找,以确定产生这个大小的压力的占空比应该是多少。然后再将PWM占空比设置为这个新值,制动器就可以相应地进行响应了。如果系统中有一个传感器,则可以藉由死循环控制来调节占空比,直到精确产生所需的压力。


    脉冲宽度调制(PWM)是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的空比被调制用来对一个具体模拟信号的电平进行编码。PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复

    脉冲序列被加到模拟负载上去的。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟值都可以使用PWM进行编码。    多数负载(无论是电感性负载还是电容性负载)需要的调制频率高于10Hz,通常调制频率为1kHz到200kHz之间。     许多微控制器内部都包含有PWM控制器。例如,Microchip公司的PIC16C67内含两个PWM控制器,每一个都可以选择接通时间和周期。占空比是接通时间与周期之比;调制频率为周期的倒数。执行PWM操作之前,这种微处理器要求在软件中完成以下工作:    

    1、设置提供调制方波的片上定时器/计数器的周期    

    2、 在PWM控制寄存器中设置接通时间    

    3、设置PWM输出的方向,这个输出是一个通用I/O管脚    

    4、启动定时器    

    5、使能PWM控制器

    PWM的一个优点是从处理器到被控系统信号都是数字形式的,无需进行数模转换。让信号保持为数字形式可将噪声影响降到最小。噪声只有在强到足以将逻辑1改变为逻辑0或将逻辑0改变为逻辑1时,也才能对数字信号产生影响。     对噪声抵抗能力的增强是PWM相对于模拟控制的另外一个优点,而且这也是在某些时候将PWM用于通信的主要原因。从模拟信号转向PWM可以极大地延长通信距离。在接收端,通过适当的RC或LC网络可以滤除调制高频方波并将信号还原为模拟形式。

    采样控制理论中有一个重要结论:冲量相等而形状不同的窄脉冲加在具有惯性的环节上时,其效果基本相同.PWM控制技术就是以该结论为理论基础,对半导体开关器件的导通和关断进行控制,使输出端得到一系列幅值相等而宽度不相等的脉冲,用这些脉冲来代替正弦波或其他所需要的波形.按一定的规则对各脉冲的宽度进行调制,既可改变逆变电路输出电压的大小,也可改变输出频率.     PWM控制的基本原理很早就已经提出,但是受电力电子器件发展水平的制约,在上世纪80年代以前一直未能实现.直到进入上世纪80年代,随着全控型电力电子器件的出现和迅速发展,PWM控制技术才真正得到应用.随着电力电子技术,微电子技术和自动控制技术的发展以及各种新的理论方法,如现代控制理论,非线性系统控制思想的应用,PWM控制技术获得了空前的发展.到目前为止,已出现了多种PWM控制技术,根据PWM控制技术的特点

    脉宽调制PWM是开关型稳压电源中的术语。这是按稳压的控制方式分类的,除了PWM型,还有PFM型和PWM、PFM混合型。脉宽宽度调制式(PWM)开关型稳压电路是在控制电路输出频率不变的情况下,通过电压反馈调整其占空比,从而达到稳定输出电压的目的。


  • 脉冲宽度调制是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。

    脉冲宽度调制是一种模拟控制方式,其根据相应载荷的变化来调制晶体管基极或MOS管栅极的偏置,来实现晶体管或MOS管导通时间的改变,从而实现开关稳压电源输出的改变。这种方式能使电源的输出电压在工作条件变化时保持恒定,是利用微处理器的数字信号对模拟电路进行控制的一种非常有效的技术。

    PWM控制技术以其控制简单,灵活和动态响应好的优点而成为电力电子技术最广泛应用的控制方式,也是人们研究的热点。由于当今科学技术的发展已经没有了学科之间的界限,结合现代控制理论思想或实现无谐振波开关技术将会成为PWM控制技术发展的主要方向之一。其根据相应载荷的变化来调制晶体管基极或MOS管栅极的偏置,来实现晶体管或MOS管导通时间的改变,从而实现开关稳压电源输出的改变。这种方式能使电源的输出电压在工作条件变化时保持恒定,是利用微处理器的数字信号对模拟电路进行控制的一种非常有效的技术。

      随着电子技术的发展,出现了多种PWM技术,其中包括:相电压控制PWM、脉宽PWM法、随机PWM、SPWM法、线电压控制PWM等,而在镍氢电池智能充电器中采用的脉宽PWM法,它是把每一脉冲宽度均相等的脉冲列作为PWM波形,通过改变脉冲列的周期可以调频,改变脉冲的宽度或占空比可以调压,采用适当控制方法即可使电压与频率协调变化。可以通过调整PWM的周期、PWM的占空比而达到控制充电电流的目的。

    模拟信号的值可以连续变化,其时间和幅度的分辨率都没有限制。9V电池就是一种模拟器件,因为它的输出电压并不精确地等于9V,而是随时间发生变化,并可取任何实数值。与此类似,从电池吸收的电流也不限定在一组可能的取值范围之内。模拟信号与数字信号的区别在于后者的取值通常只能属于预先确定的可能取值集合之内,例如在{0V,5V}这一集合中取值。

    模拟电压和电流可直接用来进行控制,如对汽车收音机的音量进行控制。在简单的模拟收音机中,音量旋钮被连接到一个可变电阻。拧动旋钮时,电阻值变大或变小;流经这个电阻的电流也随之增加或减少,从而改变了驱动扬声器的电流值,使音量相应变大或变小。与收音机一样,模拟电路的输出与输入成线性比例。

    尽管模拟控制看起来可能直观而简单,但它并不总是非常经济或可行的。其中一点就是,模拟电路容易随时间漂移,因而难以调节。能够解决这个问题的精密模拟电路可能非常庞大、笨重(如老式的家庭立体声设备)和昂贵。模拟电路还有可能严重发热,其功耗相对于工作元件两端电压与电流的乘积成正比。模拟电路还可能对噪声很敏感,任何扰动或噪声都肯定会改变电流值的大小。

    通过以数字方式控制模拟电路,可以大幅度降低系统的成本和功耗。此外,许多微控制器和DSP已经在芯片上包含了PWM控制器,这使数字控制的实现变得更加容易了。

    pwm的工作原理  

    脉冲宽度调制波通常由一列占空比不同的矩形脉冲构成,其占空比与信号的瞬时采样值成比例。图1所示为脉冲宽度调制系统的原理

    框图和波形图。该系统有一个比较器和一个周期为Ts的锯齿波发生器组成。语音信号如果大于锯齿波信号,比较器输出正常数A,否则输出0。因此,从图1中可以看出,比较器输出一列下降沿调制的脉冲宽度调制波。

    框图和波形图。该系统有一个比较器和一个周期为Ts的锯齿波发生器组成。语音信号如果大于锯齿波信号,比较器输出正常数A,否则输出0。因此,从图1中可以看出,比较器输出一列下降沿调制的脉冲宽度调制波。

       通过图1b的分析可以看出,生成的矩形脉冲的宽度取决于脉冲下降沿时刻t k时的语音信号幅度值。因而,采样值之间的时间间隔是非均匀的。在系统的输入端插入一个采样保持电路可以得到均匀的采样信号,但是对于实际中tk-kTs<矩形脉冲可以表示为:

       

    其中,x{t}是离散化的语音信号;Ts

    是采样周期; 是未调制 宽度;m是调制指数。   然而,如果对矩形脉冲作如下近似:脉冲幅度为A,中心在t = k Ts

    处,  在相邻脉冲间变化缓慢,则脉冲宽度调制波xp(t)可以表示为:

     

    由式(2)可以看 出脉冲宽度信号由语音信号x(t)加上一个直流成分以及相位调制波构

    成。当   时,相位调制部分引起的信号交迭可以忽略,因此, 脉冲宽度调制波可以直接通过低通滤波器进行解调。

    数字脉冲宽度调制器的实现:

    图中,在时钟脉冲的作用下,循环计数器的5位输出逐次增大。5位数字调制信号用一个寄存器来控制,不断于循环计数器的输出进行比较,当调制信号大于循环计数器的输出时,比较器输出高电平,否则输出低电平。循环计数器循环一个周期后,向寄存器发出一个使能信号EN,寄存器送入下一组数据。在每一个计数器计数周期,由于输入的调制信号的大小不同,比较器输出端输出的高电平个数不一样,因而产生出占空比不同的脉冲宽度调制波。

    为了使矩形脉冲的中心近似在t=kTs处,计数器所产生的数字码不是由小到大或由大到小顺序变化,而是将数据分成偶数序列和奇数序列,在一个计数周期,偶数序列由小变大,直到最大值,然后变为对奇数序列计数,变化为由大到小。如图3例子。  奇偶序列的产生方法是将计数器的最后一位作为比较数据的最低位,在一个计数周期内,前半个周期计数器输出最低位为0,其他高位逐次增大,则产生的数据即为偶数序列;后半个周期输出最低位为1,其余高位依次减小,产生的数据为依次减小的偶序列。具体电路可以由以下电路图表示:


    PWM模块应包括: 1 比较部分(Comp): 2 计数部分(Counter):  3 状态及控制信号寄存/控制器(PWM_Ctrl); 1 状态积寄存器:(Flags),地址:E8H  EN PWM模块启动位,置位为„1将使PWM模块开始工作; ②(留空备用)  ③④解调速率标志位:00 – 无分频;01 – 2分频;10 – 10频;11 – 16分频。 RESET后为00  ⑤(留空备用)⑥(留空备用) ⑦(留空备用) ⑧(留空备用)  注意:该寄存器可以位操作情况下可写,不可读;只能在字节操作方式下读取。  2) 数据寄存器(DataStore),地址:F8H; 注意:该寄存器值不可读,只可写。 4、 端口:  1) 数据总线(DataBus);(双向) 2) 地址总线(AddrBus);(IN)  3) PWM波输出端口(PWMOut);(OUT) 4) 控制线:  ① CLK:时钟;(IN)  ② Reset:异步复位信号;(IN 低电平有效) ③ WR:写PWM RAM信号;(IN 低电平有效);  ④ RD:读PWM RAM信号;(IN 低电平有效)

    ⑤ DONE:接受完毕反馈信号;(OUT 高电平有效) ⑥ INT:中断申请信号;(OUT 低电平有效) ⑦ IntResp:中断响应信号;(In低电平有效)  ⑧ ByteBit:字节/位操作控制信号(IN 1-BYTE 0-BIT);


    脉宽调制(PWM)基本原理:

    控制方式就是对逆变电路开关器件的通断进行控制,使输出端得到一系列幅值相等的脉冲,用这些脉冲来代替正弦波或所需要的波形。也就是在输出波形的半个周期中产生多个脉冲,使各脉冲的等值电压为正弦波形,所获得的输出平滑且低次谐波少。按一定的规则对各脉冲的宽度进行调制,即可改变逆变电路输出电压的大小,也可改变输出频率。

      

      例如,把正弦半波波形分成N等份,就可把正弦半波看成由N彼此相连的脉冲所组成的波形。这些脉冲宽度相等,都等于 π/n ,但幅值不等,且脉冲顶部不是水平直线,而是曲线,各脉冲的幅值按正弦规律变化。如果把上述脉冲序列用同样数量的等幅而不等宽的矩形脉冲序列代替,使矩形脉冲的中点和相应正弦等分的中点重合,且使矩形脉冲和相应正弦部分面积(即冲量)相等,就得到一组脉冲序列,这就是PWM波形。可以看出,各脉冲宽度是按正弦规律变化的。根据冲量相等效果相同的原理,PWM波形和正弦半波是等效的。对于正弦的负半周,也可以用同样的方法得到PWM波形。

    在PWM波形中,各脉冲的幅值是相等的,要改变等效输出正弦波的幅值时,只要按同一比例系数改变各脉冲的宽度即可,因此在交-直-交变频器中,PWM逆变电路输出的脉冲电压就是直流侧电压的幅值。

    根据上述原理,在给出了正弦波频率,幅值和半个周期内的脉冲数后,PWM波形各脉冲的宽度和间隔就可以准确计算出来。按照计算结果控制电路中各开关器件的通断,就可以得到所需要的PWM波形。

    下图为变频器输出的PWM波的实时波形。


  • PWM(Pulse
    Width Modulation)控制——脉冲宽度调制技术,通过对一系列脉冲的宽度进行调制,来等效地获得所需要波形(含形状和幅值)。



    PWM控制技术在逆变电路中应用最广,应用的逆变电路绝大部分是PWM型,PWM控制技术正是有赖于在逆 变电路中的应用,才确定了它在电力
    电子技术中的重要地位。


    理论基础:



    冲量相等而形状不同的窄脉冲加在具有惯性的环节上时,其效果基本相同。
    冲量指窄脉冲的面积。效果基本相同,是指环节的输出响应波形基本相同。低频段非常接近,仅在高频段略有差异。



  • 图1 形状不同而冲量相同的各种
    脉冲



  • 面积等效原理:



    分别将如图1所示的电压
    脉冲加在一阶惯性环节(R-L电路)上,如图2a所示。其输出电流i(t)对不同脉冲时的响应波形如图2b所示。从波形可以看出,在i(t)的上升段,i(t)的形状也略有不同,但其下降段则几乎完全相同。脉冲越窄,各i(t)响应波形的差异也越小。如果周期性地施加上述脉冲,则响应i(t)也是周期性的。用傅里叶级数分解后将可看出,各i(t)在低频段的特性将非常接近,仅在高频段有所不同。



  • 图2 冲量相同的各种
    脉冲的响应波形



  • 用一系列等幅
    等宽的脉冲来代替一个正弦半波,正弦半波N等分,看成N相连的脉冲序列,宽度相等,但幅值不等;用矩形脉冲代替,等幅,等宽,中点重合,面积(冲量)相等,宽度按正弦规律变化。


    SPWM波形——脉冲宽度按正弦规律变化而和正弦波等效的PWM波形。



  • 图3 用PWM波代替正弦半波



  • 要改变等效输出正弦波幅值,按同一比例改变各脉冲宽度即可。



    PWM电流波: 电流型逆变电路进行PWM控制,得到的就是PWM电流波。



    PWM波形可等效的各种波形:



    直流斩波电路:等效直流波形



    SPWM波:等效正弦波形,还可以等效成其他所需波形,如等效所需非正弦交流波形等,其基本原理和SPWM控制相同,也基于等效面积原理。



    随着电子技术的发展,出现了多种PWM技术,其中包括:相电压控制PWM、脉宽PWM法、随机PWM、SPWM法、线电压控制PWM等,而本文介绍的是在镍氢电池智能充电器中采用的脉宽PWM法。它是把每一脉冲宽度均相等的脉冲列作为PWM波形,通过改变脉冲列的周期可以调频,改变脉冲的宽度或占空比可以调压,采用适当控制方法即可使电压与频率协调变化。可以通过调整PWM的周期、PWM的占空比而达到控制充电电流的目的。



    PWM技术的具体应用



    PWM软件法控制充电电流



    本方法的基本思想就是利用
    单片机具有的PWM端口,在不改变PWM方波周期的前提下,通过软件的方法调整单片机的PWM控制寄存器来调整PWM的占空比,从而控制充电电流。本方法所要求的单片机必须具有ADC端口和PWM端口这两个必须条件,另外ADC的位数尽量高,单片机的工作速度尽量快。在调整充电电流前,单片机先快速读取充电电流的大小,然后把设定的充电电流与实际读取到的充电电流进行比较,若实际电流偏小则向增加充电电流的方向调整PWM 的占空比;若实际电流偏大则向减小充电电流的方向调整PWM的占空比。在软件PWM的调整过程中要注意ADC的读数偏差和电源工作电压等引入的纹波干扰,合理采用算术平均法等数字滤波技术。软件PWM法具有以下优缺点。

    简化了PWM的硬件电路,降低了硬件的成本。利用软件PWM不用外部的硬件PWM和电压比较器,只需要功率MOSFET、续流磁芯、储能电容等元器件,大大简化了外围电路。可控制流大小。在PWM控制充电的过程中,单片机可实时检测ADC端口上充电电流的大小,并根据充电电流大小与设定的流进行比较,以决定PWM占空比的调整方向。电池唤醒充电。单片机利用ADC端口与PWM的寄存器可以任意设定充电电流的大小,所以,对于电池电压比较低的电池,在上电后,可以采取小电流充一段时间的方式进行充电唤醒,并且在小电流的情况下可以近似认为恒流,对电池的冲击破坏也较小。
     电流控制精度低。充电电流的大小的感知是通过电流采样电阻来实现的,采样电阻上的压降传到单片机的ADC输入端口,单片机读取本端口的电压就可以知道充电电流的大小。若设定采样电阻为Rsample(单位为Ω),采样电阻的压降为Vsample(单位为mV), 10位ADC的参考电压为5.0V。则ADC的1 LSB对应的电压值为 5000mV/1024≈5mV。一个5mV的数值转换成电流值就是50mA,所以软件PWM电流控制精度最大为50mA。若想增加软件PWM的电流控制精度,可以设法降低ADC的参考电压或采用10位以上ADC的单片机。


    PWM采用
    软启动的方式。在进行大电流快速充电的过程中,充电从停止到重新启动的过程中,由于磁芯上的反电动势的存在,所以在重新充电时必须降低PWM的有效占空比,以克服由于软件调整PWM的速度比较慢而带来的无法控制充电电流的问题。充电效率不是很高。在快速充电时,因为采用了充电软启动,再加上单片机的PWM调整速度比较慢,所以实际上停止充电或小电流慢速上升充电的时间是比较大的。为了克服2和3缺点带来的充电效率低的问题,我们可以采用充电时间比较长,而停止充电时间比较短的充电方式,例如充2s停50ms,再加上软启动时的电流慢速启动折合成的停止充电时间,设定为50ms,则实际充电效率为(2000ms-100ms)/2000ms=95%,这样也可以保证充电效率在90%以上。纯硬件PWM法控制充电电流

    由于单片机的工作频率一般都在4MHz左右,由单片机产生的PWM的工作频率是很低的,再加上单片机用ADC方式读取充电电流需要的时间,因此用软件PWM的方式调整充电电流的频率是比较低的,为了克服以上的缺陷,可以采用外部高速PWM的方法来控制充电电流。现在智能充电器中采用的PWM控制芯片主要有TL494等,本PWM控制芯片的工作频率可以达到300kHz以上,外加阻容元件就可以实现对电池充电过程中的恒流限压作用,单片机只须用一个普通的I/O端口控制TL494使能即可。另外也可以采用电压比较器替代TL494,如LM393和LM358等。采用纯硬件PWM具有以下优缺点。    电流精度高。充电电流的控制精度只与电流采样电阻的精度有关,与单片机没有关系。不受软件PWM的调整速度和ADC的精度限制。充电效率高。不存在软件PWM的慢启动问题,所以在相同的恒流充电和相同的充电时间内,充到电池中的能量高。对电池损害小。由于充电时的电流比较稳定,波动幅度很小,所以对电池的冲击很小,另外TL494还具有限压作用,可以很好地保护电池。    硬件的价格比较贵。TL494的使用在带来以上优点的同时,增加了产品的成本,可以采用LM358或LM393的方式进行克服。

    流控制简单,并且是脉动的。电池充电结束后,一般采用涓流充电的方式对电池维护充电,以克服电池的自放电效应带来的容量损耗。单片机的普通I/O控制端口无法实现PWM端口的功能,即使可以用软件模拟的方法实现简单的PWM功能,但由于单片机工作的实时性要求,其软件模拟的PWM频率也比较低,所以最终采用的还是脉冲充电的方式,例如在10%的时间是充电的,在另外90%时间内不进行充电。这样对充满电的电池的冲击较小。单片机 PWM控制端口与硬件PWM融合

    对于单纯硬件PWM的涓流充电的脉动问题,可以采用具有PWM端口的单片机,再结合外部PWM芯片即可解决流的脉动性。在充电过程中可以这样控制充电电流:采用恒流大电流快速充电时,可以把单片机的PWM输出全部为高电平(PWM控制芯片高电平使能)或低电平(PWM控制芯片低电平使能);当进行涓流充电时,可以把单片机的PWM控制端口输出PWM信号,然后通过测试电流采样电阻上的压降来调整PWM的占空比,直到符合要求为止。

    PWM一般选用电压控制型逆变器,是通过改变功率晶体管交替导通的时间来改变逆变器输出波形的频率,改变每半周期内晶体管的通断时间比,也就是说通过改变脉冲宽度来改变逆变器输出电压副值的大小。

    其整流部分与逆变部分基本是对称的。

    总之,最后的输出波形可调,副值可调,甚至功率因数也可调,不过,好象都是用正弦波做为基波的

  • 多微控制器内部都包含有PWM控制器。例如,Microchip公司的PIC16C67内含两个PWM控制器,每一个都可以选择接通时间和周期。占空比是接通时间与周期之比;调制频率为周期的倒数。执行PWM操作之前,这种微处理器要求在软件中完成以下工作:        

    * 设置提供调制方波的片上定时器/计数器的周期        

    * 在PWM控制寄存器中设置接通时间        

    * 设置PWM输出的方向,这个输出是一个通用I/O管脚        

    * 启动定时器        

    * 使能PWM控制器    

    虽然具体的PWM控制器在编程细节上会有所不同,但它们的基本思想通常是相同的。 通信与控制     PWM的一个优点是从处理器到被控系统信号都是数字形式的,无需进行数模转换。让信号保持为数字形式可将噪声影响降到最小。噪声只有在强到足以将逻辑1改变为逻辑0或将逻辑0改变为逻辑1时,也才能对数字信号产生影响。     对噪声抵抗能力的增强是PWM相对于模拟控制的另外一个优点,而且这也是在某些时候将PWM用于通信的主要原因。从模拟信号转向PWM可以极大地延长通信距离。在接收端,通过适当的RC或LC网络可以滤除调制高频方波并将信号还原为模拟形式。     PWM广泛应用在多种系统中。作为一个具体的例子,我们来考察一种用PWM控制的制动器。简单地说,制动器是紧夹住某种东西的一种装置。许多制动器使用模拟输入信号来控制夹紧压力(或制动功率)的大小。加在制动器上的电压或电流越大,制动器产生的压力就越大。     可以将PWM控制器的输出连接到电源与制动器之间的一个开关。要产生更大的制动功率,只需通过软件加大PWM输出的占空比就可以了。如果要产生一个特定大小的制动压力,需要通过测量来确定占空比和压力之间的数学关系(所得的公式或查找表经过变换可用于控制温度、表面磨损等等)。

      例如,假设要将制动器上的压力设定为100psi,软件将作一次反向查找,以确定产生这个大小的压力的占空比应该是多少。然后再将PWM占空比设置为这个新值,制动器就可以相应地进行响应了。如果系统中有一个传感器,则可以通过闭环控制来调节占空比,直到精确产生所需的压力。     总之,PWM既经济、节约空间、抗噪性能强,是一种值得广大工程师在许多设计应用中使用的有效技术。







    3.2热敏电阻算法:

      工作原理

  • 热敏电阻器是敏感元件的一类,按照温度系不同分为正温度系数热敏电阻器(PTC和负温度系数热敏电阻器(NTC)。热敏电阻器的典型特点是对温度敏感,不同的温度下表现出不同的电阻值正温度系数热敏阻器(PTC)在温度越高时电阻值越大,负温度系数热敏电阻器(NTC)在温度越高时电阻值越低,它们同属于半导体器件
  • 热敏电阻将长期处于不动作状态;当环境温度和电流处于c区时,热敏电阻的散热功率与发热功率接近,因而可能动作也可能动作。热敏电阻在环境温度相同时,动作时间随着电流的增加而急剧缩短;热敏电阻在环境温度相对较高时具有更短的动作时间和较小的维持电流及动作电流。

    1、ptc效应是一种材料具有ptc(positive temperature coefficient)效应,即正温度系数效应,仅指此材料的电阻会随温度的升高而增加。如大多数金属材料都具有ptc效应。在这些材料中,ptc效应表现为电阻随温度增加而线性增加,这就是通常所说的线性ptc效应。

    2、非线性ptc效应 经过相变的材料会呈现出电阻沿狭窄温度范围内急剧增加几个至十几个数量级的现象,即非线性ptc效应,相当多种类型的导电聚合体会呈现出这种效应,如高分子ptc热敏电阻。这些导电聚合体对于制造过电流保护装置来说非常有用。

    3、高分子ptc热敏电阻用于过流保护 高分子ptc热敏电阻又经常被人们称为自恢复保险丝(下面简称为热敏电阻),由于具有独特的正温度系数电阻特性,因而极为适合用作过流保护器件。热敏电阻的使用方法普通保险丝一样,是串联在电路中使用。

    当电路正常工作时,热敏电阻温度与室温相近、电阻很小,串联在电路中不会阻碍电流通过;而当电路因故障而出现过电流时,热敏电阻由于发热功率增加导致温度上升,当温度超过开关温度(ts,见图1)时,电阻瞬间会剧增,回路中的电流迅速减小到安全值.为热敏电阻对交流电路保护过程中电流的变化示意图。热敏电阻动作后,电路中电流有了大幅度的降低,图中t为热敏电阻的动作时间。由于高分子ptc热敏电阻的可设计性好,可通过改变自身的开关温度(ts)来调节其对温度的敏感程度,因而可同时起到过温保护和过流保护两种作用,如kt16-1700dl规格热敏电阻由于动作温度很低,因而适用于离子电池和镍氢电池的过流及过温保护。环境温度对高分子ptc热敏电阻的影响 高分子ptc热敏电阻是一种直热式、阶跃型热敏电阻,其电阻变化过程与自身的发热和散热情况有关,因而其维持电流(ihold)、动作电流(itrip)及动作时间受环境温度影响。当环境温度和电流处于a区时,热敏电阻发热功率大于散热功率而会动作;当环境温度和电流处于b区时发热功率小于散热功率,高分子ptc热敏电阻由于电阻可恢复,因而可以重复多次使用。图6为热敏电阻动作后,恢复过程中电阻随时间变化的示意图。电阻一般在十几秒到几十秒中即可恢复到初始值1.6倍左右的水平,此时热敏电阻的维持电流已经恢复到额定值,可以再次使用了。面积和厚度较小的热敏电阻恢复相对较快;而面积和厚度较大的热敏电阻恢复相对较慢。

    基本特性:

  • 热敏电阻的电阻-温度特性可近似地用下式表示:R=R0exp{B(1/T-1/T0)}:R:温度T(K)时的电阻值、Ro:温度T0、(K)时的电阻值、B:B值、*T(K)=t(ºC)+273.15。实际上,热敏电阻的B值并非是恒定的,其变化大小因材料构成而异,最大甚至可达5K/°C。因此在较大的温度范围内应用式1时,将与实测值之间存在一定误差。此处,若将式1中的B值用式2所示的作为温度的函数计算时,则可降低与实测值之间的误差,可认为近似相等。
  • BT=CT2+DT+E,上式中,C、D、E为常数。另外,因生产条件不同造成的B值的波动会引起常数E发生变化,但常数C、D不变。因此,在探讨B值的波动量时,只需考虑常数E即可。常数C、D、E的计算,常数C、D、E可由4点的(温度、电阻值)数据(T0,R0).(T1,R1).(T2,R2)and(T3,R3),通过式3~6计算。首先由式样3根据T0和T1,T2,T3的电阻值求出B1,B2,B3,然后代入以下各式样。
  • 电阻值计算例:试根据电阻-温度特性表,求25°C时的电阻值为5(kΩ),B值偏差为50(K)的热敏电阻在10°C~30°C的电阻值。步骤(1)根据电阻-温度特性表,求常数C、D、E。To=25+273.15T1=10+273.15T2=20+273.15T3=30+273.15(2)代入BT=CT2+DT+E+50,求BT。(3)将数值代入R=5exp {(BT1/T-1/298.15)},求R。*T:10+273.15~30+273.15。
  •  

       NTC热敏电阻是备广泛使用的温度传感器,因为它们的成本低,其可用性在许多尺寸和形状。 使用现代微控制器,现在可以方便地对上述方程进行编程,并获得直接读数(°C(或任何其他温度单位)),而无需复杂的模拟线性化电路。

    应该提到的其他一些缺点:首先工作温度范围限制在约-50到+150°C之间。 这当然取决于NTC的具体模式,但是由于大多数103F热敏电阻NTC使用硅,这些限制不能超过。 由于电阻的对数变化,电路接受的温度范围越宽,精度越低。

    NTC热敏电阻通常是工厂校准的:实际的R 25和B 25/100可以从一个NTC变化到另一个,并且总是需要某种电路调整来进行绝对温度读数。

    最后一个注意事项:通过使用NTC作为温度传感器,由于电流会加热10K3435NTC并引入测量误差,因此,应尽量不要运行大电流。 因此,高值NTC(10kΩ以上)对于温度计来说更好。小值NTC通常不用作温度传感器,但它们制造非常好的浪涌电流限制器。 当NTC串联的电路接通时100K3950NTC最初是冷的,提供几Ω的电阻,限制了浪涌电流,并防止了保险丝的熔断。 一旦电流开始流动,NTC热敏电阻加热,其电阻在mΩ范围内下降,使主电流不受干扰。



    技术参数:

    ①标称阻值Rc:一般指环境温度为25℃时热敏电阻器的实际电阻值。②实际阻值RT:在一定的温度条件下所

    测得的电阻值。

    ③材料常数:它是一个描述热敏电阻材料物理特性的参数,也是热灵敏度指标,B值越大,表示热敏电阻器的灵敏度越高。应注意的是,在实际工作时,B值并非一个常数,而是随温度的升高略有增加。

    ④电阻温度系数αT:它表示温度变化1℃时的阻值变化率,单位为%/℃。

    ⑤时间常数τ:热敏电阻器是有热惯性的,时间常数,就是一个描述热敏电阻器热惯性的参数。它的定义为,在无功耗的状态下,当环境温度由一个特定温度向另一个特定温度突然改变时,热敏电阻体的温度变化了两个特定温度之差的63.2%所需的时间。τ越小,表明热敏电阻器的热惯性越小。

    ⑥额定功率PM:在规定的技术条件下,热敏电阻器长期连续负载所允许的耗散功率。在实际使用时不得超过额定功率。若热敏电阻器工作的环境温度超过 25℃,则必须相应降低其负载。

    ⑦额定工作电流IM:热敏电阻器在工作状态下规定的名义电流值。

    ⑧测量功率Pc:在规定的环境温度下,热敏电阻体受测试电流加热而引起的阻值变化不超过0.1%时所消耗的电功率。

    热敏电阻

    热敏电阻

    ⑨最大电压:对于NTC热敏电阻器,是指在规定的环境温度下,不使热敏电阻器引起热失控所允许连续施加的最大直流电压;对于PTC热敏电阻器,是指在规定的环境温度和静止空气中,允许连续施加到热敏电阻器上并保证热敏电阻器正常工作在PTC特性部分的最大直流电压。⑩最高工作温度Tmax:在规定的技术条件下,热敏电阻器长期连续工作所允许的最高温度。

    ⑾开关温度tb:PTC热敏电阻器的电阻值开始发生跃增时的温度。

  • 耗散系数H:温度增加1℃时,热敏电阻器所耗散的功率,单位为mW/℃。

  • NTC 热敏电阻温度计算公式Rt = R *EXP(B*(1/T1-1/T2))

    这里T1和T2指的是K度即开尔文温度,K度=273.15(绝对温度)+摄氏度;

    其中T2=(273.15+25)Rt 是热敏电阻在T1温度下的阻值;

    R是热敏电阻在T2常温下的标称阻值;

    B值是热敏电阻的重要参数;

    EXP是e的n次方;

    转换得:1/T1 =ln(Rt/R)/B+1/T2,求TI,然后再减去273.15就是实际温度,同时+0.5的误差矫正。


    程序:

    #include "math.h"

    const float Rp=10000.0;             //10K

    const float T2 = (273.15+25.0); //T2

    const float Bx = 3950.0;              //B

    const float Ka = 273.15;


    float temp;

    while(1)

    {

    temp = 1/(log(Rt/Rp)/Bx + (1/T2));

    temp = (temp - Ka + 0.5)*10;

    LCD_ShowxNum(86,150,temp,5,16,0x80);  //显示温度

    }


    将各步拆分如下:


    float Get_Temp(void)

    {

    float Rt;

    float temp;

    Rt = Get_TempResistor();   //获得电阻值

    //like this R=5000, T2=273.15+25,B=3470, RT=5000*EXP(3470*(1/T1-1/(273.15+25)),  

    temp = Rt/Rp;

    temp = log(temp);

    //ln(Rt/Rp)

    temp/=Bx;

    //ln(Rt/Rp)/B

    temp+=(1/T2);

    //ln(Rt/Rp)/B+(1/T2)

    temp = 1/(temp);

    temp-=Ka;

    temp+=0.5;

    //加0.5误差矫正

    return temp;

    }


       在嵌入式系统中,常常用热敏电阻来测试温度.它的电路一般是用电阻分压电路和AD转换来进行通过测量"To AD"的值,就可以求得温度数据

    1.热敏电阻的阻值和温度的关系是线性的.我们需要先知道电阻值和温度的关系,假定:


                      Rt=K*t+B     (0)


                       t=(Rt-B)/K   (1)


      这里的K.B就是Rt(t)直线方程的系数.有两个未知数.


      查热敏电阻的电阻---温度数据表,在我们关心的温度范围内任意找两点t1和t2和对应的两个电阻值.带入


       (0)式,这样我们就得带一个方程组,解之,我们就求得了K和B.如果你发现这个电阻---温度表线性不够好,你可以采用非线性插值方法构造一个函数(比如拉格朗日插值或者抛物线插值等.都是简便有效的方法)

    至此,我们已经知道了K和B或者知道了Rt(t)函数.也让就是说,只要知道温度.我们就可计算出当前的电阻值,反之亦然.

    2.回到上面的电路,显然AD=Rup/(Rup+Rt)  ---->Rt=Rup*AD/(1023-AD)    //假如采用10位AD 那么最大就是1023  (2)


        将(2)带入(1)


             t=(Rup*AD/(1023-AD)-B)/K


        由此式就可根据AD结果直接计算当前的温度.

  • 接口设计
  • JDY-08蓝牙模块功能原理:
  •    JDY-08透传模块基于蓝牙4.0协议标准,工作频段为2.4GHZ范围,调制方式为GFSK,最大发射功率为0db,最大发射距离80米,采用TICC2541芯片设计,支持用户通过AT命令修改设备名,服务UUID、发射功率、配对密码等指令,方便快捷使用灵活。
  • 二技术参数:
  • 1.通信速率3Kbytes/秒
  • 2.APP透传时串口支持1024Bytes写入
  • 3.有效通信距离15到30米
  • 4.支持PWRC引脚控制睡眠
  • 5.支持IO口控制断开连接

  • 广播电流设置
  • 默认广播间隔是最小的,由于不同用户的产品要求,对产品的功耗有很大的要求,所以我们
  • 的模块也考虑了这一点,模块的广播间隔是可以通过 AT命令设置
  • 默认的广播间隔是:AT+ADVIN 0      为100ms  
  • 用户需对功耗有一定的要求时可以通过 AT+ADVIN 来设置广播间隔
  • AT命令  广播时间  电流
  • AT+ADVIN 0  100ms   0.6mA
  • AT+ADVIN 1  500ms   0. 1mA
  • AT+ADVIN 2  750ms   0. 05mA
  • AT+ADVIN 3  1000ms  0. 02mA
  • 以上是通过 AT命令设置的,用户也可以通过手机来设置广播间隔,不是广播间隔越长就越
  • 好,广播间隔太长会影响连接时间,就是要好久才能与手机连接上,一般设置 100 或500ms
  • 左右就差不多了,传感器应用可以设置长一点,因为不需要连接
  • 连接间隔设置
  • 用户在与手机连接时的电流是可以设置的,可以通过 AT命令或手机来设置
  • AT命令设置可以通过:AT+NEIN来设置
  • AT命令  广播时间  电流
  • AT+NEIN0  10ms  0. 8mA
  • AT+NEIN1  100ms  0. 2mA
  • AT+NEIN2  500ms   0. 05mA
  • 以上是通过 AT命令设置的连接间隔,用户也可以通过手机来设置连接间隔,不是连接间隔
  • 设置越长就越好,也要看用户的使用场景来决定,连接间隔越长的话不适应于透,透传的话
  • 一般要求为默认间隔就可以,如只是一些控制应用,或小数据应该的话,连接间隔可以设置
  • 长一点。


  • PWM的功能使用:
  • 第一步设置 PWM 的频为 250HZ (频率范围是 50 -  4KHZ)
  • AT指令:AT+PWMFRE 250       返回OK
  • 第二步打开 PWM
  • AT指令:AT+PWMOPEN 1      返回 OK(1 是开不打开 PWM,2 是开机打开)
  • 第三步打开设置 PWM 的脉宽(有4 路PWM 的输出,所以可以设置 4 路的 PWM 脉宽)
  • AT指令:AT+PWM1PUS90    返回 OK   表示设置 PWM1 的脉宽为 90%  
  • AT指令:AT+PWM2PUS 10    返回 OK   表示设置 PWM2 的脉宽为 10%  

  • 第四步用户可以读取 PWM 的工作状态
  • AT指令:AT+PWMPUS     返回状态,  具体请看手册
  • 第五步关闭 PWM 功能
  • AT指令:AT+PWMOPEN 0   这样模块就关闭了 PWM 功能了,如果此时的 PWRC 引脚是高电平的话,模块就进入低功耗模式
  • * Activity for scanning and displaying available Bluetooth LE devices.
  • */
  • public class DeviceScanActivity extends ListActivity {
  •    private LeDeviceListAdapter mLeDeviceListAdapter;
  •    private BluetoothAdapter mBluetoothAdapter;
  •    private boolean mScanning;
  •    private Handler mHandler;

  •    private static final int REQUEST_ENABLE_BT = 1;
  •    // Stops scanning after 10 seconds.
  •    private static final long SCAN_PERIOD = 10000;

  •    @Override
  •    public void onCreate(Bundle savedInstanceState) {
  •        super.onCreate(savedInstanceState);
  •        getActionBar().setTitle(R.string.title_devices);
  •        mHandler = new Handler();

  •        // Use this check to determine whether BLE is supported on the device.  Then you can
  •        // selectively disable BLE-related features.
  •        if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
  •            Toast.makeText(this, R.string.ble_not_supported, Toast.LENGTH_SHORT).show();
  •            finish();
  •        }

  •        // Initializes a Bluetooth adapter.  For API level 18 and above, get a reference to
  •        // BluetoothAdapter through BluetoothManager.
  •        final BluetoothManager bluetoothManager =
  •                (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
  •        mBluetoothAdapter = bluetoothManager.getAdapter();

  •        // Checks if Bluetooth is supported on the device.
  •        if (mBluetoothAdapter == null) {
  •            Toast.makeText(this, R.string.error_bluetooth_not_supported, Toast.LENGTH_SHORT).show();
  •            finish();
  •            return;
  •        }
  •    }

  •    @Override
  •    public boolean onCreateOptionsMenu(Menu menu) {
  •        getMenuInflater().inflate(R.menu.main, menu);
  •        if (!mScanning) {
  •            menu.findItem(R.id.menu_stop).setVisible(false);
  •            menu.findItem(R.id.menu_scan).setVisible(true);
  •            menu.findItem(R.id.menu_refresh).setActionView(null);
  •        } else {
  •            menu.findItem(R.id.menu_stop).setVisible(true);
  •            menu.findItem(R.id.menu_scan).setVisible(false);
  •            menu.findItem(R.id.menu_refresh).setActionView(
  •                    R.layout.actionbar_indeterminate_progress);
  •        }
  •        return true;
  •    }

  •    @Override
  •    public boolean onOptionsItemSelected(MenuItem item) {
  •        switch (item.getItemId()) {
  •            case R.id.menu_scan:
  •                mLeDeviceListAdapter.clear();
  •                scanLeDevice(true);
  •                break;
  •            case R.id.menu_stop:
  •                scanLeDevice(false);
  •                break;
  •        }
  •        return true;
  •    }

  •    @Override
  •    protected void onResume() {
  •        super.onResume();

  •        // Ensures Bluetooth is enabled on the device.  If Bluetooth is not currently enabled,
  •        // fire an intent to display a dialog asking the user to grant permission to enable it.
  •        if (!mBluetoothAdapter.isEnabled()) {
  •            if (!mBluetoothAdapter.isEnabled()) {
  •                Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
  •                startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
  •            }
  •        }

  •        // Initializes list view adapter.
  •        mLeDeviceListAdapter = new LeDeviceListAdapter();
  •        setListAdapter(mLeDeviceListAdapter);
  •        scanLeDevice(true);
  •    }

  •    @Override
  •    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  •        // User chose not to enable Bluetooth.
  •        if (requestCode == REQUEST_ENABLE_BT && resultCode == Activity.RESULT_CANCELED) {
  •            finish();
  •            return;
  •        }
  •        super.onActivityResult(requestCode, resultCode, data);
  •    }

  •    @Override
  •    protected void onPause() {
  •        super.onPause();
  •        scanLeDevice(false);
  •        mLeDeviceListAdapter.clear();
  •    }

  •    @Override
  •    protected void onListItemClick(ListView l, View v, int position, long id) {
  •        final BluetoothDevice device = mLeDeviceListAdapter.getDevice(position);
  •        if (device == null) return;
  •        final Intent intent = new Intent(this, DeviceControlActivity.class);
  •        intent.putExtra(DeviceControlActivity.EXTRAS_DEVICE_NAME, device.getName());
  •        intent.putExtra(DeviceControlActivity.EXTRAS_DEVICE_ADDRESS, device.getAddress());
  •        if (mScanning) {
  •            mBluetoothAdapter.stopLeScan(mLeScanCallback);
  •            mScanning = false;
  •        }
  •        startActivity(intent);
  •    }

  •    private void scanLeDevice(final boolean enable) {
  •        if (enable) {
  •            // Stops scanning after a pre-defined scan period.
  •            mHandler.postDelayed(new Runnable() {
  •                @Override
  •                public void run() {
  •                    mScanning = false;
  •                    mBluetoothAdapter.stopLeScan(mLeScanCallback);
  •                    invalidateOptionsMenu();
  •                }
  •            }, SCAN_PERIOD);

  •            mScanning = true;
  •            mBluetoothAdapter.startLeScan(mLeScanCallback);
  •        } else {
  •            mScanning = false;
  •            mBluetoothAdapter.stopLeScan(mLeScanCallback);
  •        }
  •        invalidateOptionsMenu();
  •    }

  •    // Adapter for holding devices found through scanning.
  •    private class LeDeviceListAdapter extends BaseAdapter {
  •        private ArrayList mLeDevices;
  •        private LayoutInflater mInflator;

  •        public LeDeviceListAdapter() {
  •            super();
  •            mLeDevices = new ArrayList();
  •            mInflator = DeviceScanActivity.this.getLayoutInflater();
  •        }

  •        public void addDevice(BluetoothDevice device) {
  •            if(!mLeDevices.contains(device)) {
  •                mLeDevices.add(device);
  •            }
  •        }

  •        public BluetoothDevice getDevice(int position) {
  •            return mLeDevices.get(position);
  •        }

  •        public void clear() {
  •            mLeDevices.clear();
  •        }

  •        @Override
  •        public int getCount() {
  •            return mLeDevices.size();
  •        }

  •        @Override
  •        public Object getItem(int i) {
  •            return mLeDevices.get(i);
  •        }

  •        @Override
  •        public long getItemId(int i) {
  •            return i;
  •        }

  •        @Override
  •        public View getView(int i, View view, ViewGroup viewGroup) {
  •            ViewHolder viewHolder;
  •            // General ListView optimization code.
  •            if (view == null) {
  •                view = mInflator.inflate(R.layout.listitem_device, null);
  •                viewHolder = new ViewHolder();
  •                viewHolder.deviceAddress = (TextView) view.findViewById(R.id.device_address);
  •                viewHolder.deviceName = (TextView) view.findViewById(R.id.device_name);
  •                view.setTag(viewHolder);
  •            } else {
  •                viewHolder = (ViewHolder) view.getTag();
  •            }

  •            BluetoothDevice device = mLeDevices.get(i);
  •            final String deviceName = device.getName();
  •            if (deviceName != null && deviceName.length() > 0)
  •                viewHolder.deviceName.setText(deviceName);
  •            else
  •                viewHolder.deviceName.setText(R.string.unknown_device);
  •            viewHolder.deviceAddress.setText(device.getAddress());

  •            return view;
  •        }
  •    }

  •    // Device scan callback.
  •    private BluetoothAdapter.LeScanCallback mLeScanCallback =
  •            new BluetoothAdapter.LeScanCallback() {

  •        @Override
  •        public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) {
  •            runOnUiThread(new Runnable() {
  •                @Override
  •                public void run() {
  •                    mLeDeviceListAdapter.addDevice(device);
  •                    mLeDeviceListAdapter.notifyDataSetChanged();
  •                }
  •            });
  •        }
  •    };

  •    static class ViewHolder {
  •        TextView deviceName;
  •        TextView deviceAddress;
  •    }
  • }
  • JDY -08模块出厂默认配置为透传功能,一般默认出货都为透传功能出货,如需要配置为传
  • 感器功能的话,客户在购买前务必跟客服说明或备注。  由于模块是多功能模块,客户也可
  • 以在购买后自己配置为相关的功能模式,这一章只讲传感器功能的 AT命令配置
  • 模块连接好 USB 转串或 MCU的串口(RXD、TXD),按串口的交叉接法,在使用串口发送
  • 命令时,请将模块的 PWRC 引脚接地,并接上模块的电源(VCC、GND),电源电压为 3.3V
  • 或3V
  • 按以上接好线后,就开始讲述 AT命令的操
  • 第一步:将模块配置为iBeacon 模式
  • 注意传感器功能只是在 iBeacon 模式上的应用,所以需要配置为 iBeacon 模式
  • 通过串口发送:AT+HOSTEN3            返回:OK      
  • 第二步:让模块重新启动
  • 通过串口发送:AT+RST              表示复位
  • 第三步:设置温度值为 33 度
  • 通过串口发送:AT+TEMP33    返回:OK
  • 第四步:设置湿度值为 11%  
  • 通过串口发送:AT+HUMID11            返回OK
  • 第五步:设置传感器的电量为 90%  
  • 通过串口发送:AT+ BATT90           返回 OK
  • 由于传感器的功能是基于 iBeacon 的应用,如果你的传感器众多,以上的两条传感器的命令
  • 不能满足你的产品应用的话,你可以使用 iBeacon 的相关指令来传输你们的传感器的数据
  • AT+STRUUID+32 位字符串长度,请注意此 32 位的数据格式为:十六进制的字符串
  • AT+MAJOR +4 位字符串长度,字符串格式为:十六进制的字符串
  • AT+MINOR+4位字符串长度,字符串格式为:十六进制的字符串
  • 用户如果在 APP 上需要判断自家的设备时,请配置好厂家 ID号
  • 一般蓝牙判断自家的设备可以通过蓝牙的服务 UUID 与设备名等方式来判断,但这些都可能
  • 会存在相同,因为我们的标准模块的蓝牙 UUID 都是一样的,为了防止识别厂家设备存在相
  • 同,我们有添加了厂家 ID功能用于 APP 识别自家的设备,
  • 配置厂家 ID值为:65330(十进制值),十六进制值为:1985  
  • 通过串口发送:AT+VID1985          返回:OK

  • 主从蓝牙模块通信是指两个蓝牙模块互相通信,一个为主机,一个为从机,它们相互之间通
  • 信,第一个模块为从机模块,第二个模块是主机模块
  • 第一步  将主机与从机模块上电
  • 并将模块串口与USB转串或MCU串口连接,注意串口线是需要交叉的
  • ,连接后开始AT命令调试
  • 第二步  将第一个模块从机广播打开,从机默认是打开广播的,也可通过发送AT+ADVEN1
  • 来打开广播
  • 第三步:设置主模块的命令
  •    1)设置模块为主机透传模式,返回OK表示设置完成
  • 发送命令:AT+HOSTEN1     返回OK
  • 2)设置模块重新启动
  •   发送:AT+RST
  •    3)扫描周边BLE 命令
  • 发送:T+SCAN1          返回OK      
  • 4)读取扫描到的BLE蓝牙数量(最多扫描8个从机)
  •   AT+GETDCD        返回DEV:1       表示扫描到一个设备
  •    
  • 5)读取扫描列表的从机MAC地址(0-7)
  •   发送:AT+RSLV0  返回:MAC:e3435480
  • 6)连接扫描列表0设备(0-7)
  •   发送:AT+CONNET0  
  • 也可以通过从机MAC地址直接连接,发送:AT+CONNET112233445566
  • 112233445566为从机的MAC地址    
  • 7)发送命令查找是否与从机连接上
  •   发送:AT+GETSTAT  返回:STS:11 表示已经连接
  •    
  • 8)硬件判断是否已经与从机连接
  •   模块6脚为连接状态引脚,连接成功为低电平,未连接为高电平
  •    9)主机与从机连接成功后,就可以透传数据
  • 模块连接好 USB 转串或 MCU的串口(RXD、TXD),按串口的交叉接法,在使用串口发送
  • 命令时,请将模块的 PWRC 引脚接地,并接上模块的电源(VCC、GND),电源电压为 3.3V
  • 或3V

  • 按以上接好线后,就开始讲述 AT命令的操作
  • 第一步:将模块配置为主机观察者模式
  • 通过串口发送:AT+HOSTEN2            返回:OK      
  • 第二步:让模块重新启动
  • 通过串口发送:AT+RST              表示复位
  • 通过以上的设置,模块已经配置为主机观察者模式,此时主机开始接收从机传感器的数据,
  • 主机串口接收的传感器数据格式如下
  • 数据格式:2(bytes)head  +  6(bytes)MAC  +  1(byte)RSSI  +  2(bytes)Mayor  +  2(bytes)Minor  +
  • 2(bytes)VID + 1(byte)  TEMP  + 1(byte)  HUMID  + 1(bytes)BATT  
  • 用户可以通过 VID 来识别自家的传感器的数据,再通过 MAC地址区分每个传感

  • 注意:主机接收的数据 MAJOR、MINOR、VID 、TEMP 、HUMID、BATT 对应的是从机传
  • 感器模式下,通过 AT命令发送的数据
  • AT+MAJOR000A
  • AT+MINOR0007
  • AT+VID6677
  • AT+TEMP44
  • AT+TEMP44
  • AT+ BATT90
Baidu
sogou