amoBBS 阿莫电子论坛

 找回密码
 注册
搜索
bottom↓
楼主: machao

高手练手题--频率计设计 [2年后再次孤独求败]

  [复制链接]
发表于 2013-6-14 06:49:01 来自手机 | 显示全部楼层
machao 发表于 2013-6-14 00:06
已经在外面宾馆,晚上没喝多少,因为其他的朋友明天还要上班。还有精力做点备课。
测频、测周、等精度的测 ...

-大善。
    该贴不建议继续讨论。个人意见。
发表于 2013-6-14 07:08:26 | 显示全部楼层
该贴不建议继续讨论。个人意见。


I agree. I think we all should respect the good Professor's right to be challenged.
发表于 2013-6-14 07:54:57 来自手机 | 显示全部楼层
我只是不希望探讨频率计/计数器相关内容以外的无关内容。比如探讨国内的仪器设备水平,无盐!
发表于 2013-6-14 09:54:12 | 显示全部楼层
machao 发表于 2013-6-14 04:14
你有你的设计,我有我想法。

我考虑采用MCU内部计数器连续工作,所以只能捕捉方式同步。而你与另外一位 ...

马老师,用定时器级联会受到1/2系统时钟的限制,没法体现分频器测高频的作用了。
 楼主| 发表于 2013-6-14 12:50:03 | 显示全部楼层
Gorgon_Meducer 发表于 2013-6-14 09:54
马老师,用定时器级联会受到1/2系统时钟的限制,没法体现分频器测高频的作用了。 ...

我知道,前面我已经解释了,可能是我的题目问题,一开始大家就想的不一样

从我的备课方案你也可以看出,我主要还是从训练MCU应用本身出发,尤其是合理应用定时器以及配合中断的方方面面。这个你知道我几年前就说过,其实现在也还是希望学习者能更好的理解和使用MCU内部的定时器,因为现在MCU的定时器功能更多了。但是还是有些学习使用者没有这样的概念,比如在中断中关定时器,中断设计不合理等等。其目的并不是设计专业的频率计。

所以这是我出题限定主要使用MCU,做测频这样的事情的目的。也所以我没给出具体的精度指标,只是说发挥出MCU本身最大性能。

其实经过上面讨论都已经很明白,I/O输入的频率最高为1/2CLK,所以本身的极限就是它了。比如10M系统,理论上就是5M,考虑安全系数4M.但如果4M做不到,甚至2M的误差都很大,问题就可能出在你使用方法的问题上了。

这个题目还是“练手”,既要了解测频的理论方法,还要了解MCU的一些特点,同时对定时器和中断也是非常好的训练。从MCU本身讲,其内部的功能模块使用,定时器是比较复杂和变化比较多的模块之一。所以我的本意不是如何去测更高的频率,而是在现有的MCU条件下测好,测准频率。至于要扩频我也说过要加外部分频器的。但我也只是说4:1,到100M而已,因为毕竟出题的目的不是要求设计专业频率计。

分频器本身其实就是计数器,我的思路集中在我想法中,考虑使用16位的计数器,由于位数的不够,再大约1秒一次的计数过程中,要处理溢出比较麻烦,所以我在想可以通过两个计数器级联(在STM32中级联更方便),这样处理更方便一些,内部有为什么不用?级联的前一级也就是分频器。(这个也就是在我的备课方案中直接使用32位计数器的原因,便于说明问题本身)

而其他人是从专业频率计出发,考虑的是扩频,扩频就只能外部加分频,因为受到I/O的1/2的限制。

所以在读“分频器”尾数的问题上产生争执,其实是大家的出发点不同,重点考虑问题不一样而形成的。这个也是好的,提供了各种方法和思路,真正应用中选择合适的使用就是了。

其实这个题目和帖子还是非常好的,是两方面的结合。作为学校,培养的学生希望理论和基础扎实,这样的学生进入专业公司,才能很快的派上用处。设计专业的频率计,高频分频后还是要通过类似MCU的东西进行计数和计算的处理,如果你外部设计的非常合理,但最后MCU内部使用的方法和处理方法不对,这个频率计也是做不成的。

大家都是经过学校学习过的,问你们一句,当年在学校里有多少老师给你们出这样的题目进行培训?反正我做不到,在正常课程中根本讲不到这个层次。只是对于这次全国大学生电子竞赛设计出这样一个“高手”练手题。其目的也是想学生能更深入的学习掌握一些基础的东西。从这个角度看,这个题目还是比较合适的。






发表于 2013-6-14 13:05:05 来自手机 | 显示全部楼层
在通用频率计中为了减小随机误差,而将脉冲变为窄脉冲。而马老师的方案必须要求脉冲的最小宽度。
 楼主| 发表于 2013-6-14 13:38:27 | 显示全部楼层
yxw_bob 发表于 2013-6-14 13:05
在通用频率计中为了减小随机误差,而将脉冲变为窄脉冲。而马老师的方案必须要求脉冲的最小宽度。 ...

我再次说明,练手题的目的不是设计专业频率计,是测频。
对于MCU的1/2CLK,ATMEL手册上已经说的很明白50%的方波。如果不是50%方波,就是1/2.5也不保证。所以我“限定”了输入标准方波。尽管大家反对,我还是坚持,毕竟我的目的是侧重MCU的训练。
其实测频不仅仅是做频率计,在其它应用中经常用到。训练的目的就是掌握基本的方法,再根据实际情况作变化。
前面有个朋友提到了测转速的问题,我还没时间回答。其实在这个问题上要给出个实际的要求,比如转速的精度是多少,如果1转就给出一个脉冲话,你再好的硬件和电子精度也就只能是1转/S.要提高测量转速的精度,车轮1转就要给出2个或更多个脉冲数,这个就要考虑机械和传感器的使用。
这样的问题显然通常一片8位MCU就解决问题。但是他提到低频转速稳定时能行,转速高了反而要用测周法,说明他基本的测量方法没有掌握,也说明我的练手题有一定的实际意义的。
没有扎实的基础和掌握好基本的方法,是不能面对将来各种实际应用的。
发表于 2013-6-14 18:44:55 | 显示全部楼层
马老师,用定时器级联会受到1/2系统时钟的限制,没法体现分频器测高频的作用了。


I don't think the good Professor knew that then, and I doubt the good Professor understands it now.
 楼主| 发表于 2013-6-14 18:51:53 | 显示全部楼层
本帖最后由 machao 于 2013-6-14 18:55 编辑
millwood0 发表于 2013-6-14 18:44
I don't think the good Professor knew that then, and I doubt the good Professor understands it now ...


基于STC12C5A60S2简易频率计设计参考(节选)
设计题要求,设计一个基于STC12C5A60S2的简易频率计
1,        使用8个LED数码管显示测试结果
2,        使用8个LED指示不同的频率量程,比如MHz、KHz、Hz
3,        给出你的频率计测试频率所采用的方法、能够测试频率的范围,不同量程测试结果的误差、以及测量频度(每秒几次)
4,        系统时钟12M(理论上认为系统时钟100%准确,不存在误差),
5,        尽量少用或不用外围器件

一、        基本分析
1、        最高被测频率确定
由于系统时钟为12M,因此最高能实现的测试频率为6M(不使用外部分频电路情况下)。通常MCU的I/O口是由系统时钟同步工作I/O口,至少需要2个系统时钟脉冲才能检测I/O上电平的跳变。

==================================
这个是我在LZ位附件的内容,你看了吗?

你自己在158、162楼的发言还对这点有疑问,现在说我刚知道,脸不红?
发表于 2013-6-14 19:08:53 来自手机 | 显示全部楼层
本帖最后由 yxw_bob 于 2013-6-14 19:25 编辑
millwood0 发表于 2013-6-14 18:44
I don't think the good Professor knew that then, and I doubt the good Professor understands it now ...


因为被测量的信号的”闸门”—门控信号在主频为10MHz 时被10MHz 的CLKIO重同步为5MHz 的采样频率,故精度可能会打折扣。各位自己画波形图分析一下。
      我的理解应该没错。
    这也是上面二位和我一直推荐外部的触发器和门控电路的原因。
      最近脑袋有时短路。
      人啊包括自己,计较这点误差干什么啊?!臭知识分子习气。能够工作,差不多就行了。
      
 楼主| 发表于 2013-6-14 19:38:25 | 显示全部楼层
本帖最后由 machao 于 2013-6-14 19:52 编辑
yxw_bob 发表于 2013-6-14 19:08
因为被测量的信号的”闸门”—门控信号在主频为10MHz 时被10MHz 的CLKIO重同步为5MHz 的采样频率,故精度 ...

yeshunter 发表于 2013-6-9 13:02
作为之前Atmel工程师的一个敏感,我忍不住查了一下M16的数据手册,这里有一个内容我觉得需要大家注意下:
15.4 External Clock Source
...
Each half period of the external clock applied must be longer than one system clock cycle to
ensure correct sampling. The external clock must be guaranteed to have less than half the system
clock frequency (fExtClk < fclk_I/O/2) given a 50/50% duty cycle. Since the edge detector uses
sampling, the maximum frequency of an external clock it can detect is half the sampling frequency
(Nyquist sampling theorem). However, due to variation of the system clock frequency
and duty cycle caused by Oscillator source (crystal, resonator, and capacitors) tolerances, it is
recommended that maximum frequency of an external clock source is less than fclk_I/O/2.5.


我再把傻孩子贴的东西放上,这段英文是ATMEL公司AVR手册里的说明,主要是说AVR的内部同步计数器能够使用的最高外部输入时钟频率的限制,不知道你们如何理解的。

我的理解是,系统时钟是10M的话,作为外部时钟进入计数器,最高频率为5M,确保4M.但还是有限制条件的,就是是50%的方波。至于如何解释,自己去体会。

其实这个限制对所有I/O口都适用,也就是I/O上的电平变化,只要小于4M,MCU就能正确识别(对于10M系统时钟,I/O从高变到低,0.125us后,MCU就检测到了),省下的问题就是软件是否来得及处理了。

