回复
发帖数: 11
注册日期: ‎03-20-2017
已接受解答

c8051f560单片机adc示例程序定时器装载值设置是不是出现了错误?

在c8051f560-TB单片机的adc的示例程序中,对定时器2的reload value的设置为:

TMR2CN = 0x00; // Stop Timer2; Clear TF2;
// use SYSCLK as timebase, 16-bit
// auto-reload
CKCON |= 0x10; // Select SYSCLK for Timer 2 source
TMR2RL = 65535 - (SYSCLK / 10000); // Init reload value for 10uS
TMR2 = 0xFFFF; // Set to reload immediately
其中系统时钟sysclk=24000000Hz。

按照对程序的标注,定时器二的reload value为10us,然而我计算得到的reload value为100us,计算过程如下:

1.定时器二从reload value到溢出值0xFFFF要经过的计数次数为:

                                                                                                65535-TMR2L=SYSCLK/10000=2400
2.又因为定时器2选择系统时钟SYSCLK作为时钟源(Select SYSCLK for Timer 2 source),所以2400次计数花费的时间为:

                                                                                                        2400/24000000=0.0001s=100us
不知道是我算错了还是示例程序真的出现了如此低级的错误呢?望各位不吝指教!

此外,该示例程序中还有一个明显错误,就是adc的参考电压明明选择的是2.20v,最后计算的时候代入的参考电压却莫名其妙的变成了2.40v,错误程序如下:
                                          VREF                                         

  measurement (mV) =   --------------- * result (bits)

      //                       (2^12)-1 (bits)

      //

      // Then multiply the result by 2.27 to account for the 0.44 gain

      // applied earlier

 

      mV =  result * 2400/ 4095 * 227 / 100;

发帖数: 2,079
注册日期: ‎10-14-2014

回复: c8051f560单片机adc示例程序定时器装载值设置是不是出现了错误?

Yes, I agree that there is some mistake in this example code.

I will create an internal ticket to address this.

Many thank to you for bringing this to our attention.

Denver

WeiguoLu
发帖数: 11
注册日期: ‎03-20-2017

回复: c8051f560单片机adc示例程序定时器装载值设置是不是出现了错误?

非常感谢您的回复!我还想问一下关于第二个adc的参考电压是否也出现了错误?按照数据手册上的标识,参考电压应该为2.20v,但是最后计算结果的时候代入的确是2400(mv)即2.4v。如果按照2.4v代入的话,确实是可以测得到示例程序所预期的p1.2引脚电压为5v的结果,但是明显和数据手册上的参考电压出现了冲突,而且我实际用示波器去测p1.2引脚的测出的电压不是5v,而是4.68v,而将参考电压为2.20v时,得到的结果也是4.68v,这就和实际对上了。而程序中的将参考电压有点让人怀疑是为了凑成5v而改的,能否请您解答一下呢?


程序原文:

 P1.2 on the C8051F560-TB is connected to a potentiometer.  When the

// potentiometer is set to the maximum setting, the voltage input is VIO,

// which is 5V.  In order to measure this signal using the on-chip 2.25V(这里又莫名其秒变成了2.25v)

// voltage reference, the on-chip Gain module is used to scale the signal.
最后代入计算结果的时候:

The 12-bit ADC value is averaged across 2048 measurements.

      // The measured voltage applied to P1.2 is then:

      //

      //                                          Vref (mV)

      //   measurement (mV) =   --------------- * result (bits)

      //                                      (2^12)-1 (bits)

      //

      // Then multiply the result by 2.27 to account for the 0.44 gain

      // applied earlier

 

      mV =  result * 2400/ 4095 * 227 / 100;
再次表示感谢

 

 

发帖数: 2,079
注册日期: ‎10-14-2014

回复: c8051f560单片机adc示例程序定时器装载值设置是不是出现了错误?

我同意你的发现,这个2400这里似乎没有意义,可能是在porting其他代码到F560的时候没有更改(可能其他MCU用的2.4参考),也许如你所说,没经过严格测试。

再次感谢你把这个问题提给我们。

WeiguoLu
发帖数: 11
注册日期: ‎03-20-2017

回复: c8051f560单片机adc示例程序定时器装载值设置是不是出现了错误?

非常感谢你的回答!您的回答解答了我这个初次接触学习单片机的人的很大困惑,而且对我后续要进行的关于adc的毕业设计工作帮助很大!

发帖数: 2,079
注册日期: ‎10-14-2014

回复: c8051f560单片机adc示例程序定时器装载值设置是不是出现了错误?

@kingweio

该问题已经在我们的内部代码库中fix了,可能下次release应该会包括这个fix。

谢谢你提出这个问题给我们。

WeiguoLu