Автомат, включающий нагрузку по свистку на pic

Автомат, включающий нагрузку по свистку на PIC

Всем знакома такая ситуация: открываешь дверь в темном помещении и судорожно ищешь кнопку выключателя что бы зажечь свет… Или наоборот, уютно устроившись в теплом кресле, начинаешь дремать, и так не охота вставать и выключать свет…

А если снабдить выключатель специальной приставкой, то достаточно всего лишь хлопнуть в ладоши и свет погаснет сам. Идея такого автомата не нова. Я лишь попытался сделать его компактным и легко повторяемым.

В основе автомата-приставки микроконтроллер серии Microchip – PIC12F629. Аналоговая часть – усилитель звуковой частоты и исполнительная цепь – ключевой транзистор и реле, коммутирующее питание нагрузки. В качестве реле я использовал TRM3003 на 110 В с гасящим резистором (R8)16 kOm (2 Вт). Устройство питается от параметрического стабилизатора, собранного на стабилитроне и сглаживающих пульсации конденсаторах.

Устройство работает так: в режиме ожидания на порту GP0 микроконтроллера присутствует лог. «1», а на порту GP2 – лог. «0». Таким образом аналоговая часть работает в режиме усилителя звуковой частоты. Сигнал от пьезоэлемента подается на базу первого транзистора КТ3102Б. Смещение на базу подается через резистор 3,3 М. С коллекторной нагрузки первого транзистора сигнал через развязывающую емкость подается на базу второго транзистора обратной структуры. Его база приоткрыта резистором 2 М. С коллекторной нагрузки второго транзистора усиленный сигнал подается через емкость 510 пФ на порт GP1 контроллера. Резистор 20 К совместно с емкостью выполняет роль дифференцирующей цепочки, что снижает реакцию усилителя на посторонние шумы.

При поступлении громкого сигнала свиста либо хлопка в ладоши на выходе усилителя появляется напряжение, которое поступает на порт GP1 контроллера. Контроллер «просыпается», изменяет напряжения на порту GP0 на противоположные, а через порт GP2 начинает генерировать сигнал звуковой частоты – пакеты длительностью 200 mS, заполненные частотой 5000 Гц, с интервалами в 100 mS. Это своего рода сигнал о том, что команда принята. Всего 3 пакета общей длительностью около 1 S. Затем на GP5 формируется лог.«1» и включается нагрузка. Наличие диода в базовоколлекторном переходе первого транзистора позволяет сигналу проходить через пьезоизлучатель. Диод необходимо подобрать по наименьшему сопротивлению в прямом состоянии, в этом случае сигнал будет звучать громче.

Устройство питается от сети 220 В. Напряжение выпрямляется двухполупериодным выпрямителем и гасится на резисторе 100 кОм, затем стабилизируется стабилитроном КС 106 Б.

О программе: в контроллере задействован внутренний тактовый генератор на 4 МГц. В режиме ожидания контроллер находится в спящем состоянии и потребляет ток примерно 4 мкА, не считая потребления от портов питания усилителя и ключевого транзистора. В общем, суммарный ток потребления в режиме ожидания не превышает 100 мкА. В программе реализовано прерывание по изменению состояния порта GP1. Сразу после пробуждения и сброса флага прерывания от порта, запрещаются дальнейшие прерывания от порта, изменяется уровень логики на GP0 и начинается генерация частотнозаполненных пакетов. Пакеты формируется посредством простых циклов. После окончания формирования звуковых пакетов контроллер включает нагрузку, устанавливает первоначальное состояние на портах питания усилителя, разрешает прерывания от GP1 и уходит в сон… Последующая подача сигнала в виде хлопка и свиста повторяет алгоритм и приводит к выключению нагрузки.

Основные моменты программы

Для разрешения прерываний от периферии необходимо настроить регистр INTCON.

Это можно сделать сразу в подпрограмме инициализации:

Здесь установлен быт разрешения глобальных прерываний и прерываний от портов

Непосредственно разрешить прерывания от конкретного порта можно в регистре IOCB.

Нужно, при этом, помнить что IOCB находится в первом банке памяти!

Программа устанавливает GP0 в «1», GP2 в «0», т.е. включает аналоговую часть устройства в режим микрофона, разрешает прерывания от порта GP1 и уходит в сон.

При пробуждении от прерывания программа запрещает прерывание от GP1 и устанавливает на GP0 «0», т.е. отключает питание усилителя.

Вход в прерывание

Необходимо выполнить чтение порта, чтобы исключить несоответствие и сбросить флаг прерывания.

Генерирование сигнала (отклик брелка)

Происходит чисто программно, без использования прерываний. Задержки формируются посредством вложенных циклов. Цикл реализованный на переменной «TEMP» формирует задержку, равную половине периода частоты 500 Гц (т.е. 1 миллисекунда). После выполнения задержки порт GP2 изменяет свое состояние на противоположное и т.д…

Цикл реализованный на переменных «TEMP1» и «TEMP2» формирует повторение внутреннего цикла на «TEMP» в течении 200 миллисекунд.

Пауза формируется все теми же вложенными циклами:

Объединив оба блока (звук + пауза) в один и задав количество повторений через переменную «TEMP3» равную 3 получаем:

Таким образом будет сформирован прерывистый звуковой сигнал частотой 500 Гц, длительностью 200 миллисекунд с интервалом следования 100 миллисекунд. Всего 10 пакетов. Общей длительностью: (0,2+0,1)х3 = 0,9 секунды

Далее следует блок, включающий или выключающий нагрузку:

Переключение состояния порта происходит по принципу: если был «0» — установить «1», если был «1» — установить «0». Я называю такой принцип переключения – триггерным.