至于理论解释这里有高手,什么都懂的。可惜的是已经几次“激将”了,他都避而不回。
发表于 2013-6-14 20:19:11 | 显示全部楼层
我的理解


which is known to be pretty faulty, as you have shown so convincingly.
 楼主| 发表于 2013-6-14 22:08:58 | 显示全部楼层
本帖最后由 machao 于 2013-6-14 22:26 编辑

stm32 数据手册截图



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2013-6-16 01:15:46 | 显示全部楼层
MARK一下,回头慢慢看~
发表于 2013-6-17 00:23:28 | 显示全部楼层
machao 发表于 2013-6-14 22:08
stm32 数据手册截图


前段时间正好也有一个地方正好与STM32采样脉冲有关 (但因为很多原因,此事终止)
但是在21ic上面看见这段话。


原帖地址:

http://bbs.21ic.com/icview-183799-1-1.html

香水城 发表于 2010-7-15 10:22:42 |只看该作者 |返回版面
外部时钟模式下,外部信号通过内部时钟(CK_INT)采样得到。

外部信号周期的计算方法是:2xTINT+20ns,这里的TINT是CK_INT的周期时间。

例如:内部时钟频率为72MHz,则TINT = 13.89ns,这时外部信号的最高频率是:1/(2x13.89ns+20ns) = 20.93MHz。

如果内部时钟频率为24MHz,则外部信号的最高频率是16.22MHz。

可见外部信号的最高频率与内部时钟频率不是一个简单的比例关系。
发表于 2013-6-17 11:38:49 | 显示全部楼层
学习                                       
发表于 2013-6-20 04:02:52 | 显示全部楼层
fi/fr= fratio 就會很準了,簡單精度高.
发表于 2013-6-20 08:32:47 | 显示全部楼层
william_rain 发表于 2013-6-10 09:36
6mHZ 的方波,从示波器上看就是正弦波!

请教一下 这是什么原因造成的?
发表于 2013-6-20 17:30:21 来自手机 | 显示全部楼层
zhangsusu 发表于 2013-6-20 08:32
请教一下 这是什么原因造成的?

时基与信号周期相差过大,由于采样点滑动造成取样点平滑后显示成一个无关的信号。
发表于 2013-6-22 22:33:09 | 显示全部楼层
先mark,慢慢看。 看了一些,有所触动。  想起一个词“高精细严”
发表于 2013-6-26 03:00:34 | 显示全部楼层
COOL!
发表于 2013-6-26 06:59:42 | 显示全部楼层
测频虽然是老问题,但是说道很多!建议等精度方式!等精度不一定非得用PLD,采用单片机的定时器也可以实现
发表于 2013-6-28 16:19:16 | 显示全部楼层
To complete the education of the good Professor, here is a simple demo.

First, the hardware:



U2A/B form a simple (digital) multiplexer: it controls which signal to be fed into the external prescaler (U1 here). If PS_SEL is set, the external pulse train is fed into the prescaler (PS_CLK idles high here); If PS_SEL is cleared, PS_CLK (pulsed by the mcu) is fed into the prescaler.

The basic principal of reading the prescaler U1, which gzhuli laid out very early in this thread, is to switch the prescaler to count PS_CLK pulse train until its output (PS_INPUT) changes. By counting how many PS_CLK pulses are sent to the mcu to trigger a change on PS_INPUT, you know the remaining count in the prescaler (because you know the width of the prescaler used).

Here is the relevant code, in its entirety:

  1. #include <htc.h>                                                //we use picc
  2. #include "config.h"
  3. #include "gpio.h"                                                //gpio header file
  4. #include "delay.h"                                                //we use software delay

  5. //hardware configuration
  6. #define OUT_PORT        PORTA
  7. #define OUT_DDR                TRISA
  8. #define OUTs                0xff
  9. #define OUT(val)        OUT_PORT = (val)

  10. #define PS_PORT                PORTB
  11. #define PS_DDR                TRISB
  12. #define PS_SEL                (1<<2)                                //switch input selection, active high (for external prescaler). low to read prescaler
  13. #define PS_RESET        (1<<1)                                //start counting, active high
  14. #define PS_CLK                (1<<3)                                //clock
  15. #define PS_INPUT        (1<<0)                                //prescaler input

  16. #define PS_WIDTH        (1<<(12-1))                        //12-bit prescaler
  17. //end hardware configuration

  18. //initialize prescaler pins
  19. void ps_init(void) {
  20.         IO_CLR(OUT_PORT, OUTs);                                //clear output pins
  21.         IO_OUT(OUT_DDR, OUTs);
  22.        
  23.         IO_CLR(PS_PORT, PS_SEL | PS_RESET | PS_CLK);        //ps_sel low -> no external pulse input is getting tot he external prescaler
  24.         IO_OUT(PS_DDR, PS_SEL | PS_RESET | PS_CLK);                //pins as output
  25.        
  26.         IO_IN(PS_DDR, PS_INPUT);                        //ps_input set as input
  27. }

  28. //read the prescaler
  29. unsigned short ps_read(void) {
  30.         unsigned short tmp=0;                                //temporary variable
  31.         unsigned char ps_in=ps_in=IO_GET(PS_PORT, PS_INPUT);        //read the input
  32.        
  33.         //ps_sel should have been turned low before this routine. it is cleared here again to be safe.
  34.         IO_CLR(PS_PORT, PS_SEL);                        //ps_sel low -> not counting external pulses yet.
  35.         do {
  36.                 IO_SET(PS_PORT, PS_CLK);
  37.                 tmp+=1;
  38.                 IO_CLR(PS_PORT, PS_CLK);
  39.         } while (IO_GET(PS_PORT, PS_INPUT)==ps_in);        //wait for the prescaler's output to change -> the squeeze out the remaining numbers in the prescaler
  40.         return PS_WIDTH - tmp;
  41. }


  42. void mcu_init(void) {
  43.         ANSEL=0x00;                                                        //all pins gpio
  44.         ANSELH=0x00;
  45.         CM1CON0 = 0x00;                                                //turn off analog comparators
  46.         CM2CON0 = 0x00;
  47.         //IRCF2=1, IRCF1=1, IRCF0=0;                        //running at 4Mhz
  48. }



  49. void main(void) {
  50.         unsigned short tmp;
  51.        
  52.         mcu_init();                                                        //initialize mcu
  53.         ps_init();                                                        //reset the prescaler module
  54.        
  55.         while(1) {
  56.                 IO_SET(PS_PORT, PS_RESET);                //reset the external counter
  57.                 IO_SET(PS_PORT, PS_SEL | PS_CLK);                //select the external counter -> read to read the chip -> now external signal goes to the prescaler
  58.                
  59.                 IO_CLR(PS_PORT, PS_RESET);                //counting starts
  60.                 delay_ms(100);                                        //waste some time
  61.                 IO_CLR(PS_PORT, PS_SEL);                //stop the pulse train / counting
  62.                
  63.                 tmp = ps_read();                                //read the prescaler

  64.                 OUT(tmp>>8);                                        //output the value, msb first       
  65.                 delay_ms(10);
  66.                 OUT(tmp);
  67.         }

  68. }

复制代码
Two routines: ps_init() resets the relevent pins; ps_read() read the prescaler pins.

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2013-6-28 16:26:07 | 显示全部楼层
本帖最后由 millwood0 于 2013-6-28 16:48 编辑

the main() simply resets the counter; and then select the external pulse train. It wastes some time to allow the pulse train to accumulate; and then deselect the external pulse train - so the prescaler retains its readings, waiting to be read by the ps_read() routine. To demonstrate that the prescaler value is indeed correctly read by the ps_read() routine, it is shown on OUT_PORT, msb first.

Here is the execution:



the red trace shows the pulsing of PS_CLK. That stops once PS_INPUT changes.

The green traces show the output on the prescaler (from the prescaler itself) and the output of the prescaler reading on OUT_PORT. I will leave it as homework to the good Professor as to why it shows the ps_read() routine is working as expected.

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2013-6-28 17:05:37 | 显示全部楼层
本帖最后由 millwood0 于 2013-6-28 17:08 编辑

Room for improvement:

1) the multiplexer: the multiplexer (U2A/B) are fairly simple and is not without problems. A fancier version can be constructed with 4 gates. With ECL gates, you can easily go to a few ghz with this type of setup (with minimal resolution down to 1hz @ 1second gate time).

2) the use of prescalers without a reset pin. The interface here requires 4 IO pins, one of them is to reset the prescaler (PS_RESET). Many high speed dividers / counters don't have a reset pin. that's easy to solve, however, without any new routines, :)

Here is the waveform for an arrangement where the prescaler has no reset pin - you will notice that PS_RESET is never pulled high so the prescaler is never hardware reset. Yet, we continue to read the same output.



I will let the good Professor figure out how that works, :)

3. timing errors: having said all that, it is actually quite difficult to minimize and then correct for timing errors caused by signaling. It takes time for the mcu to change pins, etc. As long as the various signals are not synchronized, you will have errors accumulating, in the mcu or in the prescaler. Minimizing them in hardware and correcting for them in software, over a wideband, are quite difficult.

4. the same technique of reading external prescalers applies to the reading of internal prescalers as well, with minimum changes.

Hope it helps.

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2013-7-3 00:31:29 | 显示全部楼层
本帖最后由 yxw_bob 于 2013-7-3 00:43 编辑

It's well.
    假定PS-INT产生Nx个中断;
    1.利用单片机产生Nt个脉冲驱动分频计数器输出脚反转,来获得分频计数器的分频尾数(2^11-Nt),总的脉冲个数为2^12*Nx+(2^11-Nt),[这个有可能错误,我记不清了NT的极性,也有可能是2^12*Nx-2^11+(2^11-Nt),与INT的极性有关].
    2. 如果分频计数器没有复位端,如果PS-INT在计数前后的极性一致,假定分频计数器的分频尾数(2^11-Nt),则总的脉冲个数为2^12*Nx+(2^11-Nt);
