Что такое clk в микроконтроллерах
Перейти к содержимому

Что такое clk в микроконтроллерах

Микроконтроллеры STM8. Система тактирования.

Здравствуйте,
В прошлый раз мы начали рассматривать таймеры, а сегодня мы с вами разберемся, как устроена система тактирования в STM8S.
По сравнению с AVR, STM8 сильно выигрывает в мощности и гибкости тактирования. Единственный минус – это невозможность тактироваться от кварцев с частотой меньше 1 МГц, но это компенсируется наличием внутреннего низкочастотного генератора. Самым же главным преимуществом STM8 перед AVR является отсутствие FUSE-битов! Все параметры тактирования настраиваются непосредственно по ходу работы программы.
Итак, источниками тактовой частоты у нас могут быть:
— внешний кварцевый резонатор с частотой 1-24МГц (HSEHigh Speed External);
— внешний источник частоты 1-24МГц (HSE-extHigh Speed External);
— внутренний высокоскоростной RC-генератор 16 МГц (HSIHigh Speed Internal);
— внутренний низкоскоростной RC-генератор 128 КГц (LSILow Speed Internal).
Вот так выглядит блок-схема модуля тактирования:
Clock tree
На схеме мы видим, что выбор основной частоты происходит в модуле Master Clock Switch. После него она поступает на периферийные устройства (таймера, SPI, и.т.д.) и через делитель в ЦПУ. При включении основным источником тактовой частоты является HSI с делителем 8, что дает нам рабочую частоту после подачи питании в 16/8=2 МГц. Логично, что при включении процессор начинает работать он внутреннего генератора – ведь внешнего может и не быть. Понижение частоты сделано для того, чтобы процессор мог стартовать при плохом состоянии питания.
Низкоскоростной генератор может как тактировать ЦПУ, так и работать независимо от основных источников тактирования, управляя независимым сторожевым таймером (IWD) и модулем выхода из спящего режима.
Модуль системы тактирования может вызывать два прерывания – по переключению источника тактирования (Master clock source switch event), и по срабатыванию системы обеспечения безопасности тактирования (Clock Security System event).
Сигнал от любого из источников тактирования, независимо от того, является он активным в данный момент, или нет, может быть выведен наружу контроллера на ножку CCO.
Переключить источник тактирования можно вручную или автоматически. О способах переключения можно прочитать в Reference Manual на странице 64. Я произвожу переключение так:
1. Записываем в регистр CLK_SWR значение, соответствующее необходимому источнику тактовой частоты.
2. Ждем стабилизации источника частоты, контролируя бит SWIF в регистре CLK_SWCR.
3. Разрешаем переключение источника установкой бита SWEN в регистре CLK_SWCR.
4. Записываем в регистр CLK_SWR значение, соответствующее необходимому источнику тактовой частоты. При этом устанавливается бит SWBSY в регистре CLK_SWCR и соответствующий источник тактирования запускается. В этот момент микроконтроллер все ещё тактируется от старого источника. После того, как частота стабилизируется, значение из регистра CLK_SWR копируется в CLK_CMSR и происходит переключение источника тактирования.
5. Ждем установки флага SWIF в регистре CLK_SWCR. После его установки вызывается прерывание, если оно разрешено битом SWIEN.

  • 0xE1: текущий источник тактирования – HSI (значение после сброса);
  • 0xD2: источник тактирования – LSI;
  • 0xB4: источник тактирования – HSE.
  • 00 – делитель равен 1 (частота не делится);
  • 01 — делитель равен 2;
  • 10 — делитель равен 4;
  • 11 – делитель равен 8.
  • 000 — fCPU=fMASTER
  • 001 — fCPU=fMASTER/2
  • 010 — fCPU=fMASTER/4
  • 011 — fCPU=fMASTER/8
  • 100 — fCPU=fMASTER/16
  • 101 — fCPU=fMASTER/32
  • 110 — fCPU=fMASTER/64
  • 111 — fCPU=fMASTER/128

Самое время потренироваться на кошках. На плате STM8S – Discovery установлен кварц на 16 МГц, его и будем использовать. Изменим программу из предыдущей статьи про таймеры: добавим в нее переключение тактирования на кварц. При этом увеличим предделитель Таймера1, чтобы видеть переключение светодиода, так как частота тактирования таймера увеличится с 2 МГц (значение по умолчанию) до 16 МГц, и мигание светодиода будет незаметно глазу.

У STM8 есть такой замечательный модуль, как CSS (Clock Security System). Он следит за работой кварцевого генератора, и может, в случае выхода его из строя, переключить тактирование на внутренний генератор. При этом делитель входной частоты устанавливается равным 8, что соответствует 2 МГц. Также, в момент переключения устанавливается флаг CSSD (Clock security system detection) в регистре CLK_CSSR и вызывается прерывание по срабатыванию системы обеспечения безопасности тактирования (Clock security system detection interrupt), если оно разрешено флагом CSSDIE (Clock security system detection interrupt enable).
Включается этот модуль установкой бита CSSEN (Clock security system enable) в регистре CSSR. Отредактируем нашу программу так, чтобы она, в случае выхода кварца из строя, автоматически переключалась на HSI, вызывала прерывание и выполняла некие действия.
И здесь я столкнулся с ошибкой в среде программирования. Напомню, я использую IAR Embedded Workbench for STMicroelectronics STM8, версию 1.20. В заголовочном файле iostm8s105s6.h, который я использую, есть такое описание регистра CLK_CSSR:

Смотрим в Reference manual на странице 77 описание этого регистра и удивляемся: биты CSSD и CSSDIE перепутаны местами!
Исправим содержимое этого файла.

И исправим маски чуть ниже.

В общем для всего семейства хидере iostm8.h эта ошибка присутствует тоже. В хидерах для остальных процессоров я не смотрел, но подозреваю, что там присутствует такая же ошибка.
Кроме того, в iostm8s105s6.h отсутствуют номера векторов прерывания для системы тактирования. Возьмем их из iostm8.h и вставим в конец нашего хидера. Выглядят они так:

И с уже поправленным заголовочным файлом напишем нашу программу.

И небольшое видео с демонстрацией работы программы. Для того, чтобы заставить сбоить кварц, я касаюсь обеих его ножек пальцем. Можно также коротить ножки кварца резистором Ом на сто. При сбое кварца видно, что частота мигания диода уменьшается, так как частота тактирования таймера падает с 16 МГц при работе от HSE до 2 МГц при переключении на HSI/8.

На сегодня все, а в следующий раз мы продолжим разбираться с таймерами.

    , , , ,
  • +6
  • 26 марта 2011, 13:32

Комментарии ( 15 )

Блин, не понимаю:
>>Он следит за работой кварцевого генератора, и может, в случае выхода его из строя, переключить тактирование на внутренний генератор. При этом делитель входной частоты устанавливается равным 8, что соответствует 2 МГц.

Как сделать так, что бы он и внутренний после обнаружения неисправности внешнего выставлял в 16Мгц? Ведь вся переферия же тогда, при падении частоты в 8 раз, падает. Я ж конфигурировал её на 16Мгц.

Что такое clk в микроконтроллерах

Систему тактирования я уже бегло рассматривал в случае использования SPL. Стандартная периферийная библиотека, на мой взгляд, предлагается фирмой STM в качестве инструмента для быстрого освоения семейства микроконтроллеров STM8, программистами ранее не работавшими с ними. Сейчас я считаю, что она совершенно лишняя. Хотя, в примерах я использую именованные константы взятые из заголовочных файлов SPL.

Документация которая понадобится для прочтения статьи: Reference Manual STM8S — RM0016, глава 9. В качестве целевого микроконтроллера я буду использовать 20-пиновый STM8S103F3P6.

    Содержание:
  1. Система тактирования STM8S, ключевые особенности;
  2. Подключение и отключение периферии к шинам тактирования. Регистры CLK_ICKR, CLK_PCKENR1 и CLK_PCKENR2;
  3. Внутренний высокочастотный генератор HSI. Регистр CLK_CKDIVR;
  4. Подключение внешнего кварца к HSE генератору тактовой частоты. Регистры CLK_ECKR, CLK_CMSR, CLK_SWR и CLK_SWCR;
  5. Модуль безопасности системы тактирования CSS. Регистр CLK_CSSR;
  6. Тактирование микроконтроллера от низкочастотного внутреннего генератора LSI;
  7. Тактирование микроконтроллера от внешнего часового генератора DS3231;

Скачать полные исходники со сборочными файлам и скомпилированными прошивками, можно по ссылке в конце статьи.

1. Система тактирования STM8S, ключевые особенности

Система тактирования микроконтроллеров STM8S представлена на следующей картинке:

    Особенности системы тактирования микроконтроллеров STM8S:
  1. В системе имеется два тактовых генератора, высокочастотный и низкочастотный.
  2. Внутренний низкочастотный генератор — LSI, работает на частоте 128 кГц, и имеет погрешность ±12%. Сторожевой таймер и система автопробуждения тактируется только от него.
  3. В случае AWU — системы автопробуждения, через параметр Option Bytes — CKAWUSEL, возможно назначить внешний источник тактового сигнала HSE с предделителем в качестве источника тактирования AWU.
  4. В роли высокочастотного генератора могут выступать: а) внутренний генератор — HSI работающий на частоте 16 МГц и имеющий предделитель на 1, 2, 4, 8; б) внешний генератор с частотой до 24 МГц для stm8s2xx серии и до 16 МГц для чипов stm8s1xx серии; в) внутренний генератор работающий от внешнего кварца на частотах 1-24(16 для stm8s1xx) МГц.
  5. Система тактирования имеет модуль безопасности CSS которая может отслеживать работу внешнего генератора или кварца и в случае неисправности оных, переключить микроконтроллер на работу от внутреннего генератора с предделителем равным 8, т.е. на частоту 2 МГц.
  6. Все тактовые генераторы могут включаться и отключаться.
  7. Все периферия при старте микроконтроллера, по умолчанию находится в включенном состоянии. Она может быть отключена через регистры CLK_PCKENR1 и CLK_PCKENR2.
  8. Микроконтроллер может подать тактовый сигнал на выход CCO.

