我正在使用由 arduino UNO 通过 SPI 编程的 Attiny13 AVR。
我找到了 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 进行编程时,我选择“Attiny 13A Standalone 9.6Mhz”作为目标板。
所以,我希望它以 9.6Mhz 运行。
我将 TCCR0B 寄存器设置如下以获得“无预分频”
TCCR0B |= _BV(CS00);
TCCR0B &= ~_BV(CS01);
TCCR0B &= ~_BV(CS02);
还可以通过更改 TCCR0A 寄存器将 PWM 模式设置为“快速 PWM”。
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。
当我使用所有上述设置时,我不再听到嗡嗡声。
然而,这一次又出现了一个问题。
我使用电位器来控制亮度。将时钟除数设置为“1”时,电位器的行为发生了变化。当我转动电位器时,模拟输入没有立即读取值,所以我需要再转动一点以获得最小亮度,并在我到达电位器的另一端之前达到最大亮度。所以,我认为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 之间。
但是,我仍然从电位器中得到相同的行为。
我哪里错了?