如果PS-INT在计数前后的极性不一致,假定分频计数器的分频尾数(2^11-Nt),则总的脉冲个数为2^12*Nx-2^11+(2^11-Nt).
    我由于记不清NT的极性了,上述的计数值有可能多计算了2^11个脉冲.
发表于 2013-7-3 06:49:52 | 显示全部楼层
If you use interrupt on PS_INPUT pin, you need at least 30 ticks to process each interrupt. On a 1MIPS mcu, that means the maximum frequency you can count, putting aside hardware limitations, is 2^12/30us = 100Mhz+.

A better approach is to use an internal hardware counter to count PS_INPUT and combine that with the external prescaler to determine the pulse train's frequency.
发表于 2013-7-5 10:39:00 | 显示全部楼层
看了这么多精彩的内容,,,学到了很多
发表于 2013-7-9 01:07:37 来自手机 | 显示全部楼层
millwood0 发表于 2013-7-3 06:49
If you use interrupt on PS_INPUT pin, you need at least 30 ticks to process each interrupt. On a 1MI ...

假设mcu的最大计数频率为fT,则最大计数频率为2^12*fT
发表于 2013-7-9 01:11:27 来自手机 | 显示全部楼层
实际最大频率也受限于外部的分频器件。
发表于 2013-7-9 05:47:11 来自手机 | 显示全部楼层
本帖最后由 millwood0 于 2013-7-9 05:48 编辑

"假设mcu的最大计数频率为fT,则最大计数频率为2^12*fT"

Weather that's correct will depend on what you are counting and how you are counting it.

A typical timer/counter will be able to count, all by itself, to 20Mhz (or its whereabout). With that approach, your external prescaler will determine your upper freQuency limits.

If you are using external interrupt to measure the pulse width from your external prescaler - which my example was contemplating, the isr latency will determine the upper limits for the frequency measured, assuming that your hardware is up to the challenge.
发表于 2013-7-12 19:13:19 | 显示全部楼层
here is a minimalist implementation, reading a 12hz input, with a 6-bit prescaler:



the chart showed the reading of the prescaler.

here is the same code reading a 10012hz source:



the piece that reads the prescaler:
  1. unsigned short ps_read(unsigned char var) {
  2.         unsigned short tmp=0;                                                //temporary variable holding the prescaler value
  3.         //unsigned char tmp_psout=IO_GET(PS_PORT, PS_OUT);        //read the ps output
  4.        
  5.         //IO_CLR(PS_PORT, PS_SEL);                                        //turn to internal clock
  6.         do {
  7.                 IO_SET(PS_PORT, PS_CLK);                                //set ps_clk -> to drive the prescaler
  8.                 tmp +=1;                                                                //increment the temp
  9.                 IO_CLR(PS_PORT, PS_CLK);                                //clear ps_clk
  10.         } while (TMR1L == var);                                                //until out_pin flips / tmr1l flips
  11.         return tmp;                                                                        //return the number of pulses it takes to get a prescaler to flip
  12. }
复制代码
The above is almost identical to the code I posted earlier. the idle states are changed due to the chip used.

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2013-8-11 12:03:45 | 显示全部楼层
machao 发表于 2013-6-14 18:51
基于STC12C5A60S2简易频率计设计参考(节选)
设计题要求,设计一个基于STC12C5A60S2的简易频率计
1,        使 ...

马老师,我现在用msp430测一个4MHz的方波信号,430有两个定时器,我用TimerA产生一个1ms的中断。msp430 允许外部信号作为自己的定时基准,于是将被测信号输入TimerB。然后再TimerA产生的1ms中断里读取定时器B的计数。
于是将计数(N)/1ms,得到频率!
发表于 2013-8-11 15:06:21 | 显示全部楼层
Gorgon_Meducer 发表于 2013-6-9 23:36
对不起大家...有件事情我想说下...看你们写的中文原理...我
一时反应不过来,回头看了下前面英文的内容,就 ...

+1.。。。。。。
发表于 2013-8-11 15:17:57 | 显示全部楼层
测量系统,乃至待测系统都是有噪声的,而往往不是平均值为零的噪声,

用延长测试时间来提高精度的思路是有问题的。
发表于 2013-8-29 20:13:13 | 显示全部楼层
以前用FPGA写过等精度的。
发表于 2013-8-29 23:56:05 | 显示全部楼层
打个酱油路过,没想到遇到这么多高手,像武林大会~~
发表于 2013-8-30 16:27:05 | 显示全部楼层
………………………………
发表于 2013-9-2 16:28:55 | 显示全部楼层
受教了                                    
发表于 2013-9-25 21:44:54 | 显示全部楼层
本帖最后由 qiu452555846 于 2013-9-25 21:46 编辑

今天认认真真看了每一个贴子,有两点感受:
1、群里的高手很多,这是毋庸质疑的;
2、但是绝大多数贴子讨论的内容都违背了马老师本意。
我曾在本科二年级暑期(2009年)用M16做过一个自动单位转换的等精度频率计,12M晶振,被测信号0.1Hz~5.4MHz(指直接进入单片机的频率);全频率范围内连续测量,保证7位频率精度,10mV~10V的输入信号,正弦波、方波、三角波都可以测。不过,对于三角波,低频、小信号时似乎不大稳定(因信号上升的斜率较低)。LCD1602显示。外部信号直接从定时器的外部引脚输入,经过内部分频后由定时器的输出引脚输出,然后将该输出接至另一个定时器的外部捕获引脚。单片机总是连续测量最近约10^8个时钟的整数个外部信号的总周期,然后计算出其频率值。信号的测量连续进行,没有任何停歇间隙;但显示以5次/秒的刷新率进行(频率高于5Hz时)。我没有测量晶振的实际频率,只是根据测量的显示值与DDS的指示值进行比较,然后调整程序中的晶振参数,最终保证在整个测量范围内测量值与DDS的频率值的高七位完全一致。至于7位精度的说法,也没有进行专门的测量;但是,如果试图在软件上进一步提高精度,就会发现末位的显示开始不稳定,猜想是软件上已经达到当时的晶振稳定度的极限了,因此,7位精度的说法也是以我所使用的DDS为参考的。

个人感觉,这个设计的出现的问题在于:
1、全频率范围内保证7位精度,并且能够以较快的速度刷新显示(5Hz以下,别指望快速获得测量结果;0.1Hz时,10才有显示,但是显示之后,快速刷新是有可能的)
2、尽管定时器没有溢出,但对计算值(最大达到10^8)进行乘法和除法运算时(必须是定点的乘除,不能用浮点),32位的变量不够用,在C语言处理时需要一些技巧;
3、显示时的内部量程转换和单位换算问题很复杂,在量程转换的临界点,必须使用软施密特逻辑,才能保证显示稳定;
4、晶振的频率误差对测量精度没有影响(因为可以软件修正),但晶振的频率稳定度决定测量的极限精度。晶振的频率随时间、温度的漂移才j是影响测量的绝对精度的重要因素,而且很难修正。
5、“单片机总是连续测量最近约10^8个时钟的整数个外部信号的总周期,然后计算出其频率值”,程序很简洁,逻辑很复杂,是最难的部分,花了整整三天两夜的时间。
6、整个设计,反复拜读并参考了马老师教材中的方案。
7、有一观点十分清楚:无论使用多么高端的单片机,也不论外部用了多优秀的信号调理和分频电路,单片机(51、PIC、AVR、430、STM32、DSP、CPLD、FPGA)部分必须首先保证具有最高测量精度,否则你顶多只能设计出合乎指标的东东,却无法发挥硬件最佳的水平。

重新编辑,改了一个字。
发表于 2013-10-17 08:06:05 | 显示全部楼层
高手过招,几句话比我看几个月的书都强啊,我天天埋伏在坛子里,等着高手们过招,可他们很少动手啊,恨不能撺掇高手们开练,我一边偷着乐去。
发表于 2013-10-18 21:01:09 | 显示全部楼层
去年我也参加过省内的电子设计大赛,我们学校条件不好,又是小城市,做不出板子。我们导师给我们提供后勤,我们队也是赛钱没多久组建的,东西基本上我们三个人做的,条件比较艰难,后来拿了个三等奖。现在想想还是挺值的,毕竟亲身去做了。
发表于 2014-5-19 20:57:49 | 显示全部楼层
yxw_bob 发表于 2013-6-9 11:29
我承诺的文档.主要阐述了等精度测频法(多周期同步测频法)

//==》 不好意思,为了大家容易理解,就在你的 ...

十分佩服,请问马老师看到后,怎么不对这位大侠的设计给出评价?
 楼主| 发表于 2014-5-23 03:08:29 | 显示全部楼层
青梅li 发表于 2014-5-19 20:57
十分佩服,请问马老师看到后,怎么不对这位大侠的设计给出评价?

转贴昨天一个朋友〔NanceMichael〕发的贴:http://www.amobbs.com/thread-787722-2-1.html (172楼)

听大家这么说,我想要用一个M0核的单片机(新唐M051)的单片机通过定时器0和外部中断1计算来自外部中断1引脚的PWM波形有点行不通吧??PWM的周期是固定的。但是是us级的。而且占空比是不断变化的。我之前有用PWM捕捉试过,但是发现捕捉的周期不够快,中间有漏掉一些周期没有测试到。

========================================
我想,这个就是对我本帖最好的支持和评价。用MCU测量频率经常要用到的,通过本贴的讨论学习,真正理解频率(周期)测量的正确思路和方法,真正的掌握MCU定时器的应用,他就不会问这样的问题了。
发表于 2014-5-23 10:16:46 | 显示全部楼层
喜欢此类讨论可以在一个问题上深入,多看多做技术,十分受益,希望论坛多一些此类题目,多一些方案讨论。搬个小板凳,坐下仔细看。
发表于 2014-5-23 15:18:34 | 显示全部楼层
machao 发表于 2013-6-14 02:46
新注册就是因为我说了示波器不服气啦。我还真不了解,因为不在这个行业混。
我所知道是我听到的。
去年我 ...