Регистры отвечающие из систему тактирования и их значения по умолчанию представлены на следующей таблице:

Дефолтные настройки системы тактирования можно изменять через Options Bytes. Они разные для различных серий STM8S. В случае STM8S103 они выглядят так:

2. Подключение и отключение периферии к шинам тактирования. Регистры CLK_ICKR, CLK_PCKENR1 и CLK_PCKENR2

Начнем с простого. В качестве шаблонного проекта возьмем Blink на таймере TIM4 из предыдущей статьи.

В главной функции main() заменим строки:

на вызов функции следующего содержания:

С этой функцией и будем в дальнейшем работать.

За подключение периферии к шине тактирования отвечают два регистра: CLK_PCKENR1 и CLK_PCKENR2

Т.к. в программе из периферии используется лишь таймер TIM4, в функцию clk_setup() следует добавить строки:

Внутренними генераторам HSI и LSI управляет регистр CLK_ICKR:

В установках по умолчанию для этого регистра, низкочастотный LSI — генератор выключен, а высокочастотный HSI генератор включен. Это установки полностью соответствуют нашим запросам и регистр CLK_ICKR пока можно не трогать.

3. Внутренний высокочастотный генератор HSI. Регистр CLK_CKDIVR

Чип STM8S после включения питания стартует с внутренним 16 МГц генератором тактового сигнала HSI. Выход частоты с него можно менять установкой предделителя fHSI равному 1, 2, 4, или 8. По умолчанию применяется предделитель равный 8.

Частотой процессора можно управлять с помощью предделителя fCPU. По умолчанию он равен 1.

Предделители fHSI и fCPU устанавливаются через регистр CLK_CKDIVR:

Если записать в регистр значение CLK_PRESCALER_HSIDIV1, т.е. ноль, т.о. микроконтроллер будет работать на частоте 16 МГц. Светодиод при этом будет мигать с полупериодом в 1 секунду. Однако если понизить частоту процессора до 1 МГц командой:

то светодиод все-равно будет мигать с полупериодом в 1 секунду. Почему? Т.к. задержка формируется через таймер, и если посмотреть на схему тактирования:

то видно, что предделитель fCPU никак на периферию не влияет. Он влияет только на частоту процессора. Если вместо задержки на таймере и использовать задержку на счетчике, например из примера предыдущей статьи: Передача параметров из Си в ассемблерную функцию, то она уже будет работать должным образом.

4. Подключение внешнего кварца к HSE генератору тактовой частоты. Регистры CLK_ECKR, CLK_CMSR, CLK_SWR и CLK_SWCR

При подключении внешнего кварца, генератору HSE требуется некоторое время для стабилизации частоты. По умолчанию, это время равно 2048 тактам. Это значение можно менять через параметр Option Bytes — HSECNT.

В связи с этим, существует два варианта переключения на HSE: автоматический и ручной.

Автоматический вариант предполагает минимум действий со стороны программиста. Требуется всего пара команд, чтобы указать новый источник тактового сигнала и дать команду коммутатору на переключение на него. Далее микроконтроллер все сделает сам. Он включит генератор HSE, дождется его стабилизации, и после автоматически переключится на него. Пользовательская программа при этом не ждет переключения, она занимается своими делами.

Блок-схема алгоритма представлена на картинке ниже:

Пример программы с реализацией такого алгоритма у меня получился таким:

Здесь таймер настроен на мигание светодиода с полупериодом в 1 секунду, при частоте генератора 2 МГц. Если поставить кварц с другой частотой, то частота мигания светодиода тоже измениться. Ну и конечно же, при «горячем» вынимание кварца, скажем, из беспаячной макетки мигание светодиода остановится.

Для переключения генератора тактового сигнала используется управляющий регистр коммутатора:

Для указания целевого генератора используется регистр CLK_SWR:

После переключения генератора, содержимое регистра CLK_SWR копируется в CLK_CMSR:

Программу можно модифицировать с использованием прерывания для отключения внутреннего генератора HSI:

Если когда-либо потребуется отключить HSE, например после обратного переключения на HSI, тогда следует воспользоваться регистром CLK_ECKR:

Алгоритм для ручного переключения генератора представлен на блок-схеме ниже:

Реализация этого алгоритма у меня получилась такой:

5. Модуль безопасности системы тактирования CSS. Регистр CLK_CSSR

Модуль безопасности системы тактирования CSS позволяет отслеживать работу генератора HSE и при неполадках с его стороны, автоматически переключать такирование на внутренний генератор HSI. При этом для HSI устанавливается предделитель равный 8, генератор HSE отключается, выставляются служебные флаги.

CSS конфигурируется через регистр CLK_CSSR:

Простейший случай использования CSS добавляет всего две строчки к предыдущему примеру:

Обращаю внимание, что перед включением CSS нужно дождаться переключения на HSE.

Можно использовать прерывание чтобы установить свой предделитель HSI при срабатывании CSS. Т.к. прерывание у системы тактирования одно на всех, нужно либо конфигурировать его на какое-то одно событие, либо парсить флаги при входе в обработчик прерывания.