При повторении устройства крайне важно подобрать транзисторы по наибольшему коэффициенту усиления: КТ3102 – не менее 500, КТ3107 – не менее 1000. Допускается использовать любые другие маломощные низкочастотные транзисторы с подобными коэффициентами усиления. Наладка устройства сводится к подбору резисторов смещения на базы усилительных каскадов по наибольшему усилению сигнала.

2 Схемы

Принципиальные электросхемы, подключение устройств и распиновка разъёмов

Универсальный ШИМ-контроллер на PIC с регулировкой резистором

Есть немало самодельных проектов контроллеров мощности нагрузки, использующих широтно-импульсную модуляцию (ШИМ) для управления скоростью двигателя или нагревателя. В большинстве из них используются аналоговые методы для генерации сигнала ШИМ, который, в свою очередь, управляет мощным полевым МОП-транзистором или транзистором.

Здесь же предлагается схема, основанная на PIC12F683, с использованием периферийного устройства Capture / Compare / PWM внутри PIC для генерации выходного сигнала. Полевой МОП-транзистор логического уровня с N-каналом нужен для управления выходной мощностью.

Обычно управление в МК кнопочное, но тут сделано удобнее — переменный резистор обеспечивает входное напряжение для PIC, которое преобразуется в цифровое значение с помощью встроенного аналого-цифрового преобразователя, который, в свою очередь, используется для установки рабочего цикла ШИМ.

Поскольку рабочий цикл ШИМ регулируется с использованием входа сигнала напряжения в PIC, можно использовать альтернативный аналоговый интерфейс вместо VR1 для обеспечения этого входа напряжения и, следовательно, управления рабочим циклом.

В исходной версии проекта вход от аналого-цифрового преобразователя (АЦП) подавался непосредственно в регистр рабочего цикла модуля ШИМ на МК, поэтому выходная нагрузка изменялась линейно прямо пропорционально изменению входного напряжения. Вход переключателя позволял выбрать период ШИМ в одном из трех диапазонов; 15,6 кГц, 3,8 кГц и 980 Гц.

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

Вход переключателя теперь циклически проходит через 3 таблицы сопоставления. Таблицы по умолчанию, идущие с кодом, имеют взаимно однозначное сопоставление входного напряжения с выходным рабочим циклом и фиксированные периоды 15,6 кГц, 3,8 кГц и 980 Гц соответственно, чтобы сохранить обратную совместимость с исходной версией кода.

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

Также имеется цифровой управляющий вход, позволяющий отключать выходной драйвер. При низком уровне выход ШИМ устанавливается на 0%.

МК PIC12F683 имеет внутреннее аппаратное периферийное устройство PWM, которое используется для генерации сигнала ШИМ. Рабочий цикл сигнала ШИМ контролируется VR1, который через R1 подает напряжение на вывод 3 IC1. При 0 В на входе рабочий цикл составляет от 0% (выключено) и до 100% при 5 В на входе.

Сигнал PWM выводится с вывода 5 IC1 и управляет выводом затвора Q1 через R3. Резистор R4 соединяет вывод затвора Q1 с землей. Это гарантирует, что Q1 останется выключенным при первом включении схемы, пока микропрограммное обеспечение не инициализирует выходы. Диод D1 необходим при возбуждении индуктивных нагрузок и обеспечивает путь для индуктивного обратного тока. Для нагрузок до 3-х ампер Q1 не требует радиатора.

Питание логики обеспечивается IC2, 5-вольтовым стабилизатором 78L05. Он подключается к источнику входного напряжения через диод D2, который обеспечивает защиту от обратной полярности подачи питания.

Переключатель SW1 позволяет выбрать одну из трех таблиц переназначения ШИМ. Чтобы избежать случайных изменений в используемой таблице карт, программное обеспечение требует, чтобы переключатель удерживался не менее 500 мс перед переключением на следующую. Выбранная таблица обозначается светодиодом LED1, и значение сохраняется в EEPROM, поэтому он всегда включается с использованием последней использованной настройки.

CON1 обеспечивает цифровой вход, который опрашивается прошивкой. Когда этот вход становится низким, рабочий цикл устанавливается на 0% от начала следующего периода ШИМ, это выключает MOSFET Q1. Когда на входе возвращается высокий уровень, ШИМ перезапускается с использованием рабочего цикла, установленного входом от VR1. Разъем также обеспечивает соединения 5 В и Gnd, позволяющие подключить небольшую цепь управления вне печатной платы. Если он используется для питания другой цепи, убедитесь, что он не потребляет более 40 мА от источника питания. Если управление выключением не требуется, оставьте разъем открытым, и внутреннее слабое подтягивание PIC будет удерживать входной высокий уровень, обеспечивая выход.

Схема будет работать с входным напряжением от 9 до 20 вольт. Если решите использовать устройство с более высоким входным напряжением, может потребоваться выбрать другие компоненты стабилизатора.

В качестве диода D1 здесь может использоваться 1N4002 для большинства устройств с низким энергопотреблением, лучше 1N5819 Шоттки, для более высоких токовых нагрузок могут быть 1N5820, SB330 или SB350.

Чтобы получить полный диапазон управления, когда VR1 повернут полностью против часовой стрелки, убедитесь что напряжение на клемме VR1 0 вольт. Напряжение на клемме VR1 должно быть от Vss до Vdd, чтобы получить полный выходной диапазон.

Потенциометр VR1 обозначен на схеме как 5K, но его можно заменить и 10 кОм. Во всех случаях это должен быть линейный тип, а не логарифмический.

Вход сброса PIC MCLRE (контакт 4) настроен на вход с логикой сброса, внутренне связанной с Vdd, и включенным слабым подтягиванием на контакте ввода / вывода.