这个某国内厂家应该是普源,
发表于 2014-6-18 17:02:21 来自手机 | 显示全部楼层
先收藏,再细看
发表于 2014-9-25 13:51:04 | 显示全部楼层
我觉得我的基础很差 啊
 楼主| 发表于 2015-6-29 22:23:18 | 显示全部楼层
今借助本坛出题挑战,有点孤独求败的意思。
非高手请避到绕开,只言片语的耍嘴皮子没有必要,反而一下让我看出你的真实功力。真刀实枪的上来,才是武林高手的风格。
看似简单,其实不简单。不懂的看热闹,只有懂行的才看得出门道。
现在只是围了一些看热闹的,看出门道的自己心里有数,自知功力欠缺的不响,真正功力高深的通常也是深藏不露,本人基本上又赢定了。哈哈。孤独求败也是非常难的事情。
=======================

2年前的帖子,还是我来给个方案,有兴趣的尝试一下。
 楼主| 发表于 2015-6-29 22:28:13 | 显示全部楼层
本帖最后由 machao 于 2015-6-30 16:07 编辑

1 频率测量原理简述
所谓频率,就是周期性信号在单位时间内的变化次数。为了便于理解,在本文中设定单位时间为1秒(1秒也是实际测量系统中主要使用的门宽),那么被测信号在1秒门宽中变化次数的单位就是赫兹(Hz)。频率测量的方法有多种,在数字电路中,基于脉冲计数原理的测量方法有测频法、测周法和多周期测量法[2]。本小节简单介绍上述三种频率测量方法的原理以及误差。
1.1        测频法
数字系统中的测频法实际就是按频率定义的直接测量方法:1秒内有多少个被测脉冲个数(计上升沿或下降沿),因此计数的结果直接就是被测信号的频率值。图1所示为测频法的测试波形示意图,其中精准的1秒计数门控信号是由基准时钟信号产生,在门控时间内,计数的脉冲个数Nx即是被测信号的频率值。测频法的频率值可以通过公式Fx = Nx / T计算获得。式中Nx为计数值,T为门宽时间,当T为精准1秒时 Fx = Nx。


测频法的误差为:
式中第2项误差来源于基准时钟信号产生的门控信号误差,当基准信号是精准的,且Fs >> Fx时,第2项的误差可以忽略掉。那么测频法的误差主要来源于第1项的贡献。在数字测量计数中, 为±1个计数脉冲,因此测频法的测量误差为±1/Nx。可以看出,当Nx大时误差相对小,反之Nx小时误差相对大。所以测频法在测量高频信号时误差小、精度高,适合测量高频信号的频率。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主| 发表于 2015-6-29 22:36:06 | 显示全部楼层
本帖最后由 machao 于 2015-6-30 02:16 编辑

1.2        测周法
数字系统中的测周法也是建立在脉冲计数的基础上,但它不是直接测量频率,而是去测量被测信号一个周期的时间(也就是测周期),然后再换算成频率值。图2是测周法的测量过程波形示意图。其中计数门控宽度与被测信号的一个周期严格同宽(同步),在门控时间内对精准的已知周期的基准时钟进行计数得到计数值Ns。通过这样的方法,就可以得到被测信号一个周期的时间长度为 Ns/Fs,其倒数则为被测信号的频率Fx = Fs/Ns。


测周法的误差为:

式中第1项误差来源于基准时钟信号本身的误差,当基准信号是非常精准时第1项的误差可以忽略掉。那么测周法的误差主要来源于第2项的贡献。同样在数字测量计数中, 为±1个计数脉冲,因此测频法的测量误差为±1/Ns。我们假定精准时钟信号频率是固定的,那么Ns大时误差相对小,反之Ns小时误差相对大。Ns大表征被测信号的频率低(被测信号周期长,在一个周期内计数的Ns多),而Ns小则表征被测信号的频率高,所以测周法在测量低频信号时误差小、精度高,适合测量低频信号的频率。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主| 发表于 2015-6-29 22:46:43 | 显示全部楼层
本帖最后由 machao 于 2015-6-30 02:19 编辑

1.3        多周期法
多周期测量法是在测周法基础上演变过来的,也称为多周期同步测量法或等精度测量法。其实它的原理非常简单:既然测周法的精度与Ns相关,那么计数的门宽不是限制在(同步于)一个被测信号周期时间内,而是限制在(同步于)N个被测信号的周期内。那么当N越大时,Ns也相应的越大,误差也越小。图3是多周期法的测量过程波形示意图。其中计数门控宽度与被测信号的N个周期同步,在门控时间内对精准的已知周期的基准时钟进行计数(Ns),通过这样的方法,就可以得到被测信号N个周期的时间长度为 Ns/Fs,因此被测信号的频率为Fx = Fs/Ns/N = Fs*(N/Ns)。


多周期测频法的误差为:

式中第1项误差同样来源于基准时钟信号本身的误差,当基准信号是非常精准时第1项的误差可以忽略掉。另外如果保证计数门控信号与被测信号N个周期严格同宽的话(多周期同步测量法的同步源于此),那么 为零,即第2项误差为零。因此多周期测量法的误差主要来源是第3项的贡献。从公式上看,多周期测量法与测周法的误差公式相同,都是±1/Ns(本质上测周法就是多周期测量法N=1的特例),但如果在测量过程中,根据被测信号的频率高低,选择合适的被测信号周期数N(显然被测频率越高,N越大),使得与其同步的计数门宽时间在1秒的范围内的话,那么门宽内对基准时钟信号的计数值Ns是相对固定的,同时也与被测信号频率无关,那么在整个频率测量过程中的精度是相同的,都是±1/Ns。这也是把多周期测量法称为等精度频率法的原因。我们再从有效数字的角度简单的分析一下,假定采用基准时钟信号频率为24M,那么1秒钟内对其计数的脉冲数Ns为24000000,测量误差±1/Ns为0.000000042。可见如果采用多周期测量法,当基准时钟信号频率为10M,同时设置计数门宽为1秒时,该方法理论上已经达到和超过了8位有效数字高精度的等精度频率测量。
总结一下,实现多周期等精度测量的要点有:⑴要根据被测信号的频率高低选择合适测量周期个数N,使得N个周期时间长度达到(或稍微超过)1秒;⑵计数门控信号必须严格与确定的N个被测信号周期同步;⑶基准时钟信号频率满足Fs>>Fx,且精准度要高,否则频率测量误差就要考虑上面误差分析中所忽略的项了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主| 发表于 2015-6-29 22:56:54 | 显示全部楼层
本帖最后由 machao 于 2015-6-30 02:22 编辑

2 基于STC15W4K32S4的单片智能8位有效数字的高精度频率测量系统
实际应用中可以采用多种数字硬件系统来实现多周期等精度的频率测量,比如采用FPGA[2]或采用MCU配合一定的外围器件[3]。本文提供了仅以一片增强型51兼容MCU - STC15W4K32S4完成8位有效数字高精度智能频率测量的方案以及实现方法。
2.1 系统硬件电路
图4是基于一片增强型51兼容MCU - STC15W4K48S4实现8位有效数字高精度智能频率测量的核心电路简图。被测信号经过前端的调理电路(未画出)整型成方波信号后,作为被测信号Fx连接到MCU的T0和T1计数输入端。采用动态扫描方式控制8个共阴数码管用于频率测量结果的显示,P0口为8位段码输出,P2口为8个数码管的位控。系统时钟为24M,这个时钟同时也作为频率测量中的基准时钟信号Fs。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主| 发表于 2015-6-29 22:58:41 | 显示全部楼层
本帖最后由 machao 于 2015-6-30 03:25 编辑

图中12M和250Hz的输出,是用MCU硬件分频输出的方波,(12M是24M的2分频输出),可直接应用与检测和调试测试代码。



我实现的指标:

1/ 测量频率范围0.5Hz - 12M  (测试信号输入为自己产生的12M/250Hz方波时,显示12000000/250.00000; 最后一位数纹丝不动!)
2/ 测量精度: 在整个频率测量范围,等精度,8位有效数字。
3/ 测量频度:>1Hz时 1.1S  ; <1Hz时  最长2S
4/ 量程自动转换
5/ 全自动频率测量,无任何选择和调整按钮

当然,如果要商品使用,系统时钟必须使用高精度和高稳定度的有源时钟,一般的比较好的有源晶振为10-6PPM,没有8位有效数字,所以要更好的有源时钟

我的代码没有任何的软件和计算带来的误差(采用长整型计算,有效位数10位,大于测量显示的8位),门宽同步全部由MCU内部硬件实现(该MCU可以工作在33M)。另外,系统时钟频率可以通过软件校正,比如设计使用24M系统时钟,但实测为23999998Hz , 那么只要改动程序中系统时钟频率值为23999998就可以了。

后记:整个实验室没有超过8位有效数字的频率计来校正我的频率计,向一个国际大公司的实验室也没借到8位有效数字的频率计。

其实,当被测信号的频率小于12M的情况下,输入的波形不需要方波,只要窄脉冲(高电平或低电平的窄脉冲都可以)的宽度大于0.042us(1/24M)就可以。

今天先把硬件设计图贴上,有兴趣的可以根据图,参考MCU的手册,分析测量采用的方法,然后写个代码PK一下。