6. Тактирование микроконтроллера от низкочастотного внутреннего генератора LSI

Еще одним интересным вариантом является возможность тактировать микроконтроллер от 128 кГц низкочастотного внутреннего генератора LSI. Генератор имеет погрешность ±12%, так что использование протоколов с четкими временным границами может быть затруднено. С помощью предделителя CPUDIV возможно снижать частоту CPU вплоть до 1 кГц.

Для того что бы задействовать LSI в качестве главного генератора тактовой частоты, необходимо будет выставить в Option Bytes флаг LSI_EN:

Пример Blink’a с полупериодом 1 сек. на генераторе LSI:

7. Тактирование микроконтроллера от внешнего часового генератора DS3231

Кроме внешнего кварца, номинал которого не может быть меньше 1МГц, микроконтроллер STM8S можно тактировать от внешнего генератора тактовой частоты, который лишен этого ограничения. Для подключения используется пин OSCIN, при этом пин OSCOUT остается свободным как GPIO, и может использоваться для других нужд.

Что бы включить поддержку внешнего генератора, в Options Bytes нужно будет выставить флаг EXTCLK:

Генератора у меня под рукой не было, зато был DS3231, у которого имеется пин с меандром на выходе и частотой 32 кГц. Причем это высокоточный тактовый сигнал, в отличии от LSI.

Ну и опять снова Blink уже с тактированием от DS3231:

Заключение. Остался не рассмотренным выход тактовой частоты CCO, я не смог придумать примера его использования кроме синхронизации нескольких микроконтроллеров. Еще я не затронул регулятор напряжения MVR, отключение которого позволяет повысить энергосбережение. Но S-серию я не рассматриваю как энергосберегающую. Все остальное вроде рассмотрел.

Скачать полные исходники со сборочными файлам и скомпилированными прошивками, можно по ссылке .

Переходим с STM32 на российский микроконтроллер К1986ВЕ92QI. Настройка тактовой частоты

В прошлой статье мы научились создавать стабильные задержки с помощью простого таймера SysTick, а так же немного окунулись в механизм работы прерываний. Тогда мы принимали как постулат то, что тактируя таймер от источника HCLK – мы получаем 8 Мгц. Теперь настало время разобраться, откуда эти цифры.

Открыв документация и сделав переход к «Сигналы тактовой частоты MDR_RST_CLK» мы можем увидеть такую таблицу.

Теперь нам нужно понять, как переключить контроллер с тактирования от HSI на HSE. Еще раз взглянем на блок схему. Красным цветом я обозначил логическое представление того, как будет проходить сигнал от внешнего кварцевого резонатора до линии тактирования ядра и HCLK.

Настройка регистров тактирования.

Теперь, когда мы имеем образное представление того, как «движется» тактирование, пора разобраться с регистрами тактирования. На схеме рядом с каждым блоком указаны биты определенных регистров, меняя которые можно менять «движение» и частоту тактирования. Данные биты находятся в регистре MDR_RST_CLK->CPU_CLOCK. Красным я обозначил те биты, которые нужно будет изменить. Синие же можно оставить так, как есть. Они уже установлены в правильном положении.

Далее нам нужно написать define-ы тех бит, значения которых мы будем менять.

Так как все остальные биты равны нулю, то мы можем писать в регистр напрямую, не боясь стереть старые данные. В итоге выходит следующее.

Казалось бы все. Но если мы зашьем это, то получим вот это.

С последующей невозможностью отладки. Я сразу же полез в документацию с описаниями ошибок. Но такой там не было. Как оказалось, я упустил одну важную специфическую деталь. В описании HSE было сказано:

Заглянем в этот регистр.

Пропишем еще 1 define и включим бит разрешения.

После всех дополнений функция имела следующий вид.

Первый «костыль».

В тот момент, когда я искал ошибку запуска HSE в перечне ошибок, я наткнулся на следующий глюк.

Я не мог не запомнить его, так как планировал сразу же после включение тактирования от внешнего кварцевого резонатора выключить внутренний генератор. Данная ошибка присутствует во всех ревизиях микроконтроллера. Так что для нее придется лепить костыль. Скажу сразу. В моем случае мне так и не удалось отключить HSI. Несмотря на то, что я делал все так, как сказано в рекомендациях.
Изучим проблему и пути «решения» поподробнее.

Вот тот упомянутые регистры.

Пропишем define для нужных бит, а так же для тактирования RTC.

А теперь сделаем попытку осуществить это на практике.

Отслеживаем выполнения программы. Это состояние регистров до попытки сбросить бит.

По началу я подумал, что ошибся со смещением и просо не включил бит ALRF, но потом нажал на него в меню справа (прямое оправление регистрами) и ничего не получил. Подумал, что не правильно выбрал тактирование, но нажав на несколько других ячеек – получил отклик. Видимо, данный метод не решает эту проблему. При попытке отключить генератор путем последовательного нажатия ALRF и HSI_ON — мы окончательно разочаровываемся в самой идеи отключения генератора. Что ж. Это не сильно мешает на начальном этапе. Но в будущем это станет проблематично. Особенно если делать карманное устройство.