Обратите внимание на следующие моменты:

  • Нет ограничения по току или датчика перегрузки, возможно понадобится использовать плавкий предохранитель на нагрузку.
  • Контроллер PWM является разомкнутым, поэтому он не регулирует рабочий цикл для поддержания постоянного числа оборотов двигателя при изменении нагрузки. Вы можете добавить аналоговый контур регулирования на входе АЦП, чтобы добиться этого, если необходимо.
  • Тут не нужно использовать комплект изолирующих шайб между радиатором и полевым МОП-транзистором, поскольку радиатор изолирован на печатной плате. Но поскольку радиатор подключен к полевому МОП-транзистору, необходимо убедиться что он не соприкасается с какими-либо другими частями схемы или корпусом, в который устанавливаете контроллер.
Читайте также  Установка ламп в цветомузыкальном устройстве

Здесь VR1 контролирует рабочий цикл (и период) выхода ШИМ. Аналоговый вход от VR1 используется в качестве индекса в таблице карты, которая возвращает требуемый рабочий цикл и период ШИМ. Это означает, что линейный вход на АЦП может использоваться для генерации нелинейного изменения рабочего цикла на выходе.

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

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

Используя доступную память в PIC, можно запрограммировать три таблицы переназначения. Вход переключателя S1 используется для выбора таблицы карты, которая будет использоваться. Нажатие S1 на более 500 мс будет циклически перемещать по трем таблицам карт; это необходимо для предотвращения случайного включения. Используемая таблица обозначается светодиодом, как показано ниже. Таблица карты выбранная для использования, также сохраняется в EEPROM, поэтому при следующем включении PIC будет использоваться последняя выбранная таблица.

Таблицы карты по умолчанию, поставляемые с кодом, используют линейное отображение входного напряжения и выходного рабочего цикла ШИМ. Каждая имеет фиксированный период ШИМ.

  1. Таблица 1, период ШИМ 15,6 кГц
  2. Таблица 2, период ШИМ 3,8 кГц
  3. Таблица 3, период ШИМ 980 Гц

Данные карты можно изменить, отредактировав файл bdcm_remap.asm и введя альтернативные имена включаемых файлов для требуемых таблиц карты. Раздел для редактирования находится в конце файла. Точка с запятой комментирует строку, ее удаление приведет к включению строки во время сборки. Всегда должно быть три файла данных переназначения. Это могут быть разные файлы или один и тот же, включенный трижды.

Значение коэффициента заполнения, используемое в таблице карты, должно быть целым числом в диапазоне от 0 до 255. Чтобы преобразовать коэффициент заполнения в процентах в значение для таблицы, умножьте его на 2,55. Например, 60% x 2,55 = 153.

Новые таблицы могут быть созданы с помощью Exel. Скопируйте и вставьте необходимые ячейки в MPLAB и сохраните как someMapFile.inc. Включите имена файлов карты в файл bdcm_remap.asm и соберите заново. Пример электронной таблицы (Excel 2003) имеется в общем архиве в конце статьи.

Сборка и включение

Подключите входное питание постоянного тока к CON2, а выходную нагрузку к CON3. Вход выключения PWM необязателен, если он не требуется оставьте разъем отключенным и выход будет включен.

Файл HEX готов к программированию непосредственно в PIC12F683. Файл asm содержит исходный код, который можете изменить или просто просмотреть, чтобы увидеть как оно работает. Если собираетесь изменить код, рекомендуем загрузить и установить Microchip MPLAB IDE, которая позволит легко редактировать, изменять и программировать PIC.

Версия с мягким запуском

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

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

Если управляющий потенциометр находится в максимальном положении, требуется приблизительно 1,2 секунды, чтобы выходной сигнал увеличился до конечной настройки, это время прямо пропорционально положению управляющего положения; например если регулятор установлен на 1/3 от максимума, потребуется 1,2 / 3 = 0,4 секунды.

Чипгуру

  • Форум
    • Правила форума
    • Правила для Редакторов
    • Правила конкурсов
    • Руководство барахольщика
    • Ликбез по форуму
      • Изменить цвет форума
      • Как вставлять фотографии
      • Как вставлять ссылки
      • Как вставлять видео
      • Как обозначить оффтоп
      • Как цитировать
      • Склеивание сообщений
      • Значки тем
      • Подписка на темы
      • Автоподписка на темы
    • БиБиКоды (BBCode)
    • Полигон для тренировок
  • Калькуляторы
    • Металла
    • Обороты, диаметр, скорость
    • Подбора гидроцилиндров
    • Развертки витка шнека
    • Расчёт треугольника
    • Теплотехнический
    • Усилия гибки
  • Каталоги
    • Подшипников
    • Универсально-сборные пр.
    • УСП-12
  • Справочники
    • Марки стали и сплавы
    • Открытая база ГОСТов
    • Применимость сталей
    • Справочник конструктора
    • Справочник ЧГ сталей
    • Сравнение материалов
    • Стандарты резьбы
  • Таблицы
    • Диаметров под резьбу
    • Конусов Морзе
    • Номеров модульных фрез
  • Темы без ответов
  • Активные темы
  • Поиск
  • Наша команда

WatchDog на PIC12F629 своими руками (Auto reset зависшему компьютеру)

WatchDog на PIC12F629 своими руками (Auto reset зависшему компьютеру)

Сообщение #1 omich » 16 мар 2020, 14:16

__config _CP_OFF & _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF
;Защита кода отключена
;Задержка включения питания включена
;WDT отключен
;внутренний генератор на 4МГц без внешнего вывода

errorlevel -302
cblock 0x20
cn1_1
cn1_2
cn1_3
cn30_1
cn30_2
cn30_3
cn300_1
cn300_2
cn300_3
cn300_4
INT_CONTEXT_W
INT_CONTEXT_STATUS
endc

org 0
goto main

