首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Attiny13时钟频率与模数转换器

Attiny13时钟频率与模数转换器
EN

Stack Overflow用户
提问于 2016-03-17 13:19:42
回答 1查看 1.7K关注 0票数 0

我正在使用Attiny13 AVR,它是由arduino UNO在SPI上编程的。

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

代码语言:javascript
复制
#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寄存器设置为获得“无预标度”

代码语言:javascript
复制
TCCR0B |= _BV(CS00);
TCCR0B &= ~_BV(CS01);
TCCR0B &= ~_BV(CS02);

另外,通过改变TCCR0A寄存器,将PWM模式设置为“快速PWM”。

代码语言:javascript
复制
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位。

代码语言:javascript
复制
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。

代码语言:javascript
复制
ADCSRA != 1<< ADPS2;
ADCSRA != 1<< ADPS1;
ADCSRA != 1<< ADPS0;

这应该设置所有三位,并将ADC的频率保持在50 the 200 the之间。

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

我哪里错了?

EN

回答 1

Stack Overflow用户

发布于 2016-03-17 20:08:56

代码语言:javascript
复制
ADCSRA != 1<< ADPS2;
ADCSRA != 1<< ADPS1;
ADCSRA != 1<< ADPS0;

是三个无效的空语句。(它们每个返回一个布尔结果。)你是想写

代码语言:javascript
复制
ADCSRA |= 1<< ADPS2;
ADCSRA |= 1<< ADPS1;
ADCSRA |= 1<< ADPS0;

代码语言:javascript
复制
ADCSRA |= 1<< ADPS2 | 1<< ADPS1 | 1<< ADPS0;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36061755

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档