Получаем 16 Мгц.

Нам удалось заставить наш контроллер тактироваться от внешнего кварцевого резонатора, что дало нам возможность получить более точные временные задержки. Теперь настало время научиться пользоваться умножителем частоты. В описании нашего контроллера сказано, что он может тактироваться с частотой вплоть до 80 Мгц. Попробуем написать функцию, которая позволит нам увеличить частоту тактирования в 2 раза. Снова взглянем на блок схему.

Теперь, перед тем, как по линии CPU_C1 частота «попадает» в CPU_C2, она проходит через CPU PLL. Там она «умножается» на какое-то значение. Рассмотрим его регистры поподробнее.

PLL не требует включения бита тактирования. Так что можно сразу приступать к настройке регистра. Опять же пропишем нужные нам define-ы.

Ну саму функцию включения.

Теперь мы можем добавить функцию в проект.

Хочу заметить, что я не просто так оставил 1 цикл мелькания светодиода. Это так называемая «программа спасения». Если в ходе экспериментов что-то пойдет не так, то после нажатия RESET будет целая секунда, чтобы прошить МК исправленной прошивкой.
После прошивки светодиод 2 раза мелькнет от внутреннего кварца, а потом в 2 раза быстрее от внешнего.

Теперь оптимизируем наш код. Использовать функцию ради 3-х строк – глупо. Тем более 2 из них повторяются и во второй функции. Поэтому предлагаю сделать их define-ами. Первая функция предстает перед нами в таком виде.

А из второй предлагаю сделать универсальную функцию переключения частоты. Для этого из предыдущей функции выкидываем настройку HSE и добавляем в регистр PLL_CONTROL еще бит перезапуска PLL. Чтобы при получении нового значения сразу начать тактироваться на нем. Функция начинает иметь следующий вид.

Внесем ее в нашу основную программу. Которую тоже приводим в порядок.

В качестве заключения, напишем программу, которая после каждого цикла будет менять коэффициент умножения увеличивая свою скорость вплоть до 10, получая 80 Мгц.

Видео работы программы.

Восстановление платы.

Но в моем случае оба JTAG-а не реагировали (завсали при попытке программирования МК), защитной программы не было, а USART загрузчик был очень далеко. Да и не хотелось тратить слишком много времени на восстановление. Так был придуман четвертый способ восстановления. Нужно переключить BOOT переключатели в режим EXT_ROM/JTAG_B, подключиться к JTAG_B и зашить код с прошивкой, в которой предусмотрена защитная программа. В моем случае я просто добавил цикл ожидания в одну секунду перед настройкой кварцевого резонатора. Так что после каждого неудачного опыта достаточно было нажать на RESET и успеть войти в режим отладки заново.

Практическое использование АЦП в микроконтроллерах AVR-DA и AVR-DB от Microchip

В статье рассмотрена настройка обновленного модуля АЦП последовательного приближения новых серий микроконтроллеров AVR-DA и AVR-DB производства Microchip с использованием среды разработки MPLAB X и графического конфигуратора MPLAB Code Configurator.

Модуль АЦП является наиболее распространенным видом периферии микроконтроллеров и встречается абсолютно в любом устройстве, не зависимо от производителя или ценовой ниши. В микроконтроллерах широко применяются два вида АЦП – последовательного приближения и сигма-дельта-АЦП. АЦП последовательного приближения имеет хорошее разрешение и умеренно высокую частоту дискретизации, сигма-дельта-АЦП обеспечивает очень высокое разрешение, но отличается низкой частотой дискретизации, а также сложностью конструкции и высокой ценой, вследствие чего они используются только в специализированных сериях микроконтроллеров.

АЦП последовательного приближения имеют в своем составе регистр последовательного приближения (РПП), компаратор и ЦАП. АЦП выполняет преобразование за N шагов, где N – разрядность АЦП. На каждой итерации определяется один разряд искомой величины.

Поскольку на преобразование необходимо время, АЦП данного типа имеет в своем составе Устройство Выборки и Хранения (УВХ), обеспечивающее неизменность входного напряжения на всем протяжении времени преобразования. Обычно таким устройством является конденсатор.

Работа данного АЦП выполняется по следующему алгоритму:

  • На первой итерации в старший разряд регистра последовательного приближения записывается единица, и напряжение, соответствующее данному значению, формируется на ЦАП (половина опорного напряжения), происходит сравнение входного напряжения со сформированным. Если сформированное значение меньше входного, то единица в старшем разряде закрепляется, если нет – закрепляется 0. Таки образом, старший разряд уже найден.
  • Второй разряд находится аналогично: записываем во второй по старшинству разряд РПП единицу, совершаем аналоговое преобразование, сравниваем полученное напряжение со входным. Если входное напряжение больше – закрепляется единица, иначе – 0. И так далее.

В 2020 году компания Microchip выпустила новую линейку 8-битных микроконтроллеров. Новая линейка получила название «AVR», одноименное с архитектурой. На данный момент линейку пополнили две серии микроконтроллеров: AVR-DA и AVR-DB. Новые серии получили улучшенный АЦП последовательного приближения c поддержкой дифференциального режима работы.