; When any interrupt happens, the PIC will jump to 0x4, the «Interrupt Vector».
; See «Figure 6-1: Architectural Program Memory Map and Stack» of the
; «PICmicro™ Mid-Range MCU Family Reference Manual»
; ( http://ww1.microchip.com/downloads/en/D . 33023a.pdf ).
org 0x4

; On an interrupt, the PIC only pushes the PC on the stack. The author is
; responsible for preserving (or not) any other registers, including W and
; STATUS. See «8.5 Context Saving During Interrupts».
movwf INT_CONTEXT_W
movf STATUS, W
movwf INT_CONTEXT_STATUS

bcf STATUS, RP0
; Проверяем проверяем появление единицы на входе GP2
;BTFSC = wait for high pulse (-_+). ;BTFSS = wait for low pulse (+_-)
btfsc GPIO, GP2
; во время этой паузы в 1 секунду зажигается контрольный светодиод
; на GP0 и сбрасываются счетчики таймеров 30-ти и 300 секунд
call delay_1s

; Чистим вручную флаг прерывания. См. «3.2.2 INTERRUPT-ON-CHANGE» в документации.
bcf INTCON, GPIF
; Восстанавливаем стек программы и восстанавливаем возможность прерываний.
movf INT_CONTEXT_STATUS, W
movwf STATUS
movf INT_CONTEXT_W, W
; Конец обработчика прерывания
retfie

main
bcf STATUS, RP1 ; переходим в 1 банк
movwf OSCCAL ; загружаем калибровочную константу
bcf STATUS, RP0 ; переходим в 0 банк

; Делаем порты GP <0,1,2>как цифровые на I/O.
clrf GPIO

; Отключаем компараторы с GP<0,1,2>
movlw b’111′
movwf CMCON

bsf STATUS, RP0
; Отключаем аналоговые входы AN <0,1,2,3>для 12F675 раскоментарить 4 строчки.
; bcf ANSEL, ANS0
; bcf ANSEL, ANS1
; bcf ANSEL, ANS2
; bcf ANSEL, ANS3

; GP2 делаем входом, а все остальные GP(0,1,3,4,5) будут выходами.
movlw b’00000100′
movwf TRISIO

; Включаем прерывание на порту GP2 по изменению состояния.
bsf IOC, IOC2
bsf INTCON, GPIE
bsf INTCON, GIE
bcf STATUS, RP0

; Основной цикл
; Если нужно 300 секунд(5 мин), то коментарим эту строчку
; goto delay_30s ; Работаем с 30-ти сек задержкой.

; Delay = 300 seconds
; Clock frequency = 4 MHz
; Actual delay = 300 seconds = 300000000 cycles
delay_300s
;299999995 cycles
movlw 0x54
movwf cn300_1
movlw 0xA1
movwf cn300_2
movlw 0xFD
movwf cn300_3
movlw 0x02
movwf cn300_4
Delay_300
decfsz cn300_1, f
goto $+2
decfsz cn300_2, f
goto $+2
decfsz cn300_3, f
goto $+2
decfsz cn300_4, f
goto Delay_300
;5 cycles
goto $+1
goto $+1
nop
; тут конец отсчета задержки 5 минут
movlw b’00000010′ ; Выбираем GP1
bsf GPIO, F ; Зажигаем светодиод на GP1
; ждем 1 секунду , во время задержки зажигается светодиод на GP0
call delay_1s
movlw b’00000010′ ; Выбираем GP1
bcf GPIO, F ; Гасим светодиод на GP1
goto delay_300s ; Зацикливаем программу

; Delay = 30 seconds
; Clock frequency = 4 MHz
; Actual delay = 30 seconds = 30000000 cycles
delay_30s
;29999996 cycles
movlw 0x11
movwf cn30_1
movlw 0x66
movwf cn30_2
movlw 0x42
movwf cn30_3
Delay_30
decfsz cn30_1, f
goto $+2
decfsz cn30_2, f
goto $+2
decfsz cn30_3, f
goto Delay_30
;4 cycles
goto $+1
goto $+1
; тут конец отсчета задержки
movlw b’00000010′ ; Выбираем выход GP1
bsf GPIO, F ; Зажигаем светодиод на GP1
; ждем 1 секунду , во время задержки зажигается контрольный светодиод на GP0
call delay_1s
movlw b’00000010′ ; Выбираем GP1
bcf GPIO, F ; Гасим светодиод на GP1
goto delay_30s ; Зацикливаем программу

; Секундная задержка и одновременно выдача контрольного сигнала на GP0
delay_1s
bsf GPIO, GP0 ; В начале паузы зажигаем контрольный светодиод на GP0

; Восстанавливаем 300 секундный счетчик в исходное состояние
movlw 0x54
movwf cn300_1
movlw 0xA1
movwf cn300_2
movlw 0xFD
movwf cn300_3
movlw 0x02
movwf cn300_4

; Восстанавливаем 30 секундный счетчик в исходное состояние
movlw 0x11
movwf cn30_1
movlw 0x66
movwf cn30_2
movlw 0x42
movwf cn30_3

; Задержка 1 сек
; Формируем задержку 999997 cycles
movlw 0x08
movwf cn1_1
movlw 0x2F
movwf cn1_2
movlw 0x03
movwf cn1_3
Delay_1
decfsz cn1_1, f
goto $+2
decfsz cn1_2, f
goto $+2
decfsz cn1_3, f
goto Delay_1
;3 cycles
goto $+1
nop
movlw 63
movwf cn1_1

bcf GPIO, GP0 ; Гасим светодиод на GP0

В компьютере подпаялся прямо к разъему COM-порта 5 и 3 выводам:

Думаю, теперь без связи не останусь.

ЗЫ. В архиве схема, печатка .lay6, исходный текст в ASM и скомпилированная прошивка для 5-ти минутного интервала:

PIC. Урок 14. Модуль CCP. Режим PWM

Продолжаем изучение модуля CCP, который служит для расширения функционала таймеров. И в данном уроке мы познакомимся и ощутим на практике третий и последний режим модуля CCP – режим PWM (Pulse-Width Modulation) или ШИМ (широтно-импульсная модуляция).

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

ШИМ — это управление свечением светодиодов, вращением двигателей, и прочими устройствами необычным способом, при котором данное управление осуществляется не приложенным напряжением к контактам, а квадратными импульсами. При этом напряжение будет только двух видов — высокое (1) и низкое (0). При данном способе результирующее напряжение вычисляется как среднее по времени между временем высокого состояния в одном импульсе и временем низкого состояния. Мы вычисляем отношение времени (или широты) высокого состояния к общему периоду импульса. Называем мы это скважностью импульса. То есть чем больше в периоде напряжение находилось в высоком состоянии, тем больше скважность, а, следовательно, тем больше и результирующее среднее напряжение. То есть, чтобы найти результирующее напряжение, нам необходимо и достаточно вычисленную скважность умножить на напряжение и разделить на 100, так как скважность как правило измеряется в процентах. Например, если у нас в квадратном импульсе широта логического нуля равна широте логической единицы, то скважность у нас будет 50 процентов, и, если напряжение будет 5 вольт, то среднее результирующее напряжение мы получим равное 2,5 вольт и т.д. Лучшую картину объяснения данной ситуации мы можем увидеть, посмотрев видеоурок, ссылка на который дана в конце данной статьи.

Читайте также  Стабилизатор внешнего питания видеокамеры

Это конечно очень упрощённое понятие ШИМ. Есть более серьёзные разъяснение данной технологии, но нам для наших экспериментов этого будет вполне достаточно.

То есть, подведя итоги объяснению, мы управляем результирующим напряжением, а также и свечением светодиода, угловой скоростью электродвигателя и прочими значениями за счёт изменения скважности импульсов.

Как же организован PWM в нашем модуле CCP, как его включить и как им управлять?

На помощь нам приходит техническая документация на контроллер. Посмотрим данную блок-схему

В блок-схеме описан механизм организации и управления режимом PWM в модуле CCP1. Поэтому речь мы будем вести о первом модуле CCP. Работа со вторым модулем происходит аналогично.

Мы заносим в регистр PR2 таймера TIMER2 период, с помощью чего мы задаём необходимую частоту импульсов.

PWM в нашем контроллере является 10-битным.

Количество циклов периода, во время которых шина будет находиться в состоянии логической 1, мы настраиваем с помощью регистра CCPR1L и двух битов (5:4) регистра CCP1CON. Вот так мы и получаем 10 бит настройки периода высокого состояния. Но возникает некоторая неувязка: у нас же таймер TIMER2 8-битный. Тут всё не так просто.

Общий период всего цикла PWM рассчитываеся следующим образом. Сначала мы значение в регистре PR2 увеличиваем на 1. Затем данный результат мы умножаем на 4 и ещё на коэффициент деления. Единица измерения данного периода – это количество тактов генератора. Чтобы получить его в единицах времени, соответственно результат надо умножить на период одного такого такта.

При совпадении величин периода высокого состояния и значения TMR2, умноженного на коэффициент деления (ножка Q триггера учитывает его), то есть когда счётчик таймера достигнет периода высокого состояния, цифровой компаратор передаст сигнал на контакт R триггера, который затем переведёт ножку контроллера PC2 (CCP1) в низкое состояние. А в высокое состояние ножка перейдёт, когда таймер досчитает до конца, то есть когда значение в регистре TMR2 совпадёт со значением в регистре PR2.

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

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

Ну и, чтобы рассчитать скважность ШИМ, мы длительность импульса делим на общий период всего цикла.

Соответственно, ножка RC2 должна быть настроена на выход.

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

Проект мы создадим из проекта прошлого занятия CCP_CMP и назовём его CCP_PWM.

Откроем проект в MPLAB X.

Питать контроллер мы будем от программатора, так как ток потребления будет небольшой.

Теперь на время перенесёмся к нашей схеме. Во избежание шунтирования снимем перемычку с ножки RC2, идущую от ИК-приёмника

Сначала мы будем смотреть результат нашей работы с кодом с помощью логического анализатора, а по окончании – подключим светодиоды к ножкам обоих модулей. Работать мы будем одновременно с двумя модулями CCP. Ещё одно очень важное замечание. Оба сигнала ШИМ будут одного периода, разную мы можем обеспечить только скважность. Обусловлено это тем, что таймер в одну единицу времени может работать только с одной частотой и с одним периодом. Менять мы всё это в процессе выполнения программы, конечно же, можем, но изменения эти, соответственно, коснутся одновременно обоих модулей CCP.

Подключим логический анализатор к ножкам CCP1 (RC2) и CCP2 (RC1) (нажмите на картинку для увеличения изображения)

Настроим наш проект как главный, на всякий случай убедимся в настройках, что у нас плата питается именно от программатора.

Откроем файл main.c и удалим глобальную переменную

unsigned int per1;

Удалим также функцию-обработчик прерываний interrupt isr вместе с телом.

В функции main() добавим две локальные переменные

unsigned int i= 0 ;

unsigned char fl= 0 ;

Порт A нам не потребуется, поэтому удалим его инициализацию

Порт C настроим на выход весь, тем самым на выход будут настроены наши ножки CCP1 и CCP2

TRISC= 0X00 ;

Режим модулей меняем на PWM

CCP1CON = 0x0F ; //PWM mode CCP

CCP2CON = 0x0F ;

Весь дальнейший код до бесконечного цикла удалим.

Настроим таймер 2, добавив предделитель, настроив желаемый период и по окончании включив наш таймер

PR2 = 0xFF ; //TIMER2 Period 255

T2CKPS1 = 1 ; //TIMER2 prescaler 1:16

T2CKPS0 = 0 ;

TMR2ON = 1 ; //TIMER2 ON

Вспоминая то, что мы видели выше, можно, произведя несложный рассчёт, получить время полного периода, а следовательно и частоту

T = (255+1)*4*16*0.25 = 4096 микросекунд.

Следовательно частота будет 4000000 / 4 / 4096 ≈ 244,14 герц.

На 4 мы ещё делим, так как длина одного такта это частота генератора, разделённая на 4.

Заранее мы не будем настраивать длительность импульса PWM. Мы будем его менять для каждого модуля, а следовательно и для выходных их ножек в бесконечном цикле.

И для удобства изменения длительности ипульса PWM мы добавим функцию установки данного периода выше функции main()

void SetPWM ( unsigned char nm, unsigned int dc)

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

Добавим в тело нашей функции оператор вариантов switch, который будет определять номер модуля

void SetPWM ( unsigned char nm, unsigned int dc)

switch (nm)

case 1 :

break ;

case 2 :

break ;

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

CCPR1L = dc>> 2 ;

CCP1CON &= 0xCF ;

Мы сначала занесём старшие 8 бит в регистр CCPR1L, затем в регистре CCP1CON очистим 5 и 4 биты, а затем, пользуясь удобной операцией сдвига и маской, очищающей все биты кроме двух младших, занесём 2 старших бита значения периода в 5 и 4 биты регистра CCP1CON.

Аналогичные действия проделаем и для второго модуля

CCPR2L = dc>> 2 ;

CCP2CON &= 0xCF ;

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

Сначала занесём первоначальные настройки длительностей циклов наших каналов PWM

SetPWM( 1 , i);

SetPWM( 2 , 1023 -i);

Если флаг fl1 у нас будет равен нулю, то значит возрастать будет скважность первого канала, а если единице – то второго.

В соответствии с этим условием напишем дальнейший код

SetPWM( 2 , 1023 -i);

if (fl== 0 ) i++;

else i—;

if (i> 1023 ) fl= 1 ;

else if (i 0 ) fl= 0 ;

Соберём код, прошьём контроллер.

После этого, если всё сделано и подключено правильно, мы должны будем наблюдать следующую картину в программе логического анализа (нажмите на картинку для увеличения изображения)

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

else if (i 0 ) fl= 0 ;

__delay_us( 500 );

Мигать мы будем светодиодами, расположенными на плате – первым и вторым. Но, так как они подключены к совершенно другим ножкам (RB0 и RB1), то сначала снимем соответствующие соединительные перемычки

Отключим логически анализатор и соединим ножки контроллера CCP1 и CCP2 с соответствующими ножками светодиодов. Светодиоды начнут попеременно плавно мигать

Таким образом, в данном уроке мы изучили третий режим модулей CCP – режим PWM. И на этом мы заканчиваем изучение модулей CCP.

Всем спасибо за внимание!

Купить программатор (неоригинальный) можно здесь: PICKit3

Купить программатор (оригинальный) можно здесь: PICKit3 original

Отладочную плату PIC Open18F4520-16F877A можно приобрести здесь: PIC Open18F4520-16F877A

Логический анализатор 16 каналов можно приобрести здесь

Смотреть ВИДЕОУРОК (нажмите на картинку)

Программируемый таймер на PIC16F628A

Цифровой программируемый таймер – это устройство для управления включением/выключением внешних устройств по заданной программе.

Устройство собрано на 8-разрядном микроконтроллере Microchip PIC16F628A. Пользователь программирует устройство на включение и выключение нагрузки в определенное время. Другими словами, пользователь может указать время включения устройства и продолжительность его работы. Максимальный временной интервал для каждой операции (включение/выключение) составляет 99 часов 59 минут.

В устройстве для управления используется 4-х кнопочная клавиатура, для отображения текущих настроек и параметров установлен 2-строчный ЖК дисплей на базе контроллера HD44780.

Принципиальная схема устройства

Для управления нагрузкой в устройстве используется 5 В реле, управляемое транзистором PN2222. В свою очередь, транзистором управляет микроконтроллер по линии ввода/вывода RB3. Клавиатура подключена к выводам порта RA2, RA3, RA4 и RB0. Назначение кнопок мы рассмотрим ниже.

ЖК дисплей используется для отображения текущего статуса устройства, времени, меню и параметров. Подключен и работает в 4-битном режиме, поэтому для управления дисплеем потребуется лишь 6 выводов микроконтроллера. Пьезоэлектрический звуковой излучатель предназначен для звукового оповещения при включении и выключении нагрузки, а также при включении и выключении самого таймера.

Установлен интегральный регулятор напряжения LM7805, для питания таймера используется внешний 9 В блок питания.

На схеме видно, что выводы 15 и 16 ЖК индикатора не подключены. Они используются в индикаторах с фоновой подсветкой. Если вы будете использовать индикатор с подсветкой, то вы можете подключить ее к источнику питания через гасящий резистор номиналом 39 Ом.

Внешний вид устройства собранного на макетной плате

Настройка и работа с устройством

Как уже было отмечено выше, все настойки таймера выполняются с клавиатуры.

  • кнопка «ON/OFF Time»
    Таймер позволяет устанавливать время включения и время выключения. При включении таймера проходит инициализация, и оба временных параметра (время включения и время выключения) имеют значение 0. Нажимая на данную кнопку, можно переключаться между этими параметрами;
  • кнопка «Select»
    С помощью данной кнопки пользователь может переключаться между значениями выбранного параметра (часы, минуты времени включения и выключения). Инкрементирование значения происходит по нажатию кнопки «ON/OFF Time»;
  • кнопка «Enter»
    Когда нужные значения параметров установлены, данной кнопкой пользователь подтверждает их сохранение;
  • кнопка «Start/Stop»
  • Кнопка предназначена для запуска/остановки таймера. Если таймер включен, то нажатием этой кнопки его можно остановить в любой момент времени.

Демонстрация работы таймера.

Читайте также  Как связать микроконтроллер и компьютер по каналу rs-232

В этом ролике мы видим, что пользователь задает временной интервал выключенного состояния внешнего устройства — 2 минуты, а временной интервал включенного состояния – 20 минут. По нажатию копки «Start/Stop» таймер начинает отсчет времени выключенного состояния. По окончании этого интервала срабатывает реле и начинается отсчет времени включенного состояния.

Программное обеспечение для микроконтроллера разработано с применением компилятора MicroC Pro для PIC микроконтроллеров.

Загрузки

Исходный код – скачать
HEX файл для прошивки микроконтроллера – скачать

Перевод: Vadim по заказу РадиоЛоцман

Микроконтроллеры PIC для начинающих

На современном рынке есть ряд семейств и серий микроконтроллеров от разных производителей, среди них можно выделить AVR, STM32 и PIC. Каждое из семейств нашло свою сферу применения. В этой статье я расскажу начинающим о микроконтроллерах PIC, а именно, что это такое и что нужно знать для начала работы с ними.

Что такое PIC

PIC – это название серии микроконтроллеров, которые производятся компанией Microchip Technology Inc (США). Название PIC происходит от Peripheral Interface Controller.

Микроконтроллеры PIC имеют RISC-архитектуру. RISC – сокращённый набор команд, используется также в процессорах для мобильных устройств. Есть целый ряд примеров её использования: ARM, Atmel AVR и другие.

Компания Microchip в 2016 году купила Atmel – производителя контроллеров AVR. Поэтому на официальном сайте представлены микроконтроллеры семейства и PIC и AVR.

Семейства

Среди 8-битных микроконтроллеров PIC она состоит из 3-х семейств, которые отличаются архитектурой (разрядностью и набором команд).

Baseline (PIC10F2xx, PIC12F5xx, PIC16F5x, PIC16F5xx) ;

Mid-range (PIC10F3xx, PIC12F6xx, PIC12F7xx, PIC16F6xx, PIC16F7xx, PIC16F8xx, PIC16F9xx) ;

Enhanced Mid-range (PIC12F1xxx, PIC16F1xxx) ;

High-end или PIC18 (18Fxxxx, 18FxxJxx and 18FxxKxx).

Характеристики, которых приведены в таблице ниже.

Кроме 8 битных микроконтроллеров компания Microchip производит 16-битные:

DsPIC30/33F для обработки сигналов.

Представители 16-битного семейства работают со скоростью от 16 до 100 MIPS (выполнено миллионов инструкций в секунду). Стоит отметить и особенности:

машинный цикл – 2 такта;

разрядность АЦП – 16 бит;

поддерживают ряд протоколов связи (UART, IrDA, SPI, I2S™, I2C, USB, CAN, LIN and SENT), ШИМ и прочее.

Также есть семейство 32 битных микроконтроллеров – PIC32MX, основные особенности:

работают на частоте до 120 мГц;

выполняют до 150 MIPS;

АЦП: 10-бит, 1 Msps (скорость квантования), до 48 каналов.

С какого PIC начать?

Новичкам стоит начать осваивать микроконтроллеры PIC с 8-битной линейки. Вообще, производитель заявляет о том, что особенностью всего семейства является лёгкая переносимость программ с одного семейства на другое и совпадения цоколевки ряда моделей.

Одним из популярнейших в среде радиолюбителей микроконтроллеров является PIC16f628A. Его технические характеристики такие:

Есть встроенный тактовый генератор. Вы можете настроить для работы с частотой 4 или 8 МГц;

18 пинов, из них 16 – ввод/вывод, а 2 – питание;

Для работы на частотах до 20 МГц можно подключить кварцевый резонатор, но в этом случае на ввод/вывод останется не 16, а 14 ног;

В маркировке есть буква F, это значит, что используется FLASH-память, объёмом в 2048 слов;

14-битные инструкции, 35 штук;

4 аналоговых входа;

На входах PORTB есть подтягивающие резисторы;

Два 8-битных таймера и один 16-битный;

Машинный цикл – 4 такта кварцевого резонатора или внутреннего генератора);