提示:测量分成2步,首先采用测频法进行粗测,获得一个频率值,比如324567Hz, 然后采用等精度法进行精测,计数门宽为330000个被测信号的周期。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2015-6-30 00:09:07 | 显示全部楼层
好思路。闸门时间法和周期法完美结合。大大减小了各种误差。我以前在一些产品中也有应用。效果良好。但不知道应该叫这个名字。马老师吧这种方法做了概念上的抽象。非常感谢。
发表于 2015-6-30 08:20:50 | 显示全部楼层
确实,大家都知道,频率低了测周期,频率高点测多周期,固定时间测脉冲数。
但实际要做出高可靠/高准确的实物出来,不是那么简单的事情,当然了,如果你已经刚好有成熟的产品那就另当别论,纯属巧合。
发表于 2015-6-30 10:01:37 | 显示全部楼层
图全破了,不知道为何。
发表于 2015-6-30 11:07:48 | 显示全部楼层
大学的时候也有个频率计作业,当时用stm32做的,频率范围从2Hz~256MHz, 最大误差万分之二。
当时没有合适的信号发生器生成256MHz方波,用了FPGA来生成,用杜邦线连接居然可以成功计数。。(不过要用手按紧杜邦线接口)
发表于 2015-6-30 16:53:15 | 显示全部楼层
敬佩各位牛人的细致分析!
请叫马老师,在高速脉冲发生(变频并计数)应用中,误差可以控制到多少?频率可以达到多少?
http://www.amobbs.com/forum.php? ... =5582426&extra=
这种方法存在的误差会在哪里?是否都是“器件级”的误差?
还麻烦马老师稍加指点.
发表于 2015-6-30 17:11:50 | 显示全部楼层
已经是过去时了  曾经也是四天三夜啊
 楼主| 发表于 2015-6-30 17:32:37 | 显示全部楼层
许多人都是学51成长起来的,包括目前很多学校还是学习51.
尽管一些学校或者个人开始从STM32起步学习,但是还是用老51的思想和方式(没有办法,因为那些书中的例子是从老51搬过来的)。

现在新型MCU,8位也好,32位也好,包括改进的51(如stc的新51)内部配备了更多的定时器,而且功能更加强大和完善,它们主要有:方波产生、PWM波产生、比较匹配、自动重载、捕捉等。(再次强调,采用溢出中断方式是害人的,它只能用在低挡或精度要求不高的情况下,所以STC的新51已经取消了溢出事件)。

如果要产生高速脉冲,正确的应该使用定时器的比较匹配清零+控制输出取反(AVR),或自动重载+控制输出取反(STC51),这样最高可以产生1/2系统时钟频率的时钟(比如我上面使用24M系统时钟,可最高产生12M方波输出)。这样产生的方波是可以认为是纯硬件产生的,CPU占有率为0(根本不用中断,也不用IO取反指令),只是占用MCU内部的一个定时器,另外误差也仅取决于系统时钟本身的误差。

如果你看一下新的51或一些新型的MCU,其内部的定时器多达6-8个。真正掌握以及灵活配置定时器的使用,是真正掌握MCU的一个重要方面。也是需要很好的学习和训练的。我的AVR教程中已经体现了这个思想,介绍一些正确使用定时器的例子(当时的51定时器功能实在太简陋)。

 楼主| 发表于 2015-6-30 18:07:43 | 显示全部楼层
hmd420304805 发表于 2015-6-30 16:53
敬佩各位牛人的细致分析!
请叫马老师,在高速脉冲发生(变频并计数)应用中,误差可以控制到多少?频率可 ...

那个帖子我看了半天,弄不明白他到底要实现什么样的输出和控制波形。

你能给出一个具体的例子吗?比如1路变频与计数,输出的波形频率范围是多少(太高的话,步进电机和伺服电机会失步的)?需要输出什么样的波形等。
发表于 2015-7-1 09:23:14 | 显示全部楼层
machao 发表于 2015-6-29 22:46
1.3        多周期法
多周期测量法是在测周法基础上演变过来的,也称为多周期同步测量法或等精度测量法。其实它的 ...

那么1秒钟内对其计数的脉冲数Ns为24000000,测量误差±1/Ns为0.000000042
=====================================================
马老师,绝对误差为0.000000042时,测量值的有效位数是多少呢?绝对误差和有效位数的关系是怎样的呢?
发表于 2015-7-1 09:35:22 | 显示全部楼层
经典帖子。再次拜读。
 楼主| 发表于 2015-7-2 01:14:56 | 显示全部楼层
本帖最后由 machao 于 2015-7-2 01:28 编辑
sbk100 发表于 2015-7-1 09:23
那么1秒钟内对其计数的脉冲数Ns为24000000,测量误差±1/Ns为0.000000042
============================= ...


你可以网上查一下有效数字的定义和解释,百科的一个解释如下
http://baike.haosou.com/doc/5402062-5639748.html

我的解释是:有效数字是一个测量中结果表示的可信度、

测量肯定是有误差的,你给出一个测量结果的用数字表示,那么正确的表示是所有左面的数字是可靠的,最右一个数字是不准确的,作为参考。

举例说明,你测量一个长度是32.12米左右

那么结果写:
32.120          5位有效数字   那么我理解你是用普通米尺测量的,最后的0(mm)有误差,而前面的32.12是准的
32.1200        6位有效数字,那么我理解你是用游标卡尺测量的,最后的0(1/10mm)有误差,前面的32,120是准确的。

如果你给的结果是 32.12000     但有效数字只是5位的话,那么最右面的2个零实际上就没有任何意义。因为第5位已经是不可靠了,那么后面的数字还有什么作用?

所以,严格的科学态度测量结果不是随便写的,32.12   32.120   32.1200   32.12000    表示了测量的不同精度的可信度。

对于24M, 严格1秒应该是24000000个计数值,但由于硬件计数可能少或多一个 那么应该在 24000001 - 23999999之间,前面7位是可靠的最后1位变化参考,所以是8位有效数字。

在一个算式中,参与运算的各个数字的有效位数不同,其结果的有效数字与参与运算数中有效位数最少的哪个相同。精确的数,其有效位数为无穷多。

多次同条件下的测量值取平均,可以提高有效数字的位数,一般简单的,同条件测量10次,结果取平均,可以提高一位有效数字。但这个不能无限的提高,比如测100次平均,提高2位不成立。

严格讲,多次测量的结果是一个高斯分布,计算平均值,然后计算高斯误差,然后剔除那些与平均值相差大于高斯误差的测量值,然后在剩下的结果再计算平均,再计算误差,再剔除。。。。

不管怎样,对于测量,我们永远不会得到真正的值,结果总是有偏差的,误差的表示有绝对误差和相对误差。

比如,绝对误差是1HZ,那么对于测量结果是10HZ和测量结果是1M,其意义是不一样的。相对误差可以比较好的反映测量的可信度,比如1%的相对误差,结果100HZ,误差为1HZ,结果1K,误差为10HZ
所以相对误差1%,相当3位有效数字。

如果测量的相对误差1%,结果是1000HZ,严格的写法是1000+-10HZ。显示这个比较麻烦,另外最后的那个0实际是没有意义的,所以显示1.00KHz,我就知道,最后那位有误差,至少是10HZ

表示成1.000KHz,4位有效,表示最后一位误差,至少1HZ,那么此时相对误差为0.1%,不是1%了。

一个典型的例子是圆周率,通常计算我们用3.14(3位有效),精度要求高就要用3.1415926

以上解释可能不全面或不准确,具体参见《误差理论与数据处理》方面的书。给个参考链接
http://www.docin.com/p-366546305 ... E41DCB48AC0139DD002
http://www.docin.com/p-740027870 ... D615B683AD98150ED92
发表于 2015-7-2 14:16:53 | 显示全部楼层
正准备参加今年的电子竞赛,进来学习下
发表于 2015-7-2 18:32:04 | 显示全部楼层
machao 发表于 2015-7-2 01:14
你可以网上查一下有效数字的定义和解释,百科的一个解释如下
http://baike.haosou.com/doc/5402062-5639 ...

谢谢马老师详细的解答,我也认为有效位数是所有左面的数字是可靠的,最右一个数字是不准确的。但频率测量是间接测量,是由周期的倒数计算出来的,周期值的有效位数是否和频率值的有效位数一样呢?
在您的AVR书中测周法测量频率339页上面有这样一段话:

测周法的周期测量绝对误差为±(2us/250),即±0.008us。对于1kHz频率,其标准周期为1000us,考虑测量误差,周期范围为1000.008~999.992us,对应频率为999.992~1000.008Hz,有效位数为6位。而对于4kHz频率,其标准周期为250us。考虑测量误差,周期范围为250.008~249.992us,对应频率为3999.872~4000.128Hz,此时有效位数降为5位。可见当被测频率越高时,有效位数越少,测量的精度越差。

这段话中带下划线的数字应该就是那一位不准确的。1kHz的有效位数我能理解,但对于4kHz频率,周期范围为250.008~249.992us,有效位数应该是6位吧?为什么变成频率后就变成5位了呢?
发表于 2015-7-2 18:49:05 | 显示全部楼层
gzhuli 发表于 2013-6-8 16:13
呵呵,激将法没用的,我犯不着为了一句“不服气可以试试”去做一个对我来说连玩的价值都没有的东西。高射 ...

您这个频率计自身需要ocxo吧 不然9位的读数没有基准啊

不知我理解的对不
 楼主| 发表于 2015-7-2 19:45:47 | 显示全部楼层
zhangsusu 发表于 2015-7-2 18:49
您这个频率计自身需要ocxo吧 不然9位的读数没有基准啊

不知我理解的对不 ...

当然了,系统时钟需要高精度9位。任何频率计都是这样,结果要8位,测量的尺应该9位。

但不是说你有了9位的尺,就肯定能得到8位的精度。测量方法不对,计算不对,都会带来误差。

在我的例子中,系统24M,硬件分频输出12M,尽管24M有误差,但测量用这个24M产生的12M时,能准确到8位准确,说明测量方法和计算、软件没有任何的误差(仅这一步大部分的人做不到的)。

此时,把系统时钟换成OCXO,再用10位的频率计测出OCXO的频率,把这个频率值放在程序中校正,那么这个频率计比现在市场上几百元的频率计的精度要的多。
发表于 2015-7-2 20:25:26 | 显示全部楼层
zhangsusu 发表于 2015-7-2 18:49
您这个频率计自身需要ocxo吧 不然9位的读数没有基准啊

不知我理解的对不 ...

