我正在使用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进行编程时,我选择“attanny13A独立9.6Mhz”作为目标板。
所以,我希望它能以9.6兆赫的速度运行。
我将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.5kHz的PWM频率。然而,当我连接输出的PWM到一个MOSFET驱动和LED条,我得到和听到的嗡嗡声从MOSFET。
这促使我认为,我的时钟不是以9.6兆赫运行,因为37.5Khz不是一个可听到的频率。
于是,我又做了一次关于时钟频率的快速搜索,找到了下面的网页;
https://www.avrprogrammers.com/howto/sysclk-prescaler
如果我没有弄错的话,这一页说我的时钟频率默认是8除以8。
为了不被除数,我需要重置所有的位。
我这样做了,并重新设置了所有CLKPS位。
CLKPR = (1<<CLKPCE);
CLKPR = (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);所以,理论上,我应该得到9.6Mhz时钟频率,除数为1。
当我使用这些设置时,我再也听不到嗡嗡的声音了。
然而,这一次又出现了另一个问题。
我用电位器来控制亮度。当将时钟除数设置为"1“时,电位器的行为发生了变化。当我转动电位器时,模拟输入不会马上读取一个值,所以我需要把它转多一点才能得到最小的亮度,在到达电位器的另一端之前达到最大亮度。因此,我相信艺发局有问题。
在模拟到数字转换器标题下,我发现了以下信息;
默认情况下,连续逼近电路需要输入时钟频率在50 kHz到200 kHz之间才能获得最大分辨率。如果需要小于10位的分辨率,则向模数转换器的输入时钟频率可大于200 kHz,以获得较高的采样率。
因此,我的时钟频率是9.6Mhz,我需要在9.6Mhz/20 the = 48和9.6Mhz/50 the= 192之间为ADCSRA寄存器设置一个预分频器。我选择了128的除法因子,这需要设置所有三位ADPS2、ADPS1和ADPS0。
ADCSRA != 1<< ADPS2;
ADCSRA != 1<< ADPS1;
ADCSRA != 1<< ADPS0;这应该设置所有三位,并将ADC的频率保持在50 the 200 the之间。
然而,我仍然从电位器中得到同样的行为。
我哪里错了?
发布于 2016-03-17 20:08:56
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;https://stackoverflow.com/questions/36061755
复制相似问题