Отличия от AЦП старой версии, применявшегося в сериях ATtiny-0, ATtiny-1 и ATmega-0 следующие:

  • поддержка дифференциального режима работы;
  • увеличение скорости преобразования до 130 ksps;
  • повышение разрешения до 12 бит;
  • увеличение аккумулятора до 128 выборок.

Как и в АЦП предыдущей версии, поддерживаются следующе режимы работы:

  • единичное преобразование;
  • непрерывное преобразование;
  • преобразование с накоплением;
  • сравнение с порогом;
  • запуск по событию;
  • измерение температуры (от встроенного датчика температуры).

Давайте рассмотрим настройку АЦП на разные режимы работы с использованием среды разработки MPLAB X от Microchip и графического конфигуратора MPLAB Code Configurator на примере микроконтроллера AVR128DA48.

Для примера настроим микроконтроллер следующим образом:

  • частота ядра – 4 МГц от встроенного осциллятора;
  • частота тактирования АЦП – 2 МГц;
  • Single-ended/позитивный канал АЦП – вход AIN0;
  • негативный канал АПЦ – вход AIN5;
  • опорное напряжение АЦП – 2,048 В.

Предполагается, что новый проект уже создан и открыт MPLAB Code Configurator.

Настройка подсистемы тактирования

Настройку микроконтроллера начнем с настройки системы тактирования. Нас интересуют три частоты:

  • CLK_MAIN – частота, задаваемая источником частоты. В качестве источника может выступать внутренний осциллятор высокой частоты, внутренний осциллятор низкой частоты, внешний кварцевый резонатор или внешний генератор тактовой частоты.
  • CLK_CPU и CLK_PER – соответственно, частота ядра и частота, на которой работает периферия. Эти частоты равны и получаются путем деления CLK_MAIN делителем частоты.

Настройка частоты производится во вкладке System Module (рисунок 1).

Рис. 1. Настройка системной частоты

Рис. 1. Настройка системной частоты

Main Clock отображает системную частоту (CLK_CPU/CLK_PER) при текущих настройках.

Clock Source – ниспадающий список, в котором можно выбрать один из четырех источников тактовой частоты:

  • внутренний осциллятор высокой частоты (1…24 МГц);
  • внутренний осциллятор низкой частоты (32,768 кГц);
  • внешний часовой кварц частотой 32,768 кГц;
  • внешний генератор тактовой частоты.

Internal Oscillator Frequency позволяет выбрать, какой внутренний осциллятор будем использовать:

  • внутренний осциллятор высокой частоты (1…24 МГц);
  • внутренний осциллятор низкой частоты (32,768 кГц).

Oscillator Frequency Options задает частоту встроенного осциллятора в диапазоне 1…24 МГц.

PLL Enable включает PLL для Timer D. Используется для повышения частоты тактирования таймера вплоть до 48 МГц.

Prescaler Enable включает делитель частоты.

Prescaler задает значение делителя частоты, если он включен. Варианты выбора – от двух до сорока восьми.

В Clock Output Enable при “1” сформированная частота подается на ножку микроконтроллера CLKOUT.

Оставляем все настройки по умолчанию.

Настройка опорного напряжения АЦП

Опорное напряжение для модулей АЦП, ЦАП и компараторов задается модулем Voltage Reference (VREF). Окно графического конфигуратора этого модуля показано на рисунке 2.

Рис. 2. Настройка модуля VREF

Рис. 2. Настройка модуля VREF

Как видно из рисунка 2, можно выбрать следующие варианты опорного напряжения для АЦП:

  • 1,024 В;
  • 2,048 В;
  • 4,096 В;
  • 2,5 В;
  • напряжение питания – VDD;
  • внешнее опорное напряжение –VREFA.

Чекбокс Enable Force ADC Voltage позволяет выбрать, будет ли данное опорное напряжение включено всегда или только когда оно необходимо потребителю.

Для примера выберем опорное напряжение 2,048 В.

Настройка АЦП

Основные настройки АЦП отображены на вкладке Easy Setup (рисунок 3).

Рис. 3. Настройка АЦП

Рис. 3. Настройка АЦП

API Prefix задает префикс функций в сгенерированной конфигуратором библиотеке.

Result Selection дает выбор между 10-битным и 12-битным преобразованием.

Differential Mode Conversion дает выбор между дифференциальным и single-ended-режимом работы.

Поскольку регистр результата 16-разрядный, а результат 12- или 10-разрядный, Left в Adjust Result необходимо выбрать выравнивание результата.

Enable ADC задает включение АЦП.

Sample Frequency отображает расчетную скорость преобразования для данных настроек. Тут необходимо дать пояснения относительно времени, которое необходимо на одно преобразование (рисунок 4).

Рис. 4. Временная диаграмма единичного преобразования

Рис. 4. Временная диаграмма единичного преобразования

