Attiny13时钟频率和ADC

时间:2016-03-17 13:19:43

标签: microcontroller clock avr adc attiny

我正在使用Attiny13 AVR,由arduino UNO通过SPI编程。

我找到了attiny13的核心和boards.txt文件的内容如下;

#attiny13.name=Attiny13 @ 128 KHz (internal watchdog oscillator)

#attiny13.upload.using=arduino:arduinoisp
# attiny13.upload.protocol=avrispv2
# attiny2313at1.upload.using=pololu

#attiny13.upload.maximum_size=1024
#attiny13.upload.speed=250 # important for not losing connection to a slow processor

#attiny13.bootloader.low_fuses=0x7B
#attiny13.bootloader.high_fuses=0xFF

#attiny13.bootloader.unlock_bits=0x3F
#attiny13.bootloader.lock_bits=0x3F

#attiny13.build.mcu=attiny13
#attiny13.build.f_cpu=128000
#attiny13.build.core=core13
########################

attiny13e.name=Attiny 13A standalone 9.6Mhz
attiny13e.upload.using=arduino:arduinoisp
attiny13e.upload.maximum_size=1024
attiny13e.upload.speed=19200
attiny13e.maximum_data_size=64
attiny13e.bootloader.low_fuses=0x7A
attiny13e.bootloader.high_fuses=0xFF
attiny13e.bootloader.path=empty
attiny13e.bootloader.file=empty
attiny13e.bootloader.unlock_bits=0xFF
attiny13e.bootloader.lock_bits=0xFF
attiny13e.build.mcu=attiny13
attiny13e.upload.tool=avrdude
attiny13e.build.f_cpu=9600000L
attiny13e.build.core=core13

当我编写attiny13时,我选择了#34; Attiny 13A独立9.6Mhz"作为目标板。

所以,我希望它能以9.6Mhz运行。

我按如下方式设置TCCR0B寄存器以获得"无预分频"

TCCR0B |= _BV(CS00);
TCCR0B &= ~_BV(CS01);
TCCR0B &= ~_BV(CS02);

还将PWM模式设置为"快速PWM"通过更改TCCR0A寄存器。

TCCR0A |= _BV(WGM00);
TCCR0A |= _BV(WGM01);
TCCR0A &= ~_BV(WGM02);

通过这些设置,我应该得到9.6Mhz / 256 = 37.5 Khz的PWM频率。但是,当我将PWM的输出连接到用于驱动和LED条带的MOSFET时,我会从MOSFET发出嗡嗡声。

这促使我认为我的时钟没有以9.6Mhz运行,因为37.5Khz不是可听见的频率。

所以,我对时钟频率主题进行了另一次快速搜索,找到了以下网页;

https://www.avrprogrammers.com/howto/sysclk-prescaler

如果我没弄错,这个页面说我的时钟频率默认除以8。

为了不能得到除数,我需要重置所有位。

我这样做并重置了所有CLKPS位。

CLKPR = (1<<CLKPCE);
CLKPR = (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);

所以,从理论上讲,我应该得到9.6Mhz的时钟频率,除数为1.

当我使用上述所有设置时,我不再听到嗡嗡声。

然而,这次出现了另一个问题。

我使用电位计来控制亮度。将时钟分频器设置为&#34; 1&#34;时,电位器的行为发生了变化。当我转动电位器时,模拟输入不会立即读取值,因此我需要将其转动一点以获得最小亮度,并在达到电位计的另一端之前达到最大亮度。所以,我认为ADC存在问题。

在模数转换器标题下,我找到了以下信息;

  

默认情况下,逐次逼近电路需要输入   时钟频率在50 kHz和200 kHz之间,以获得最大分辨率。   如果需要低于10位的分辨率,则输入时钟   ADC的频率可高于200 kHz,以获得更高的样本   率。

因此,我的时钟频率为9.6Mhz,我需要为ADCSRA寄存器设置一个介于9.6Mhz / 20Khz = 48和9.6Mhz / 50Khz = 192之间的预分频器。 我选择了128的分频因子,这需要设置所有三个位ADPS2,ADPS1和ADPS0。

ADCSRA != 1<< ADPS2;
ADCSRA != 1<< ADPS1;
ADCSRA != 1<< ADPS0;

这应设置所有三位并保持ADC的频率在50Khz - 200Khz之间。

然而,我仍然从电位器得到相同的行为。

我哪里错了?

1 个答案:

答案 0 :(得分:2)

ADCSRA != 1<< ADPS2;
ADCSRA != 1<< ADPS1;
ADCSRA != 1<< ADPS0;

是三个无效的空语句。 (他们每个都返回一个布尔结果。)你的意思是写

ADCSRA |= 1<< ADPS2;
ADCSRA |= 1<< ADPS1;
ADCSRA |= 1<< ADPS0;

ADCSRA |= 1<< ADPS2 | 1<< ADPS1 | 1<< ADPS0;