肯定是要OCXO的,没有精度分辨率再高也没意义。
一般还会预留外部参考频率输入,必要时可以用铷钟或者GPS驯服钟。
 楼主| 发表于 2015-7-2 20:38:09 | 显示全部楼层
sbk100 发表于 2015-7-2 18:32
谢谢马老师详细的解答,我也认为有效位数是所有左面的数字是可靠的,最右一个数字是不准确的。但频率测量 ...

我给你提供的链接资料仔细学习过吗?

我书中例子是周期测量法例子,考虑老51的定时器没有捕捉功能所以用了2个定时器。这个方法本身不是最好的方法。如果定时器有捕捉功能,应该用捕捉方式进行周期的测量(书的下1节就是高精度周期测量的例子)

周期的倒数就是频率  F = 1/T;  根据误差理论和数据处理原则,结果有效位数与算式中参与数最少有效位数系统。常数1的有效位数是无限多,所以,频率的有效位数同周期的有效位数。

在我的例子里,测量是250个周期的时间:

1K方波的周期是1000us,  那么250个周期的长度是 250000us,误差是2us ,所以250个周期时间 250000 是6位有效,因为最后一位是有误差的。
换算成频率  F = (1/(250000/250)) * 1000000,这个算式里,1 250 1000000都是常数,有效位数无限多,那么结果的有效位数与250000相同,6位。

4K方波的周期是250us,  那么250个周期的长度是 62500us,误差是2us ,所以250个周期时间 62500us 是5位有效,因为最后一位是有误差的。
换算成频率  F = (1/(62500/250)) * 1000000,这个算式里,1 250 1000000都是常数,有效位数无限多,那么结果的有效位数与62500相同,5位。

这个例子说明测周法适合频率低的测量。
发表于 2015-7-2 20:48:13 | 显示全部楼层
machao 发表于 2015-7-2 19:45
当然了,系统时钟需要高精度9位。任何频率计都是这样,结果要8位,测量的尺应该9位。

但不是说你有了9位 ...

阿莫论坛网友 yuhang 手头似乎有性能极高的时间频率 计量设备 马老师可以请他帮忙计量一下您的电路 ocxo 他手头也有很多 二手的性能很好 也不贵
 楼主| 发表于 2015-7-2 20:53:17 | 显示全部楼层
gzhuli 发表于 2015-7-2 20:25
肯定是要OCXO的,没有精度分辨率再高也没意义。
一般还会预留外部参考频率输入,必要时可以用铷钟或者GPS ...

不错,软件中增加校正功能我已经实现了。

具体方法:用我的频率计和一个9位以上有效数字的频率计测量同一个方波频率,然后通过2个按键+或-,改变程序中24000000值,每次加1HZ增加(或减1HZ递减),直到其显示的频率与更高精度频率计显示的结果最接近。然后保存在EEPROM中,以后的测量以此值为准计算。
发表于 2015-7-2 20:54:24 | 显示全部楼层
本帖最后由 learner123 于 2015-7-2 21:00 编辑

删除内容,感觉没有必要。
 楼主| 发表于 2015-7-2 21:00:38 | 显示全部楼层
本帖最后由 machao 于 2015-7-3 03:14 编辑
learner123 发表于 2015-7-2 20:54
频率计本科做过,51内核,汇编语言,大约700~1K代码量,动态扫描模式的4位精度,当时的作业,当然高一点也 ...


小老弟,看你说到:计数器溢出重载时,考虑指令执行周期,作为固定误差消除,就知道你的方法肯定不是精度高的。
没这点水平,也不敢在网上打擂台。

再说明一点,这样精度的频率计的实现,用一片老51根本作不到,我也作不到。你本科用的什么型号51?定时器有几个?带捕捉功能吗?带波形产生和PWM波产生功能吗?

用MCU本身进行频率测量至少使用2个定时/计数器,只要你在A定时器中断服务中去(停止B定时器计数)读取B定时器的当前值的话,就会带来误差,这个误差已经不是正负1个计数脉冲了。

最准确的应该是当A中断时(计数门限到),即可(同时)拿到B的计数值,此时的误差为正负1个计数脉冲。

如果进入A的中断服务程序后再去读B的值时,由于进入中断需要时间,中断现场保护也需要时间,所以当进入中断再读B的值,B已经变化了,增加了。楼上的那位老弟采用汇编语言“计数器溢出重载时,考虑指令执行周期,作为固定误差消除”可以减少一些误差,但是还有一个误差是无法判断的。

注意2点:1/中断是随机产生的;2/中断条件成立后,CPU必须执行完当前正在执行的指令后才进入中断相应的过程。那么当中断条件成立时,CPU当前正在执行的指令是哪条是不确定的,(不同指令执行的时间不一样);再者,中断条件成立时刻,CPU是刚开始执行当前的指令,还是执行了一半,还是恰好执行完了,也是无法评定的。因此这个进入中断的时间误差是无法消除的!传统51一条指令执行时间在12-48CLK之间,而STC51一条指令执行时间在1-5CLK之间,比理论上正负1个计数脉冲(1CLK)大了好多倍,所以结果的误差必然大。

另外,如果使用不同的MCU,这样的“固定误差消除”必须重新估算,这对那些众多的只会用C编程,不懂汇编的工程师是要命的方法。

最好的解决办法,就是当A中断条件成立(计数门限到),在硬件上同步停止B的计数,此时可以太太平平的在A的中断中读B的计数值了,不需要作任何的“固定误差消除”。51本身在硬件上有这个功能,小老弟你会用吗?

作为MCU的练手题,不可能专门购买OCXO,专门配备更高精度的频率计量设备来验证。但我给出的设计本身就可以正确的验证所采取的方法和编写的代码是否能达到高精度的测量。

系统时钟24M,采用硬件将其2分频输出12M方波作为被测信号,此时不管你的24M偏差多少,把他作为基准信号,去测量由它产生的12M方波,经过你的测量过程最后能纹丝不动的显示12000000的话,说明通过了。
系统时钟24M,I/O最高能检测到的输入电压变化频率,计数器计数输入频率上限就是12M(1/2 系统时钟,上面有帖子说明)。

我已经给出我的硬件电路图,还有那么多的提示、解释,可以运行的,用于PK的HEX(源代码全部是用C写的,但目前不提供)也有下载。小老弟,不服气可以试一下。既然认为这个练手题你本科就作过,能作的比我好的话,何必自动跳下PK台?难道是要帮我证明孤独求败的确非常难吗。
 楼主| 发表于 2015-7-2 21:04:32 | 显示全部楼层
zhangsusu 发表于 2015-7-2 20:48
阿莫论坛网友 yuhang 手头似乎有性能极高的时间频率 计量设备 马老师可以请他帮忙计量一下您的电路 ocxo  ...

这个学期,让一个本科生作毕业设计,就是这个题目,先让他能完成算法,然后购买OCXO,把实验室中一个原来有8个数码管(不是8位有效数字)的频率计改造一下。可惜,一个学期连最基本的算法和代码也没有搞明白。
发表于 2015-7-2 21:29:43 | 显示全部楼层
machao 发表于 2015-7-2 21:04
这个学期,让一个本科生作毕业设计,就是这个题目,先让他能完成算法,然后购买OCXO,把实验室中一个原来 ...

这是个很好的题目啊
属于单片机的高阶应用了 不过现在不少本科生都心不在焉 不知道在想什么
发表于 2015-7-3 02:20:55 | 显示全部楼层
前面看到高手们都说过了,所以也没必要再和马老师扯了,都说了已经是本科时搞过的老东西,那时候只有标准51,1/2时钟限制问题是无法解决的了,根本没必要扯,所以删除内容。
捕获功能不过就茴香豆的第四种写法而已。看到马老师卖弄也没闲工夫陪着玩,您还是过过嘴瘾就行了,别带坏了坛里的风气。中国和世界目前不用您拯救,事实上您也拯救不了。就两把刷子而已,用不着在这里找自信。
 楼主| 发表于 2015-7-3 02:34:38 | 显示全部楼层
本帖最后由 machao 于 2015-7-3 02:56 编辑
learner123 发表于 2015-7-3 02:20
前面看到高手们都说过了,所以也没必要再和马老师扯了,都说了已经是本科时搞过的老东西,那时候只有标准51 ...


不好意思,真不明白您说的1/2时钟限制问题是指什么。“那时候只有标准51,1/2时钟限制问题是无法解决的了”,那么现在的新型51、AVR STM32 解决了“1/2限制问题”?到底什么是1/2问题?

我刚在上面的帖子里补充分析和解释了你的方法为什么不精确的原因,跟1/2限制有什么关系吗。

感谢您承认偶有2把刷子,您自己有几把,亮出来看看吗。

我出个练手题,过过嘴瘾是实,但也谢谢把我拔高到拯救世界和中国那样的高度,实不敢当。

不过坏了坛里风气应该是您啦,想踢馆就拿实力说话,证明您能做的更好。而不是说风凉话。您的帖子里有多少技术实质的东西?
 楼主| 发表于 2015-7-3 03:00:39 | 显示全部楼层
再重复一遍2年前的疯话:

      今借助本坛出题挑战,有点孤独求败的意思。
      非高手请避到绕开,只言片语的耍嘴皮子没有必要,反而一下让我看出你的真实功力。真刀实枪的上来,才是武林高手的风格。
      看似简单,其实不简单。不懂的看热闹,只有懂行的才看得出门道。
      现在只是围了一些看热闹的,看出门道的自己心里有数,自知功力欠缺的不响,真正功力高深的通常也是深藏不露,本人基本上又赢定了。哈哈。孤独求败也是非常难的事情。
 楼主| 发表于 2015-7-3 04:12:34 | 显示全部楼层
本帖最后由 machao 于 2015-7-3 04:13 编辑

1ppm  百万分之一  相当7位有效