Общее время преобразования складывается из следующих величин:

  • Два такта частоты CLK_PER необходимы для запуска работы АЦП.
  • Два такта частоты CLK_ADC необходимы для захвата измеряемого напряжения в УВХ. Два такта – это минимальное значение, которое может быть увеличено. Увеличение этого значения используется при измерении напряжения источника с высоким выходным сопротивлением – дает больше времени для подзарядки емкости в УВХ.
  • 13,5 тактов частоты CLK_ADC необходимы на выполнение преобразования при 12-битном преобразовании. В случае 10-битного преобразования это время уменьшается до 11,5 тактов.
  • Формирование результата занимает 2 такта частоты CLK_PER.

CLK_PER – это частота, на которой работает вся периферия микроконтроллера. Она равна частоте ядра (в нашем случае – 4 МГц).

CLK_ADC – частота, на которой работает модуль АЦП. Она получается путем деления частоты CLK_PER входным делителем АЦП, минимальный коэффициент деления которого 2 (по умолчанию), а максимальный – 256. Также на частоту CLK_ADC накладываются следующие ограничения: минимальное значение 125 кГц, максимальное – 2 МГц. В нашем случае она равна 2 МГц.

Таким образом, время одиночного преобразования вычисляется по формуле 1:

В нашем случае время преобразования составляет: Tпреоб_12 бит = 8,75 мкс, что соответствует частоте 114 ksps.

Sample Accumulation Number задает количество выборок в очереди в режиме работы с накоплением.

Sample Length, как уже было сказано выше – минимальное время захвата измеряемого напряжения в УВХ – 2 такта частоты CLK_ADC. С помощью этой настройки можно задать дополнительное время на захват в тактах частоты CLK_ADC.

Детальная настройка АЦП

Для детальной настройки модуля АЦП используется вкладка Registers (рисунок 5).

Рис. 5. Регистры модуля АЦП

Рис. 5. Регистры модуля АЦП

На этой вкладке нас интересуют несколько регистров:

  • регистр MUXPOS задает канал для single-ended-преобразования или позитивный канал для дифференциального преобразования;
  • регистр MUXPNEG задает негативный канал дифференциального преобразования;
  • регистр CTRLA, а точнее его бит FREERUN, позволяет выбрать непрерывный режим работы.

Можно выбрать следующие значения для single-ended/позитивного и негативного каналов:

  • AIN0…AINx – внешние каналы (ножки микроконтроллера);
  • DAC0 – выход модуля ЦАП;
  • DACREF0…DACREF2 – напряжение со встроенных формирователей опорного напряжения компараторов;
  • Ground – напряжение Vss;
  • Temperature Sensor используется для измерения температуры чипа.

Настройка I/O

Для АЦП нет необходимости настраивать мультиплексор входов/выходов, поскольку внешние каналы АЦП не мультиплексированы и нет возможности их переназначить на другие выводы микроконтроллера.

По умолчанию ножки микроконтроллера настроены как входы с выключенной подтяжкой. При использовании входа как аналогового производитель рекомендует для уменьшения потребления выключить входные буферы. После этого чтение цифрового значения на входе станет невозможным – регистр PORTx.IN перестанет обновляться.

Для настройки входов/выходов микроконтроллера используется окно Pin Manager. Если привязать входные каналы АЦП к соответствующим контактам, то эти пины будут инициализированы как аналоговые входы – буферы будут выключены (рисунок 6).

Рис. 6. Настройка входов/выходов

Рис. 6. Настройка входов/выходов

Режим одиночного преобразования

По умолчанию АЦП уже настроен на работу в режиме одиночного преобразования, и никаких дополнительных настроек не требуется.

Для получения результата достаточно вызвать одну функцию из библиотеки АЦП (листинг 1).

Листинг 1.

adc_result_t – это просто псевдоним типа uint16_t

adc_0_channel_t – это перечисляемый тип, перечисление уже содержит все варианты выбора канала для single-ended-преобразования.

Функция настроит входной мультиплексор АЦП на нужный канал, запустит преобразование, дождется его окончания и вернет результат (листинг 2).

Листинг 2.

Режим непрерывного преобразования

Для перевода АЦП в режим непрерывного преобразования достаточно установить бит FREERUN регистра CTRLA во вкладке детальной настройки (рисунок 7).

Рис. 7. Включение непрерывного преобразования

Рис. 7. Включение непрерывного преобразования

Первое преобразование необходимо запустить вручную. Следующий цикл преобразования запускается автоматически после завершения предыдущего преобразования. Для получения результата достаточно дождаться окончания текущего преобразования (листинг 3).

Листинг 3.

Режим дифференциального преобразования

При дифференциальном режиме работы АЦП измеряет разницу напряжения между позитивным и негативным каналами, поэтому результат преобразования – число со знаком.

Для запуска дифференциального преобразования нет необходимости перенастраивать инициализацию АЦП, достаточно использовать функцию листинга 4.

Листинг 4.

  • diff_adc_result_t – это псевдоним типа int16_t;
  • adc_0_muxneg_channel_t – перечисляемый тип для выбора негативного канала.

Функция настроит АЦП на дифференциальный режим работы, а входные мультиплексоры на нужные каналы, запустит преобразование, дождется получения результата и вернет его (листинг 5).

Листинг 5.

Режим c накоплением