128 байт EEPROM;

USART – последовательный порт;

внутренний источник опорного напряжения;

питается от 3.3 до 5 В.

Причинами популярности является низкая цена и возможность тактирования от внутреннего генератора.

Какая цоколевка у 16f628 изображено ниже:

Блочная внутренняя схема этого микроконтроллера изображена ниже.

На что следует обратить внимание на схеме в первую очередь?

У этого микроконтроллера есть два порта PORTA и PORTB. Каждый пин, каждого из них может использоваться как вход и выход, а также для подключения периферии или задействования других модулей микроконтроллера.

Рассмотрим эту часть схемы крупно.

Например, порты RB0-RB3 – могут выступать в роли аналоговых. К RA6, RA7 в случае необходимости подключается источник тактирования (кварцевый резонатор). Сами же выводы микроконтроллера настраиваются в режим входа/выхода с помощью регистра TRIS.

Для этого есть команды типа:

TRISA = 0; // Все выводы порта А устанавливаются как выходы
TRISB = 0xff; // Все выводы порта B назначаются как входы
TRISA0 = 1; // Так назначается отдельный пин как вход (1) или выход (0)
TRISA5 = 1 ; // здесь 5 вывод порта А – назначен входом

Вообще режимы работы, включение WDT (сторожевого таймера) выбор источника тактирования микроконтроллера и прочее настраивается с помощью регистров специального назначения — SFR, а память и данные хранятся в GFR – простыми словами это статическое ОЗУ.