高精度 晶体  的精度 5ppm   相当6.5位有效数字(实际认为6位 )    所以一个12M晶体  其频率误差有几十赫兹
高精度有源晶振   0.5ppm    相当7.5位有效数字(实际认为7位)
ocxo 恒温晶体晶振 0.05 - 0.01ppm  相当8.5-9位有效数字。因此不管采用什么方案,要实现8位有效数字的频率测量,计数基准信号时钟要采用OCXO是必要的保证。

而我的实现方案已排除软件上的任何可能产生的误差,误差仅为理论上计数的正负1个脉冲,所以最终决定有效位数仅依赖与系统时钟的频率和精度。

该方案的频率测量精度,最终取决于系统时钟的频率和精度。如果使用其它的MCU,比如STM32,当其工作系统工作时钟为100M时,可以达到9位有效数字的频率测量,不过此时系统时钟本身精度至少也要9位有效数字。

如果要扩展量程话,此时外围增加一个分频器,比如在我提供的电路上,外围增加一个10分频电路,就可以实现120M频率的测量,而软件变化只是简单的把测量结果乘上10就可以了,但精度仍然是8位有效数字。

发表于 2015-7-3 10:02:16 | 显示全部楼层
machao 发表于 2015-7-3 04:12
1ppm  百万分之一  相当7位有效

高精度 晶体  的精度 5ppm   相当6.5位有效数字(实际认为6位 )    所以 ...

没事多出现。即使做不出来,也很有收获。
发表于 2015-7-3 12:54:58 | 显示全部楼层
learner123 发表于 2015-7-3 02:20
前面看到高手们都说过了,所以也没必要再和马老师扯了,都说了已经是本科时搞过的老东西,那时候只有标准51 ...

看马老师的帖子收获非常多 比你在这BB强一万倍!
发表于 2015-7-3 13:24:06 | 显示全部楼层
machao 发表于 2015-7-2 20:38
我给你提供的链接资料仔细学习过吗?

我书中例子是周期测量法例子,考虑老51的定时器没有捕捉功能所以用 ...

马老师必出精品,AVR的书写的很好,工作中获益不少。赞赞赞!
发表于 2015-7-3 16:27:00 | 显示全部楼层
本帖最后由 hmd420304805 于 2015-7-3 16:29 编辑
machao 发表于 2015-6-30 18:07
那个帖子我看了半天,弄不明白他到底要实现什么样的输出和控制波形。

你能给出一个具体的例子吗?比如1 ...


需要的是一种 可以 精确控制脉冲个数 以及 实时改变脉冲频率 的脉冲序列,
精确控制脉冲个数用于驱动伺服/步进定位(比如机构运动1个毫米需要1000个脉冲)<--这个必须是准确的,多一个少一个都不行
单次定位脉冲个数在  2,147,483,647 (32bit/2)
实时改变脉冲频率,是为了满足电机的加减速曲线,使设备运动比较“柔和”
频率范围在100 ~ 1mhz
请指教
 楼主| 发表于 2015-7-3 19:01:00 | 显示全部楼层
本帖最后由 machao 于 2015-7-3 19:48 编辑

我需要整理楼上的要求说明。
1 、脉冲的波形有要求吗?比如方波,或PWM波。如果是PWM波,极限的占空比是多少?
2 、频率范围在100HZ-1MHZ, 调节精度是多少?或者说是步长有什么要求?
3、单次定位脉冲个数是什么概念?

是不是可以这样理解,每次发一个脉冲群,个数为2147483674个,每个脉冲的周期要能改变,最短1us,最长10ms
准备用什么MCU实现。

需要指出的是如果脉冲必须是方波,那么频率调节步长要比PWM波比一点(频率调节精度稍微粗一点。方波的话一个周期变化每次至少要多2个计数,而PWM波一个周期变化可以多一个计数)

还有,1M频率控制波好像不太符合实际情况,大功率电路,以及机械步进马达能跟的上吗(尤其在带负荷的情况下)?会失步的。
发表于 2015-7-7 17:00:39 | 显示全部楼层
本帖最后由 hmd420304805 于 2015-7-7 17:02 编辑
machao 发表于 2015-7-3 19:01
我需要整理楼上的要求说明。
1 、脉冲的波形有要求吗?比如方波,或PWM波。如果是PWM波,极限的占空比是多 ...



本帖最后由 machao 于 2015-7-3 19:48 编辑


我需要整理楼上的要求说明。
1 、脉冲的波形有要求吗?比如方波,或PWM波。如果是PWM波,极限的占空比是多少? -->只是占空比50%的方波,永远都是
2 、频率范围在100HZ-1MHZ, 调节精度是多少?或者说是步长有什么要求?-->调节精度在1HZ(暂定步进为1HZ,其实在高细分电机定位控制中步进100hz电机运转也不会感觉到抖动)
3、单次定位脉冲个数是什么概念?-->就是一次定位的脉冲个数

“是不是可以这样理解,每次发一个脉冲群,个数为2147483674个,每个脉冲的周期要能改变,最短1us,最长10ms”这样理解非常正确,很复杂的机械运动就是有很多次定位实现的

准备用什么MCU实现。-->普通的8/32位RSCI单片机,不能用FPGA或者其他硬件逻辑可编程器件

生成的PWM频率必须满足指数型或者S形加减速曲线(涉及到运算,比较吃CPU)
指数加减速算法为

S形加减速算法为


以上只是加速曲线,减速时还需要判定减速点

用什么MCU,还得考虑运算速度的问题,发送脉冲和加减速服务不得长时间占用CPU(尽可能少占用的其他外设数据还需要实时处理,如串口,IO扫描,几路PID算法,或者FFT等等)


还有,1M频率控制波好像不太符合实际情况,大功率电路,以及机械步进马达能跟的上吗(尤其在带负荷的情况下)?会失步的。-->可以跟得上,现在的步进驱动器都有高细分功能,在很大程度上可以消除由输入的定位脉冲频率抖动而产生的震动,伺服电机更有电子齿轮比可调,很多运动控制卡都是标称4MHZ最高频率
以上就是一些基本的命题了,请马老师分析。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2015-7-7 17:28:32 | 显示全部楼层
学习了,谢谢楼主分享!
 楼主| 发表于 2015-7-7 18:49:55 | 显示全部楼层
本帖最后由 machao 于 2015-7-8 00:56 编辑

2 、频率范围在100HZ-1MHZ, 调节精度是多少?或者说是步长有什么要求?-->调节精度在1HZ(暂定步进为1HZ,其实在高细分电机定位控制中步进100hz电机运转也不会感觉到抖动)

调节精度1HZ,根本作不到的,想一下,从 1000000(1M)减低频率,精度1HZ,既是调整到 999999HZ.采用MCU内部的计数器?

简单说明:假定MCU工作在100M
那么 I/O的输出方波最高为50M  (2分频)
接下来: 25M       (4分频)
接下来: 16.667M (6分频)  。。。。
到 :      1M  (100分频 50个高、50个低)
下面:    0.980392M (102分频 51高/51低) 步长为19.61K!
随着频率减低,步长间隔会减小,但是1HZ?

这不是读博士,纸上谈兵写论文。提出的需求要切合实际。

===============================

就是不考虑步长问题,那么仅仅一路这样的可变PWM脉冲序列也产生不了。

假定系统时钟为100M,如果只是产生1M的方波(不变频)是绝对不占用CPU的。哪怕是产生50M方波,也是不占用CPU的。因为定时器可以自动计数分频,并控制I/O口输出,CPU可以不管。

