Я использую ATxmega64A3U, подключил внешний кварц 4 МГц и два конденсатора нагрузки 18 пФ . Я использую модуль ASF для настройки часов, однако при запуске я вижу, что код зависает в следующем месте:
static inline void osc_wait_ready(uint8_t id)
{
while (!osc_is_ready(id)) {
/* Do nothing */
}
}
В то время как ждет, пока источник синхронизации стабилизируется, но этого никогда не происходит. У кого-нибудь есть предложения, почему это может быть?
Код, который я разместил выше, взят из ASF, чтобы убедиться, что я знаю, что я выполняю, я написал следующий код и мог видеть, что код застревает в цикле while, который ожидает стабилизации осциллятора.
OSC_CTRL |= OSC_XOSCEN_bm;
while(!(OSC_STATUS & OSC_XOSCRDY_bm));
CCP = CCP_IOREG_gc;
CLK_CTRL = (CLK_CTRL & ~CLK_SCLKSEL_gm) | CLK_SCLKSEL_XOSC_gc;
OSC_CTRL &= ~OSC_RC2MEN_bm;
Я включаю внешний генератор, жду его стабилизации, отключаю блокировку регистра, переключаюсь на внешний генератор, отключаю внутренний 2МГц генератор.
Обратите внимание, что указанная в техническом описании емкость нагрузки 18 пФ не означает установку на плате двух конденсаторов по 18 пФ.
Это общая емкость, которую кристалл должен «видеть». Предполагая, что паразитная емкость 5 пФ, вы бы имели
Cl = (18 пФ * 18 пФ)/(36 пФ) + 5 пФ = 14 пФ
Вы можете попробовать что-то вроде 24 пФ для нагрузочных конденсаторов.
Кроме того, ESR кристалла вы выбираете довольно высоким. Это может стать проблемой, если схема генератора не может адекватно управлять кристаллом.
Кварц с более высокой частотой, как правило, имеет более низкое ESR, поэтому попробуйте кварц с частотой 8 или 16 МГц из этой серии.
Поместите датчик области, изолированный долларовой купюрой (толщина 3 мила или 1/11 мм), напротив выходного узла генератора (самое большое, но искаженное напряжение). Это реализует осциллограф делителя напряжения с небольшим дополнительным C на конденсаторах XTAL + PI, поэтому любая амплитуда должна быть неизменной. Емкость через бумагу банкноты
Если ваш пробник осциллографа в режиме 10X имеет емкость 13 пФ, у вас есть делитель 50:1.
Поставьте осциллограф на 20 мВ/дел, и ваша реальная чувствительность составит 1 вольт/дел. Только с нагрузкой 0,26 пФ на генератор.
Осмотрите два контакта XTAL. Найти здоровые сигналы 1vpp, 2vpp, 3vpp? на частоте 4000 МГц?
Ради интереса проверьте другие осцилляторы MCU на предмет амплитуды, греховности и искажений?
Баркгаузен дает нам 2 требования для успешной генерации:
(1) коэффициент усиления по напряжению > 1
(2) ТОЧНО ------- точно ------- фазовый сдвиг N*360 градусов.
Некоторые кварцевые генераторы достигают ТОЧНО N * 360 градусов с некоторым сопротивлением от контакта Vout до конденсатора PI_network. Попробуйте 100 Ом или 1000 Ом.
Так что проблема оказалась в софте! Оказалось, что также необходимо установить количество циклов, которое AVR ожидает, пока генератор не станет стабильным. Я не устанавливал это, что, очевидно, вызвало какие-то проблемы. Вот обновленный код, который ожидает 16 тысяч циклов, потому что мне не нужно быстрое пробуждение, а это около 4 мс.
OSC_XOSCCTRL = ((OSC_XOSCCTRL & ~OSC_FRQRANGE_gm) | OSC_FRQRANGE_2TO9_gc) |
((OSC_XOSCCTRL & ~OSC_XOSCSEL_gm) | OSC_XOSCSEL3_bm | OSC_XOSCSEL1_bm | OSC_XOSCSEL0_bm);
OSC_CTRL |= OSC_XOSCEN_bm;
while(!(OSC_STATUS & OSC_XOSCRDY_bm));
CCP = CCP_IOREG_gc;
CLK_CTRL = (CLK_CTRL & ~CLK_SCLKSEL_gm) | CLK_SCLKSEL_XOSC_gc;
OSC_CTRL &= ~OSC_RC2MEN_bm;
Кевин Уайт
пользователь34920
Преподобный
пользователь34920