В официальном Datasheet, на страницах 18-21 вы найдете 4 банка памяти регистров специального назначения SFR и регистров общего назначения GFR. Знание регистров важно, поэтому распечатайте и выучите указанные страницы из Datasheet .

Для удобства ниже приведены эти таблицы в виде картинок (нумерация регистров, как и всё в цифровой электронике начинается с 0, поэтому номер четвертого – 3).

Как подключить и на каком языке программировать?

Чтобы запустить этот микроконтроллер достаточно подать плюс на Vdd и минус на Vss. Если нужен кварцевый резонатор, то он подключается к выводам 16 и 15 (OSC1 и OSC2) микроконтроллера PIC16f628, для других контроллеров с большим или меньшим числом выводов – смотрите в datasheet. Но этот момент нужно указывать при программировании и прошивке.

Кстати о переносимости и совпадении цоколевки – на 16f84A – она аналогична, и на многих других.

Фрагмент схемы с подключенным к pic16f628a внешним резонатором:

Есть два основных языка для программирования микроконтроллеров PIC – это assembler и C, есть и другие, например PICBasic и т.д. Еще можно выделить упрощенный язык программирования JAL (just another language).

Для примера ниже приведена программа для «мигания светодиодом» — своего рода «Hello World» для микроконтроллера PIC на языке C.

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