В режиме накопления АЦП производит серию измерений, результаты всех измерений суммируются и помещаются в 16-битный аккумулятор. При количестве выборок больше 16 может произойти переполнение аккумулятора, что приведет к отбрасыванию младших бит. Для получения среднего значения пользователь должен программно поделить результат на количество выборок или на 16, если выборок больше шестнадцати.

Режим полезен для фильтрации высокочастотных помех и подавления шума.

Для включения этого режима необходимо задать количество выборок в очереди в поле Sample Accumulation Number (рисунок 8).

Рис. 8. Включение режима работы с накоплением

Рис. 8. Включение режима работы с накоплением

Если помеха гармоническая, то для уменьшения погрешности измерения необходимо отодвинуть частоту семплирования как можно дальше от частоты этой помехи. Для этого используется битовое поле SAMPDLY[3:0] регистра CTRLD.

Поле SAMPDLY задает задержку между последовательными измерениями в очереди. Задержка измеряется в периодах частоты CLK_ADC (листинг 6).

Листинг 6.

Сравнение с порогом

В режиме сравнения с порогом АЦП вызывает прерывание, если измеренное значение больше или меньше заданного значения. Доступны следующие варианты сравнения:

  • результат меньше нижнего порогового значения;
  • результат больше верхнего порогового значения;
  • результат внутри окна (между верхним и нижним пороговыми значениями);
  • результат снаружи окна.

Функция сравнения полезна при отслеживании сигнала, который должен оставаться в пределах заданного диапазона, например, для мониторинга уровня заряда батареи.

Сравнение с порогом может использоваться как при одиночном преобразовании, так и при непрерывном преобразовании и преобразовании с накоплением. В случае преобразования с накоплением с порогом сравнивается суммарное значение.

16-битные регистры WINLT и WINHT задают нижнее и верхнее пороговое значение соответственно. Регистр CTRLE задает режим сравнения.

Настройка данного режима работы производится в секции Window Settings вкладки Easy Setup (рисунок 9).

Рис. 9. Настройка режима сравнения с порогом

Рис. 9. Настройка режима сравнения с порогом

Window Comparator Mode задает режим сравнения.

Чекбокс Enable IRQ on conversion complete включает прерывание по завершению преобразования.

Чекбокс Enable IRQ on conversion satisfying window criteria включает прерывание по результату сравнения полученного значения преобразования с порогом.

Window Comparator High Threshold задает верхний порог.

Window Comparator Low Threshold задает нижний порог.

Пользователю нужно установить обработчик прерывания сравнения с порогом с помощью следующей функции (листинг 7), где f – это пользовательский обработчик прерывания. Тип данной функции – без аргументов и возвращаемого значения.

Листинг 7.

Запуск преобразования по событию

Преобразование может быть запущено или программно, или по фронту сигнала события от другого модуля периферии. Для коммутации сигналов между модулями используется система событий. Использование системы событий позволяет снизить нагрузку на процессор и дает возможность запускать преобразование в энергосберегающем режиме, когда ядро остановлено.

Для включения возможности запуска преобразования по событию необходимо установить бит STARTEI регистра EVCTRL.

Для настройки системы событий нужно выбрать канал для распространения события, источник события и получателей события. Для примера будем запускать преобразование АЦП по переполнению RTC — часов реального времени (рисунок 10).

Рис. 10. Настройка системы событий

Рис. 10. Настройка системы событий

Измерения температуры контроллера

С помощью АЦП можно измерить температуру чипа с помощью интегрированного термодатчика. Выходное напряжение датчика имеет практически линейную зависимость от температуры. Ввиду невозможности полной идентичности процессов изготовления микросхем для разных устройств эти прямые будут иметь разный наклон и смещение.

Угловой коэффициент прямой и ее смещение определяются при производстве микросхемы и записываются в специальную область памяти данных – SIGROW.

Константа TEMPSENSE0 содержит угловой коэффициент, а TEMPSENSE1 – смещение.

Для измерения температуры необходимо задать следующие настройки АЦП:

  • опорное напряжение АЦП – 2,048 В;
  • мультиплексор MUXPOS настроен на датчик температуры;
  • разрядность преобразования – 12 бит;
  • выравнивание результата – правое;
  • режим преобразования – single-ended.

Температура в Кельвинах вычисляется по формуле 2:

  • Offset – значение константы TEMPSENSE1;
  • Slope – значение константы TEMPSENSE0.

Пример функции получения температуры представлен в листинге 8.

Листинг 8.

Подводим итог

Кардинальным отличием нового АЦП от предыдущей версии является поддержка дифференциального режима работы. В новом улучшены и другие характеристики – быстродействие и глубина аккумулятора.

Современные интегрированные среды разработки предоставляют пользователю готовые библиотеки для работы с модулями периферии и позволяют сгенерировать код первичной инициализации устройства на основании графического интерфейса.

Помимо рассмотренного в статье MPLAB Code Configurator, компания Microchip предлагает и другие средства разработки с возможностью графического конфигурирования – Atmel Start для микроконтроллеров с архитектурой AVR и MPLAB Xpress для контроллеров с ядром PIC. Данные среды разработки являются облачными и не требуют установки на компьютер.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *