R1 PLL » History » Version 3
krufter_multiclet, 08/31/2015 04:40 PM
| 1 | 1 | krufter_multiclet | h1. PLL и система тактирования R1 |
|---|---|---|---|
| 2 | 1 | krufter_multiclet | |
| 3 | 1 | krufter_multiclet | В составе микропроцессора имеется встроенный генератор для формирования системного сигнала тактирования. |
| 4 | 1 | krufter_multiclet | Генератор формирует стабильный тактовый сигнал в диапазоне частот от 20 МГц до 300 МГц. |
| 5 | 1 | krufter_multiclet | Синтезатор основан на схеме ФАПЧ с целочисленными коэффициентами деления синтезируемой частоты. |
| 6 | 3 | krufter_multiclet | Частота опорного сигнала от 8 до 16 МГц. |
| 7 | 1 | krufter_multiclet | |
| 8 | 1 | krufter_multiclet | Возможна работа без задействования встроенного генератора, используя источник внешнего опорного сигнала тактирования. |
| 9 | 1 | krufter_multiclet | В качестве источника может быть выбран генератор или кварцевый резонатор. |
| 10 | 1 | krufter_multiclet | |
| 11 | 1 | krufter_multiclet | Для часов реального времени сделан дополнительный частотный домен на 32 КГц. |
| 12 | 1 | krufter_multiclet | Хотя блок RTC может работать от внутренней тактовой частоты процессора. |
| 13 | 1 | krufter_multiclet | !tact_sys.jpg! |
| 14 | 1 | krufter_multiclet | |
| 15 | 1 | krufter_multiclet | *Рассмотрим основные регистры и параметры:* |
| 16 | 1 | krufter_multiclet | |
| 17 | 1 | krufter_multiclet | Для управления блоком PLL используются следующие системные регистры: |
| 18 | 1 | krufter_multiclet | * PLLCR (регистр управления) |
| 19 | 1 | krufter_multiclet | * PLLSTR (регистр состояния) |
| 20 | 1 | krufter_multiclet | * PLLMCR (регистр управления модулем коммутации) |
| 21 | 1 | krufter_multiclet | |
| 22 | 1 | krufter_multiclet | Вся настройка PLL сводится к выбору трёх коэффициентов: |
| 23 | 1 | krufter_multiclet | * R (коэффициент деления опорной частоты) - биты RCNT регистра PLLCR |
| 24 | 1 | krufter_multiclet | * N (коэффициент деления внутреннего генератора) - биты NCNT регистра PLLCR |
| 25 | 1 | krufter_multiclet | * K (коэффициент деления выходного делителя) - биты MXVCO регистра PLLCR |
| 26 | 1 | krufter_multiclet | |
| 27 | 1 | krufter_multiclet | При выборе коэффициентов необходимо, чтобы они соответствовали условиям работоспособности блока. |
| 28 | 1 | krufter_multiclet | 1) 1 МГц < Fcmp < 16 МГц |
| 29 | 1 | krufter_multiclet | 2) 20 МГц < Fvco < 340 МГц |
| 30 | 1 | krufter_multiclet | |
| 31 | 1 | krufter_multiclet | Fcmp = (1/R)*Fref |
| 32 | 1 | krufter_multiclet | Fvco = N*(1/R)*Fref |
| 33 | 1 | krufter_multiclet | Fout = (1/K)*Fvco |
| 34 | 1 | krufter_multiclet | |
| 35 | 1 | krufter_multiclet | Выходная частота рассчитывается по следующей формуле: Fout = Fref*N*(1/R)*(1/K) |
| 36 | 1 | krufter_multiclet | Где Fref - опорная частота (на текущей отладочной плате компании LDM-Systems 8 МГц) |
| 37 | 1 | krufter_multiclet | Fcmp - частота сравнения на входе фазо-частотного детектора |
| 38 | 1 | krufter_multiclet | Fvco - частота внутреннего генератора, управляемого напряжением (ГУН) |
| 39 | 1 | krufter_multiclet | Fout - выходная частота |
| 40 | 1 | krufter_multiclet | |
| 41 | 1 | krufter_multiclet | *Порядок работы с блоком PLL:* |
| 42 | 1 | krufter_multiclet | _Включение после сброса или подачи питания_: |
| 43 | 1 | krufter_multiclet | # Установить биты PLLCR (NCNT) и PLLCR (RCNT) в нужное значение |
| 44 | 1 | krufter_multiclet | # Установить бит PLLCR (EN) в "1" |
| 45 | 1 | krufter_multiclet | # Дождаться установки бита PLLSTR (LOCK) в "1" |
| 46 | 1 | krufter_multiclet | # Переключиться на нужную частоту установкой битов PLLCR (MXVCO) |
| 47 | 1 | krufter_multiclet | |
| 48 | 1 | krufter_multiclet | _Смена частоты:_ |
| 49 | 1 | krufter_multiclet | # Установить третий бит MXVCO, т.е. PLLCR [11] в "0" , чтобы переключиться на Fref |
| 50 | 1 | krufter_multiclet | # Изменить биты PLLCR (NCNT) и PLLCR (RCNT) |
| 51 | 1 | krufter_multiclet | # Установить третий бит MXVCO, т.е. PLLCR [11] в "1" , чтобы переключиться на новую частоту |
| 52 | 1 | krufter_multiclet | |
| 53 | 1 | krufter_multiclet | _Выключение блока:_ |
| 54 | 1 | krufter_multiclet | # Установить третий бит MXVCO, т.е. PLLCR [11] в "0" , чтобы переключиться на Fref |
| 55 | 1 | krufter_multiclet | # Дождаться установки бита PLLSTR (REFACTIVE) в "1" |
| 56 | 1 | krufter_multiclet | # Установить бит PLLCR (EN) в "0" |
| 57 | 1 | krufter_multiclet | |
| 58 | 1 | krufter_multiclet | Примечание: Вместо действия [Дождаться установки бита PLLSTR (LOCK) в "1"] |
| 59 | 1 | krufter_multiclet | можно подождать 1 миллисекунду. |
| 60 | 1 | krufter_multiclet | |
| 61 | 1 | krufter_multiclet | *Рассмотрим пример:* |
| 62 | 1 | krufter_multiclet | |
| 63 | 1 | krufter_multiclet | Опорная частота 8 МГц. Требуется выходная частота 30 МГц. |
| 64 | 1 | krufter_multiclet | 1)Пусть R = 2, K = 4.По формуле для расчёта Fout находим, что N = 30. |
| 65 | 1 | krufter_multiclet | Тогда на основании пункта "6.0.3 Таблицы выбора коэффициентов R, N, K" Руководства по эксплуатации R1 |
| 66 | 1 | krufter_multiclet | находим значения битов RCNT и NCNT: |
| 67 | 1 | krufter_multiclet | RCNT = 100 (бинарный формат) |
| 68 | 1 | krufter_multiclet | NCNT = 11010 (бинарный формат) |
| 69 | 1 | krufter_multiclet | Выставляем 15-бит разрешения работы (En) регистра PLLCR. |
| 70 | 1 | krufter_multiclet | В итоге получаем значение 0xC01A. |
| 71 | 1 | krufter_multiclet | 2)Ожидаем установки бита Lock в регистре PLLSTR |
| 72 | 1 | krufter_multiclet | 3)На основании пункта "6.0.3 Таблицы выбора коэффициентов R, N, K" Руководства по эксплуатации R1 |
| 73 | 1 | krufter_multiclet | находим значения битов MXVCO: |
| 74 | 1 | krufter_multiclet | MXVCO = 1101 (бинарный формат) |
| 75 | 1 | krufter_multiclet | Получаем значение регистра PLLCR = 0xCD1A. |
| 76 | 1 | krufter_multiclet | 4)Проверяем условия: |
| 77 | 1 | krufter_multiclet | а) 1 МГц < Fcmp = 4 < 16 МГц, верно |
| 78 | 1 | krufter_multiclet | б) 20 МГц < Fvco = 120 < 340 МГц, верно |
| 79 | 1 | krufter_multiclet | |
| 80 | 2 | krufter_multiclet | Полный пример перехода на частоту в 30 МГц на ассемблере: |
| 81 | 1 | krufter_multiclet | <pre> |
| 82 | 2 | krufter_multiclet | <code class="php"> |
| 83 | 1 | krufter_multiclet | ;переход на частоту 30МГц |
| 84 | 1 | krufter_multiclet | pll_30: |
| 85 | 1 | krufter_multiclet | getl 0xC01A |
| 86 | 1 | krufter_multiclet | setl #PLLCR, @1 |
| 87 | 1 | krufter_multiclet | jmp pll_30_lock |
| 88 | 1 | krufter_multiclet | complete |
| 89 | 1 | krufter_multiclet | |
| 90 | 1 | krufter_multiclet | pll_30_lock: |
| 91 | 1 | krufter_multiclet | getl #PLLSTR |
| 92 | 1 | krufter_multiclet | getl 1 |
| 93 | 1 | krufter_multiclet | and @1, @2 |
| 94 | 1 | krufter_multiclet | je @1, pll_30_lock |
| 95 | 1 | krufter_multiclet | jne @2, pll_30_set |
| 96 | 1 | krufter_multiclet | complete |
| 97 | 1 | krufter_multiclet | |
| 98 | 1 | krufter_multiclet | pll_30_set: |
| 99 | 1 | krufter_multiclet | getl 0xCD1A |
| 100 | 1 | krufter_multiclet | setl #PLLCR, @1 |
| 101 | 1 | krufter_multiclet | jmp pre_reconf |
| 102 | 1 | krufter_multiclet | complete |
| 103 | 2 | krufter_multiclet | </code> |
| 104 | 2 | krufter_multiclet | </pre> |
| 105 | 2 | krufter_multiclet | |
| 106 | 2 | krufter_multiclet | Этот же пример на Си: |
| 107 | 2 | krufter_multiclet | <pre> |
| 108 | 2 | krufter_multiclet | <code class="c"> |
| 109 | 2 | krufter_multiclet | void asm_set_PLL(unsigned char RCNT, unsigned char NCNT, unsigned char MXVCO, unsigned char Enable); |
| 110 | 2 | krufter_multiclet | |
| 111 | 2 | krufter_multiclet | main() |
| 112 | 2 | krufter_multiclet | { |
| 113 | 2 | krufter_multiclet | //переход на частоту 30МГц |
| 114 | 2 | krufter_multiclet | asm_set_PLL(0x4, 0x1A, 0xD, 1); |
| 115 | 2 | krufter_multiclet | } |
| 116 | 1 | krufter_multiclet | </code> |
| 117 | 1 | krufter_multiclet | </pre> |