В функции main(void) в начале устанавливаются начальные параметры, подобно тому как мы это делали в функции Void setup () – в статьях об ардуино. Далее в строках 11-16 объявляется бесконечный цикл while(1), в ходе которого и выполняется программа «мигания светодиодом».

В примере состояние порта постоянно инвертируется, т.е. если он был в «0», то перейдет в «1» и наоборот. На C для PIC есть следующие команды управления команды:

PORTA = 0; // переводит все пины порта А в низкий уровень (лог. 0)
PORTB = 0xff; // переводит все пины порта B в высокий уровень (лог. 1)
RB5 = 1; // На пятом выводе порта B высокий уровень

А так выглядит та же программа, но уже на языке JAL, я перевел на русский язык комментарии от разработчиков встроенных примеров в JALedit (среда разработки).

Возникает соблазн выбрать JAL, и вам он может показаться проще. Безусловно на нём можно реализовать любые проекты, но с точки зрения пользы для вас как для специалиста – это бесполезный язык. Значительно больших результатов вы добьетесь, изучая синтаксис и принципы программирования на языке C (большая часть популярных сейчас языков C-подобны) или на Assembler – это низкоуровневый язык, который заставит вас понимать принцип работы устройства и что происходит в программе в каждый конкретный момент времени.

В чем работать

