« 上一篇下一篇 »

波形检测总结——矩形波

1、要会解决问题

采用STC15W的单片机片上ADC进行电压采集时,最先用的是P1.0口,结果测出来的数据只有5V与0V等几个数据,数据明显是错误的,在查错的过程中,一直在纠结于单片机本身的问题,可是基本上没用。直到换了一个AD采样端口,发现数据采集是正确的了,但是中间却因为这么简单的问题浪费了大半天的时间。

总结:分析问题,首先要从最简单的层面着手,即简化问题,假如我一开始就知道换个端口测量,那就一下子就能解决问题了。所以,分析问题时要先从简单入手。至于之前的端口测量出错,原因可能在于板子的设计有问题,也有可能的确是芯片问题。

当出现问题时,首先考虑是否为硬件原因,如果不是,再考虑软件原因。

2、尽量不要用国产芯片

关于STC到底是台湾的还是大陆的我并不是太清楚,但我可以确定它是中国人设计的。所以它并不好用,质量也不高。并非我有意否定国人的水平,而的确是国人做出来的东西不太可靠。一、开始我用STC15W时,一直下不进去程序,后来才看到资料有说这个问题发生时要把P3.2/P3.3口接地,然后再进行下载,完全无语,竟然会有这种芯片。二、如1所述,也有可能是芯片原因。三、无线产量计数终端有一块板子也是下不进去程序,很是闹心,芯片这么不稳定,这么不好用。

所以以后包括控制芯片在内的数字or模拟芯片,尽量不要采用国产,而要用国外的产品,毕竟国外这一块的发展比国内早了几十年。贵一点无所谓,但一定要稳定可靠。

3、基本常识欠缺

开始时测方波信号,发现测出来的数据很不稳定,在这个问题上也折腾了好久,后来才发现原来是测量时没接地。这种错误实在是太低级了,学电子的人在测信号时竟然不知道要接地,说出来恐怕会让人笑掉大牙。话说回来,这些就是基本的专业素养问题,而你显然是不过关的。

4、第一:先搞清楚事物的本质

比如我测示波器上的1KHz方波,那我至少要先知道它的频率是1K,周期是1000us,每个周期中高低电平时间各500us,幅度为1.5V,即高电平为3V。

回到第2点中提到的问题,开始单片机接5V的电源,然后测这个方波,得到的数据高电平是FFH,低电平是00H,而你却还认为是对的,这说明你连所测信号最基本的参数都不了解:5V电源下高电平测出来是FFH,这说明测出来的高电平也是5V,而实际高电平应该是3V,这已经明显表明测量得到的数据是错误的,可这么明显的问题你在折腾了好久后才发现。

5、数据分析

分析数据建议使用串口。原因:快!

至于数码管、LCD这些模块,如果不是一定要用,那就尽量不要用,第一,这个东西也要写代码,要调参数,麻烦。第二、这些东西要占CPU时间,而这完全可以避免,把CPU剩余的时间用来做其他的事。

另外,单片机学习中只要掌握几个重要的模块就行了,如UART、SPI、IIC等,而至于上面所说的数码管、LCD、按键以及其他类似的模块,完全没必要去管。

6、方波测量原理

原理很简单,但是实现却用了较多的时间,原因就是前面所说,问题不出在原理上,而在于测量模块本身以及测量方法上出现的错误。

如图1所示,为矩形波波形的示意图。我们假设在开始数据采集时,采样点落在第一个高电平区间,所以我们就判断:如果此时采集到的电平为高,则停在这里等待,直到电平变为低,退出等待;接下来就会进入一个低电平区间,此时也进行等待,直到电平变为高,而一检测到电平变高(第一条红线),就开启定时器开始计时,然后在下一个高电平区间继续等待,再在接下来的一个低电平区间继续等待,直到再次检测到高电平(第二条红线),关闭定时器,而此过程中定时器所计的时间即为矩形波一个周期的时间,从而就能计算出它的频率

那么,如果一开始采集到的是低电平怎么办呢?当然,我们也考虑了这种情况,根据上述分析,如果一开始采样到低电平,那第一个判断等待就会直接跳过,来到第二个判断等待,此时程序会在这里等待,当电平变为高时开始计时,同样在一个周期后关闭定时器,所以依然能采集到准确的周期信息。

程序简单描述如下:

    while(高)
      ;    // 等待
    while(低)
      ;    // 等待
    TR0 = 1;        // 开始计时
    while(高)
      ;    // 等待
    while(低)
      ;    // 继续等待
    TR0 = 0        // 停止计时

简单说来,前面两个判断等待(第一个是高电平、第二个是低电平),作用就是为了等到一个完整的周期的起点,从这个起点开始计时,从而得出周期时长。

幅值

定义:以正弦波为例,波峰到波谷距离的一半叫做幅值;以方波为例,方波的最大值与最小值差值的1/2即为幅值。

具体分析:在两条红线之间的区域,是一个完整的周期,所以当检测到为高电平时,判断并保存高电平的最大值MAX;当检测到为低电平时,判断并保存低电平的最小值MIN。然后(MAX - MIN) / 2 即为幅度值。

波形判别

波形的判别我是单独做的,与前面类似。首先先判断是否为低电平,如果是,停在这里等待,直到电平变为高,退出等待;接下来进入一个高电平区间,同样进行等待,直到电平变为低,开始计时,跟着下一个高电平到来,关闭计时。

这里的低电平判别是较严格的,基本上超过0.1V就认为不是低电平(当然这个限定值可以根据实际情况修改)。通过这个时间,我们就能判断是否为矩形波:如果低电平时间超过某个值,就说明此信号在相当一部分时间内电平为0,从而判定为矩形波。这里的比较时间值可以根据实际情况设定,我设的大概是240us:一个周期中电平低于高电平(3.3V)的5/256的时间达到240us,自然认为是矩形波了。

说明:如果一个正弦波或三角波频率较低,周期较大,也有可能满足这个条件,而这即为无法分辨的频率的下限。

7、汇编的多字节除法

前面提到了频率测量时是先得到周期,然后计算出频率,那么,这中间就涉及到了一个计算的过程,如果用的是C语言,那么很简单,但如果用的是汇编语言的话,进行较大的数之间的除法运算则显得较为复杂。因此,本程序直接借用了一篇论文中撰述的程序代码。在此向其作者表示感谢。

具体代码与论文参见附件部分。

附件

矩形波检测代码(汇编语言):

波形检测——STC15W平台.txt

汇编语言多字节除法介绍:

单片机汇编语言的通用多字节无符号数除法的改进.pdf

汇编语言多字节除法代码:

多字节除法.txt