但是每产生一个方波后,要计算下一个方波的频率,然后还要调整,这个就困难了。频率低时还可以,1M是不可能的。1M方波的周期是1us,100M的系统,系统时钟周期是0.01us,换句话讲,按一个系统时钟可以执行1条汇编指令的话(目前好像没有那片MCU做到一个系统时钟执行一条指令的,AVR也只是近似到1MPS),1us只能执行100条汇编指令!100条汇编如何能计算出下一个PWM的周期?查表的话也不够用(99.9%的人用C编程,还要采用厂方提供的库函数,效率更低),不要说还要作其它的事情。就这个变频PWM波也忙不过来的。
发表于 2015-7-7 21:48:29 | 显示全部楼层
machao 发表于 2015-7-7 18:49
2 、频率范围在100HZ-1MHZ, 调节精度是多少?或者说是步长有什么要求?-->调节精度在1HZ(暂定步进为1HZ,其 ...

马老师,看了你的电路,结合手册,大概分析如下。被测信号作为T0的时钟计数,T0的溢出率作为PCA的时钟输入,PCA的比较功能控制T1的Gate,从而实现等精度的门控时钟。不明白的是  T1接入待测信号的用意是(初测频率?),还有个问题是,T1的溢出如何处理?假设1S的时钟内,T1必定溢出,在中断中处理,必定会如你前面所说的误差。请马老师指导!
发表于 2015-7-7 21:49:47 | 显示全部楼层
本帖最后由 chenchaoting 于 2015-7-7 22:42 编辑

好像T1的中断影响不大,这样就有思路了。
发表于 2015-7-7 22:16:21 | 显示全部楼层
此贴必火,先占位支持了,谢谢分享
 楼主| 发表于 2015-7-8 00:21:05 | 显示全部楼层
chenchaoting 发表于 2015-7-7 21:49
好像T1的中断影响不大,这样就有思路了。

方向对的,有点意思了。

前面已经提示了:“测量分成2步,首先采用测频法进行粗测,获得一个频率值,比如324567Hz, 然后采用等精度法进行精测,计数门宽为330000个被测信号的周期。”

再给2个提示:

1/   使用51定时器的GATE功能,起到硬件同步(对齐)测试门宽。测频时,GATE准确对齐1秒;等精度测量时,GATE准确对齐被测信号的N个脉冲(稍微大于1秒)。GATE门开启,T1立刻开始计数;T1开启溢出中断,中断中使用软件计数。GATE关闭,T1立刻不能计数了。这样通过硬件保证了T1的计数与被严格的限制在GATE门宽内。然后可以在GATE关闭的中断内从容的去读取T1的计数值,时间长点也没关系,因为T1的值在硬件GATE关闭后不能计数,保持不变了,其误差既是理论上的正负1个脉冲。

2/   那么TI的溢出中断会影响T1本身的计数吗?
       下面按最苛刻的时间估算一下
      T1最高计数频率是系统时钟(基时)24M,为0.0417us,T1十六位,计数65536个溢出,0.0417us*65536 = 溢出间隔为2.731ms。
      STC工作在1T模式时平均一条指令的执行时间为2个系统时钟周期。1/24000000 × 2 = 0.083us。溢出中断间隔内可以执行的汇编指令数为 2731/0.083 =32903条。 T1的溢出中断服务就是做一个INT型(16位)加一的软件计数(1/24000000 × 65536 × 65536  大约是179秒,)。另外在T1计数期间,不需要换算频率等计算,只是要顾及动态扫描数码管的显示。因此T1溢出间隔2.731ms内的主要任务是一次中断中一个整型数加1的计数,和一次数码管扫描显示(2ms扫一次,刷新率62.5帧)。32903条汇编指令作这点事情足够吧。  
发表于 2015-7-8 08:36:42 | 显示全部楼层
本帖最后由 hmd420304805 于 2015-7-8 08:42 编辑
machao 发表于 2015-7-7 18:49
2 、频率范围在100HZ-1MHZ, 调节精度是多少?或者说是步长有什么要求?-->调节精度在1HZ(暂定步进为1HZ,其 ...


我对步进这个概念不是很理解,总而言之就是要对发出脉冲的频率需要改变。
也就是对电机进行加减速控制。
你所说的每个脉冲都要算一次,肯定是不可能的,就假设你能够做到这样的处理,步进/伺服也不会有太明显的效果,因为现在的驱动器都带有一定的指令平滑滤波器
现在的PLC基本上变频有两种办法,定时变频 和 分段变频 ,不用做到每个脉冲都去计算频率
变频或采用DMA
或采用其他方式
最好能做到4路这样的脉冲输出
请马老师分析
 楼主| 发表于 2015-7-8 14:17:37 | 显示全部楼层
"现在的PLC基本上变频有两种办法,定时变频 和 分段变频 ,不用做到每个脉冲都去计算频率"

你前面给出的公式是每个脉冲都去计算频率的呀。定时变频,这个时间间隔是多少?分段又是如何分的?
发表于 2015-7-8 14:36:50 | 显示全部楼层
本帖最后由 hmd420304805 于 2015-7-8 14:39 编辑
machao 发表于 2015-7-8 14:17
"现在的PLC基本上变频有两种办法,定时变频 和 分段变频 ,不用做到每个脉冲都去计算频率"

你前面给出的公 ...


举个例子说明分段变频:你要发1000个脉冲出去,可以分成10 个 100个脉冲的脉冲段,每个个脉冲段都对应着一个频率,从而实现变频

我列举几个典型的PLC的参数:欧姆龙CP1H    定时变频   周期为4MS
                                         基恩士KVN60  定时变频   周期为1MS
                                         三菱FX2N       分段变频       ?        多少个脉冲为一段无法得知
 楼主| 发表于 2015-7-8 15:27:02 | 显示全部楼层
本帖最后由 machao 于 2015-7-8 15:31 编辑

以这个为例,“基恩士KVN60  定时变频   周期为1MS”

1/ 方波最高频率 1M  最低100Hz
2/ 频率调节精度?这个你原来提出的也是做不到的
3/ 频率改变时间1ms
4/ 频率改变的计算方法?是查表还是经验公式?1ms的时间够么?

先看一路如何产生。如果一路都不行,其它免谈了。

“变频需要DMA”,这个也不明白,知道DMA是什么意思?与变频之间是什么关系?
发表于 2015-7-8 19:29:42 | 显示全部楼层
随便说说,附和一下马老师。老师也是为了教育好人。好多年前(大于10年)搞过8,9位显示的100M的等精度频率计。当然有参考。其中一个参考是7,8十年代设计的石英晶体测试仪器。频率源、信号处理这些都要求高。那个测试仪就是用的51片子,当然是31了。恐怕当时51片子才刚出来几年。后面我搞的是要PCI卡的频率计,cpld或FPGA,基本完成了频率测试部分设计。PCI部分没搞定,不过准备用简单的接口芯片来做应该问题不大。后来买了类似的板子用(我自己改改),再后来就没有了。。。资料包括VHDL、原理图都留存着。
发表于 2015-7-9 03:32:04 | 显示全部楼层
不好意思,真不明白您说的1/2时钟限制问题是指什么。


Because you have no idea what an asynchronous counter is, vs. a synchronous counter. Something mentioned to you a few years back in this very thread.

They usually teach that in EE 101 classes at any decent school.
 楼主| 发表于 2015-7-9 15:51:06 | 显示全部楼层
哈哈,楼上这位“洋高手”又出来了,不想说别的,只是技术解释,希望这位高手能具体说明哪里是错误的。

1/ 首先看278楼的原话:”那时候只有标准51,1/2时钟限制问题是无法解决的了”
    这个意思好像说(我从字面上的理解,也可能我中文水平差,理解有问题),现在的新的51没有1/2时钟限制问题了。楼上的那位,你能说明一下“标准51的1/2时钟限制问题”是指的什么?

2/ 目前的MCU中配备的计数器大部分都是同步计数器(与系统时钟同步),不是异步计数器(AVR 是配有一个异步计数器的,主要用于实时时钟)。我使用的STC51内部配有6个计数器,全部是同步计数器,所以我提供的参考方法也是建立在使用同步计数器基础之上的。

3/ 提供的参考方法是合理配置MCU内部的设备,巧妙的把在测量过程中软件本身以及进入中断处理的延误等人为造成的误差彻底消除掉,那么测量精度的本身就取决于硬件本身了。这里一个系统时钟本身的精度,这个在上面已经提到,如果要形成产品,需要使用高精度的系统时钟。第2个既是MCU本身的硬件限制。

4/ MCU本身硬件限制体现在2个方面。第1个就是输入同步计数器计数脉冲频率的限制。计数器可以输入的计数脉冲分成2个,一个是对内部时钟计数,一个是外部I/O输入的计数脉冲。由于计数器与系统时钟是同步的,所以MCU内部的计数器对内部计数的最高频率既是系统时钟频率。但对于外部I/O输入的脉冲计数是不能达到系统时钟怎么高的频率。由于要检测I/O口上电平的变化,而I/O工作的时钟也是与系统同步,所以I/O口输入的计数时钟频率理论值是1/2系统时钟频率。举例说,当系统时钟为24M时,计数器对I/O的计数脉冲频率最高为12M,而且必须是50%的方波。如果输入的计数脉冲不是方波,那么最短的高电平(或低电平)的宽度必须大于1/24M,这样才能保证计数本身的正确。

5 / 这个好像是1/2限制问题,但是这仅标准老51, 而是新51,以及大部分MCU的计数器都有这个限制。好像楼上这位高手2年前对此就有疑问,在这个帖子里,我贴出了AVR的器件手册的英文解释,另外一个贴出的STM32器件手册的介绍(213楼),楼上这位到没有表态了,不知道是我对,还是他对。大家可以找一下本帖内的帖子。

6/ 另外一个硬件上需要考虑的问题是门控。我的方法中采用MCU计数器的GATE门控功能(这个功能标准的老51也有)。那么它会产生误差吗?注意,这个门控是MCU内部的功能,产生门控的电平也是计数器本身硬件产生的,其实质是逻辑电路不是时序电路。当计数器计数到一个数值,该数与比较寄存器比较相等,立即将一个I/O置低输出,该输出到门控GATE,立即禁止了计数器计数脉冲的输入,这个过程不是指令控制的,是MCU内部硬件的逻辑电路产生的效果。STC的MCU标称工作在33M,我的参考方法工作在24M,在这样的条件下,硬件逻辑门的延时是可以忽略不计的,对测量没有任何影响。也没有什么1/2的问题。

7/ 本身这个是练手题,是借用测量频率来训练如何更好、更精、更有效、更合理、更巧妙的应用MCU。所以我的指标是最高测到12M(1/2 系统时钟)。当然这个12M是个极限值。我方法中用24M系统时钟硬件2分频,产生12M的方波,这个12M方波与24M同步,正好满足条件,所以可以正确的测量。如果输入另外的12M,测试可能有误差,但只要保证输入12M的是50%的方波,还是可以准确测量的。

8/  274楼的朋友贴出的帖子,在15分钟后他自己删除了,他认为这个是小儿科的题目,他本科做过,还好我在275楼记录他帖子中一段话:
    “计数器溢出重载时,考虑指令执行周期,作为固定误差消除”
     这表明他已经知道,他的中断处理中会产生误差,并采用了一定的方法去消除掉。这已经算不错的,能知道这样使用会有误差。可是现在有更好的解决方法根本消除这个误差的产生,为什么不能学习和改进?还有什么值得你看不起别人。

9/ 299楼的朋友,你如果真的有两下,回答一下287楼朋友的问题,帮他分析一下。拿起一个败将丢弃的所谓1/2问题的武器,涂上一层腊(什么同步、异步时钟)到这里踢馆,有什么意思。即便是看不惯来踢馆的话,也要用技术说话。方法哪里不对,哪里有错,以及为什么不对。打几个英文字,说几句风凉话就表示你水平高么。面包牛奶我也喝了一年半,接触过的国外教授、技术总监、工程师多了,299这样的“洋人”还真没见过。
友情提示:标题不合格、重复发帖,将会被封锁ID。详情请参考:论坛通告:封锁ID、获得注册邀请码、恢复被封ID、投诉必读
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|阿莫电子论坛(原ourAVR/ourDEV) ( 公安备案:44190002001997(交互式论坛) 工信部备案:粤ICP备09047143号 )

GMT+8, 2019-9-15 18:55

阿莫电子论坛, 原"中国电子开发网"

© 2004-2018 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表