Если сказать совсем обобщенно для работы с любыми микроконтроллерами нужно:

1. Текстовый редактор.

3. Программа для загрузки прошивки в микроконтроллер.

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

Например, в цикле статей об Arduino мы рассматривали среду Arduino IDE в ней же мы и код писали и с её помощью «заливали» прошивку в «камень». Для микроконтроллеров PIC есть такие программы, как:

MPASM — используется для разработки на языке Assembler от фирмы Microchip ;

MPLAB — также IDE от Microchip для PIC-контроллеров. Состоит из множества блоков для тестирования, проверки, работы с кодом и компиляции программ и загрузки в микроконтроллер. Также есть версия MPLAB X IDE – отличается большим функционалом и построена на базе платформы NetBeans ;

MikroC — универсальная среда (не только для ПИКов) для разработки. Как видно из названия «заточена» под программирование на C, а также есть такие программы как MikroBasic и MikroPascal, для соответствующих языков ;

JALedit — подходит для языка JAL, о котором мы упоминали выше ;

И ряд других менее известных.

Как прошивать микроконтроллер?

Для PIC-микронотроллеров есть ряд программаторов. Официальным считается PICkit. Их 4 версии. Но можно прошивать и универсальными, например, TL866 (он поддерживает почти всё, что может понадобится начинающему радиолюбителю, при этом очень дешевый).

Также в сети есть ряд различных схем программаторов для ПИКов, как для работы через COM-порт:

Так и через USB (на самом деле тоже com, только через преобразователь на ИМС MAX232).

Заключение

Микроконтроллеры PIC16 подходят для простых проектов, типа простой автоматики, вольтметров, термометров и прочих мелочей. Но это не значит, что нельзя делать на этом семействе сложные и большие проекты, я привел пример того для чего чаще всего их используют. Для общего представления рекомендую посмотреть несколько видео:

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

Катцен С. — PIC-микроконтроллеры. Все что вам необходимо знать;

Кёниг А. — Полное руководство по PIC микроконтроллерам;

Шпак Ю.А. — Программирование на языке С для AVR и PIC микроконтроллеров;

Магда Ю.С. — Микроконтроллеры PIC: архитектура и программирование;

Яценков В.С. — Микроконтроллеры Microchip. Практическое руководство.

Любите умные гаджеты и DIY? Станьте специалистом в сфере Internet of Things и создайте сеть умных гаджетов!

Записывайтесь в онлайн-университет от GeekBrains:

Изучить C, механизмы отладки и программирования микроконтроллеров;

Получить опыт работы с реальными проектами, в команде и самостоятельно;

Получить удостоверение и сертификат, подтверждающие полученные знания.

Starter box для первых экспериментов в подарок!

После прохождения курса в вашем портфолио будет: метостанция с функцией часов и встроенной игрой, распределенная сеть устройств, устройства регулирования температуры (ПИД-регулятор), устройство контроля влажности воздуха, система умного полива растений, устройство контроля протечки воды.

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