2016-03-17 11 views
0

Я работаю с AVI Attiny13, который запрограммирован arduino UNO по SPI.Attiny13 Частота часов и АЦП

Я нашел ядро ​​для 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 13А автономный 9.6Mhz» в качестве целевой платы.

Итак, я ожидаю, что он будет работать при 9,6 МГц.

Я установил регистр TCCR0B следующим образом, чтобы получить «Нет» предварительное деление частоты

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

также установить режим ШИМ, как «Fast PWM» путем изменения регистра TCCR0A.

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

С этими настройками я должен получить частоту ШИМ 9.6Mhz/256 = 37,5 кГц. Однако, когда я подключаю выход PWM к MOSFET для управления и светодиодной полосы, я получаю и слышу жужжание из MOSFET.

Это побуждает меня думать, что мои часы не работают на частоте 9,6 МГц, поскольку 37,5 Гц не является слышимой частотой.

Итак, я сделал еще один быстрый поиск по теме тактовой частоты и нашел следующую веб-страницу;

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 что-то не так.

Под заголовком Analog to Digital Converter я нашел следующую информацию;

По умолчанию, последовательное приближение схема требует частоту входного тактового между 50 кГц и 200 кГц, чтобы получить максимальное разрешение. Если требуется меньшее разрешение, чем 10 бит, частота входного тактового сигнала для АЦП может быть выше 200 кГц, чтобы получить более высокий показатель .

Итак, мои часы частота 9.6Mhz и мне нужно установить делитель между 9.6Mhz/20Khz = 48 и 9.6Mhz/50кГц = 192 для регистра ADCSRA. Я выбрал коэффициент деления 128, который требует установки всех трех бит ADPS2, ADPS1 и ADPS0.

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

Это должно установить все три бита и держать частоту АЦП между 50кГц - 200Khz.

Тем не менее, я по-прежнему получаю такое же поведение от потенциометра.

Где я ошибаюсь?

+0

Вчера я работал на установке немного больше, и я понял, что проблема может быть связана с рабочим циклом I Я пишу в PWM. Когда я пишу, например, значение «5» в PWM командой analogWrite (output, 5), светодиоды вообще не светятся. Точно так же я достигаю максимальной яркости, например, около значения «200». Итак, я, вероятно, правильно читаю банк, в то время как PWM имеет какой-то диапазон из-за изменения тактовой частоты. Эти значения не являются точными значениями, я приводил примеры только для объяснения случая. Итак, любые идеи, что может быть неправильным с PWM? – user1449456

ответ

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

- это три пустых заявления, которые не имеют никакого эффекта. (Каждый из них Retrun логического результата.) Возможно, вы имели в виду, чтобы написать

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

или

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

Да, я имел в виду вторую, извините. – user1449456

 Смежные вопросы

  • Нет связанных вопросов^_^