Реализация ШИМ на PIC-контроллерах. Пестунов Д.А

Осваиваем простейший микроконтроллер PIC. Часть 2

Реализация ШИМ на PIC-контроллерах. Пестунов Д.А

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

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

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

Для примера, взглянем на таблицу регистров, имеющих отношение к цифровым входам\выходам порта B:

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

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

Регистр TRISB отвечает за направление данных через порт. Каждый из 8 битов регистра привязан к соответсвующей ножке МК.

Присвоив нужному биту единицу — мы сделаем из него вход, а присвоив ноль — выход. Именно в этом регистре мы меняли биты через переменные pin_Bx_direction.

В регистре OPTION_REG к порту относится только старший бит:

RBPU: PORTB Pull-up Enable bit 1 = PORTB pull-ups are disabled

0 = PORTB pull-ups are enabled by individual port latch values

Этот бит отвечает за подключение внутренней подтяжки, о которой было упоминание в первой части. По таблице видно, что изначально подтяжка выключена, а значит при отсутствии внешней подтяжки необходимо включить внутреннюю самостоятельно:OPTION_REG_NRBPU = 0 При желании узнать принцип работы конкретного модуля поближе всегда можно найти в документации принципиальную схему.

Прерывания

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

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

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

В выбранном нами МК 16f628a имеется 10 возможных источников прерываний:

  • внешний источник прерываний INT
  • изменение уровня сигнала на цифровых входах RB4:7
  • переполнение таймера TMR0
  • переполнение таймера TMR1
  • совпадение TMR2 и PR2
  • завершение записи в EEPROM
  • изменение выходного уровня компаратора
  • получение\завершение отправки данных через USART
  • прерывания от модуля CCP

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

Для разрешения прерываний, управляемых регистром PIE1 необоходимо разрешить прерывания от перифирии битом PEIE в регистре INTCON.
После выбора необходимых источников прерываний необходимо глобально разрешить прерывания битом GIE в регистре INTCON.

Для каждого прерывания имеется еще один бит в регистре INTCON или PIR1 — флаг прерывания.

При срабатывании прерывания соответсвующему флагу присваивается значение 1, по которому можно легко определить какое из прерываний сработало. Сбрасывать флаги прерываний необходимо вручную после входа в обработчик прерываний, иначе при нескольких источниках разобрать кто конкретно его вызвал будет невозможно. В качестве примера использования прерываний перепишем нашу программу по миганию светодиодом. Воспользуемся источником прерываний INT. В зависимости от состояния бита INTEDG в регистре OPTION прерывание будет генерироваться либо по переднему фронту сигнала (переход с низкого уровня к высокому), либо по заднему. Для изменения уровня сигнала на INT неободимо перенести кнопку на соответсвующую ногу (pin 6).include 16f628a — target PICmicro

pragma target clock 4_000_000 — указываем рабочую частоту, необходимо для некоторых функций расчета времени — конфигурация микроконтролераpragma target OSC INTOSC_NOCLKOUT — используем внутренний кварц
pragma target WDT disabled — сторожевой таймер отключен
pragma target PWRTE disabled — таймер питания отключен
pragma target MCLR external — внешний сброс активен
pragma target BROWNOUT disabled — сбос при падении питания отключен
pragma target LVP disabled — программирование низким напряжением отключено
pragma target CPD disabled — защита EEPROM отключена
pragma target CP disabled — защита кода отключена —enable_digital_io() — переключение всех входов\выходов на цифровой режим —alias led is pin_B5 — светодиод подключен к RB5
pin_B5_direction = output — настраиваем RB5 как цифровой выход —alias button is pin_B0 — кнопка подключена к RB0
pin_B0_direction = input — настраиваем RB0 как вход
var volatile bit led_blink = false — объявляем переменную — настраиваем прерываниеINTCON_INTE = on — разрешаем прерывание по изменению сигнала на INT
INTCON_INTF = off — сбрасываем флаг прерывания по INT
OPTION_REG_INTEDG = 0 — генерировать прерывания при переходе 1->0
INTCON_GIE = on — включаем обработку прерываний — обработчик прерывания INTprocedure INT_ISR is
pragma
interrupt
if INTCON_INTF then — проверяем флаг нужного нам прерывания
INTCON_INTF = off — сбрасываем флаг прерывания
led_blink = !led_blink — перключаем флаг светодиода
end if end procedureled = off — выключаем светодиод
forever loop
led = off — выключаем светодиод
_usec_delay(100000) — ждем 0,1 сек
if led_blink then — моргаем только при активном флаге
led = on — ждем 0,1 сек
_usec_delay(100000) — ждем 0,1 сек
end if end loop Увы, это не самый оптимальный вариант по двум причинам:

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

Таймеры

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

TMR0

  • 8-битный таймер (считает от 0 до 255)
  • тактируется либо от системной частоты, либо от внешнего источника
  • может считать как передние, так и задние фронты тактируемого сигнала
  • 8-битный предделитель (может считать каждый второй, каждый 4… каждый 256 сигнал)
  • прерывание генирируется при переполнении (при переходе от 255 к 0)
  • таймер работает постоянно

Что нам это дает? При тактировании от системной частоты (в нашем случае — 4 MHz/4 = 1 Mhz) таймер будет генерировать прерывания с постоянной частотой. Не сложно посчитать, что без предделителя прерывания будут иметь частоту 3906,25 Гц. Для светодиода — многовато. Предделитель может на порядок (двойчный, т.е. в 2 раза) уменьшить частоту восемь раз. При предделителе 1:256 мы получим частоту в 15.3 Гц. Мигание светодиодом с такой частотой вполне различимо человеческим глазом. При тактировании МК от внешнего кварца можно добиться другого диапазона частот. При тактировании таймера от внешнего источника таймер превращается в счетчик внешних импульсов. В принципе счета ничего не меняется, просто в зависимости от источника может не получиться постоянная частота прерываний. Счетчиком можно считать количество нажатий кнопки, оборотов колеса и пр. При этом никто не обязывает считать от нуля до прерывания: текущее значение счетчика всегда доступно как для чтения, так и для записи.При желании в режиме таймера можно увеличить частоту прерываний изменяя стартовое значение счетчика при каждом прерывании, но так как за время перехода на процедуру обработки уйдет неизвестное время, точно расчитать частоту не удастся.

TMR1

Основные отличия таймера от TMR0:

  • данный таймер 16-битный
  • таймер может тактироваться не только от внешнего источника, но и от дополнительного часового кварца
  • максимально доступный предделитель — 1:8
  • таймер может считать только передние фронты сигнала
  • таймер может использоваться модулем CCP
  • таймер можно отключать

Использовать TMR1 можно так же, как и TMR0: или для генерирования определенной частоты, или для подсчета импульсов.

TMR2

Данный 8-битный таймер имеет несколько иной принцип работы. Тактироваться он может только от системной частоты. Предделитель может быть выставлен только на значения 1:1, 1:4 или 1:16. Полученные импульсы таймер считает от нуля и до предварительно заданного значения PR2.

После совпадения TMR2 и PR2 подается сигнал на 4-битный постделитель, и только после переполнения постделителя генерируется прерывание. Благодаря такой схеме можно корректировать конечную частоту прерываний с минимальным шагом.

Помимо постделителя, сигнал при совпадении PR2 может идти на модуль CCP в качестве базы тайминга ШИМ. Как и TMR1, данный таймер можно отключить.

Пример использования

В качестве примера зададим частоту мигания светодиода таймером TMR1. Список всех необходимых переменных можно узнать из таблицы: Описание каждого бита можно найти в документации на микроконтроллер.

include 16f628a — target PICmicro

pragma target clock 4_000_000 — указываем рабочую частоту, необходимо для некоторых функций расчета времени — конфигурация микроконтролераpragma target OSC INTOSC_NOCLKOUT — используем внутренний кварц
pragma target WDT disabled — сторожевой таймер отключен
pragma target PWRTE disabled — таймер питания отключен
pragma target MCLR external — внешний сброс активен
pragma target BROWNOUT disabled — сбос при падении питания отключен
pragma target LVP disabled — программирование низким напряжением отключено
pragma target CPD disabled — защита EEPROM отключена
pragma target CP disabled — защита кода отключена —enable_digital_io() — переключение всех входов\выходов на цифровой режим —alias led is pin_B5 — светодиод подключен к RB5
pin_B5_direction = output — настраиваем RB5 как цифровой выход — — настраиваем таймерT1CON_T1CKPS = 0b_11 — предделитель, 2 бита
T1CON_TMR1CS = 0 — тактирование от системной частоты
PIE1_TMR1IE = on — разрешаем прерывание от TMR1
PIR1_TMR1IF = off — сбрасываем флаг прерывания от TMR1
INTCON_PEIE = on — разрешаем прерывания от периферии
T1CON_TMR1ON = on — включаем таймер
INTCON_GIE = on — включаем обработку прерываний — ;таймер тактируется от Fosc/4 : 4MHz/4 = 1 Mhz ;предделитель установлен на 1:8 : 1Mhz/8 = 125 kHz ;таймер — 16 бит : 125 kHz/65536 = 1.9 Hz ;светодиод включится и выключится за 2 прерывания : итоговая частота моргания 0,95 Hz — — обработчик прерывания TMR1procedure TMR1_ISR is
pragma
interrupt
if PIR1_TMR1IF then — проверяем флаг нужного нам прерывания
PIR1_TMR1IF = off — сбрасываем флаг прерывания
led = !led — переключаем состояние светодиода
end if end procedure forever loop— полностью свободный основной цикл
end loop

CCP

Модуль CCP (Capture/Compare/PWM) предназначен для измерения и формирования импульсных сигналов.

Capture

В режиме захвата модуль использует TMR1 в качестве измерителя времени. Как только на ножке CCP1 (pin 9) возникнет отслеживаемое событие, модуль сохранит текущее 16-битное значение TMR1 в регистры CCPR1H:CCPR1L.

Такими событиями могут быть:

  • каждый задний фронт сигнала
  • каждый передний фронт сигнала
  • каждый четвертый передний фронт
  • каждый 16 передний фронт

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

Compare

В режиме сравнения модуль рабоает в обратном направлении: как только значение в регистрах CCPR1H:CCPR1L совпадет с текущим значением TMR1, модуль может выставить 1 или 0 на ножке CCP1 (pin 9) или просто сгенерировать прерывание. Так же при совпадении модуль может обнулить TMR1.

Замеряя необходимые промежутки времени можно формировать импульсы определенной формы. Например, для управления положением сервомашинки требуется подавать на сигнальную линию импульсы высокого уровня длиной 700-2200 мкс с частотой 50 Hz.

В зависимости от длины импульса серво установит свое положение либо в одно крайнее положение (700 мкс), либо в другое (2200 мкс), либо приблизительно по центру (1500 мкс).

PWM

В режиме ШИМ модуль самостоятельно формирует сигнал с частотой, генерируемой таймером TMR2, и заданной 10-битной скважностью. Что такое ШИМ-сигнал? Микроконтроллер может выдавать только цифровой сигнал — логические 1 и 0. В ШИМ сигнале с постоянной частотой первую часть периода на выход подается 1, а вторую часть — 0.

Меняя соотношение длительности обоих частей меняется скважность сигнала. Скважность ШИМ — это соотношение продолжительности импульса логической единицы и периода ШИМ. 10-битный ШИМ может обеспечить точность изменения скважности в 1/1024 длительности периода.

Как этим можно пользоваться? Так как частота сигнала достаточно велика, то низкоскоростным нагрузкам будет казаться, что они получают напряжение, равное проценту скважности от максимума. Таким образом из ШИМ у нас выйдет обычный аналоговый выход с диапазоном напряжения от 0 до Vdd (в нашем случае — 5В).

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

Пример использования библиотеки:— настраиваем ШИМ
pin_CCP1_direction = output — настраиваем pin 9 как выход
include pwm_hardware — подключаем библиотеку, упрощающую работу с ШИМ
pwm_max_resolution(4) — устанавливаем значение предделителя TMR2 для выбора нужной частоты (976 Hz)
pwm1_on() — включаем ШИМ var bit fade_type = 1 — переменная для направления изменения яркости
var byte i = 0 — переменная для текущего уровня яркости

forever loop
— меняем текущее значение
if fade_type then
i = i + 1
if i == 100 then
fade_type = 0
end if elsei = i — 1
if i == 0 then
fade_type = 1
end if end ifpwm1_set_percent_dutycycle(i) — применяем новое значение яркости
_usec_delay(20000) — делаем паузу, иначе процесс изменения яркости будет очень быстрым
end loop

Компараторы

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

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

В зависимости от настроек, компараторы могут работать в восьми режимах:

По схемам хорошо видно какие напряжения сравниваются в каждом режиме, стоит только пояснить что такое опорное напряжение Vref.

Источник опорного напряжения

Это еще один небольшой модуль, обычно требуется только для работы компараторов. Единственная задача модуля — разделить напряжение питания до нужного значения. Модуль представляет из себя простой делитель на 16 резисторах. Все, что он умеет — выделить пониженное до нужного значения напряжение из питания. При питании 5В модуль может выдать напряжение от 0 до 3.6В.

EEPROM

В микроконтроллере 16f628a нам доступно 128 байт энергонезависимой памяти. При использовании ассемблера нам пришлось бы много прочитать про порядок записи и чтения в память, нам же понадобится лишь подключить одну бибилотеку для работы с eeprom.

Для подключения библиотеки достаточно написатьinclude pic_data_eeprom после чего нам становится доступным ряд процедур и функций: data_eeprom_read([offset],[byte]) — процедура читает байт с номером [offset] и — заносит результат в переменную [byte] data_eeprom_write([offset],[byte]) — процедура записвает полученный байт [byte] на место [offset] data_eeprom_read_word([offset],[word]) — процедура считывает 2 байта: [offset] и [offset]+1 data_eeprom_write_word([ofset],[word]) — процедура записывает 2 байта подряд data_eeprom_read_dword([offset],[dword]) — процедура считывает 4 байта подряд data_eeprom_write_dword([offset],[dword]) — процедура записывает 4 байта подряд [byte] = data_eeprom([offset]) — чтение байта через функцию [word] = data_eeprom_word([offset]) — чтение двух байт через функцию [dword] = data_eeprom_dword([offset]) — чтение 4 байт через функцию Единственное, о чем нужно помнить — о размере памяти. Записать dword по смещению 128 в данном случае не удастся.

USART

USART — последовательный порт ввода-вывода. Данный модуль предназначен для связи микроконтроллера с другими устройствами.

Для организации канала связи достаточно лишь соединить Rx каждого устройства с Tx другого.

При желании настроить режим работы модуля самостоятельно можно подробно изучить документацию на микроконтроллер, но нам снова понадобится лишь одна библиотека. Единственное, что нам требуется указать — скорость передачи данных. Максимальная скорость зависит от тактового сигнала МК. При 4 MHz рекомендуемая скорость — 2400.const serial_hw_baudrate = 2400 — задаем скорость
include serial_hardware — подключаем библиотеку
serial_hw_init() — производим настройку модуля
После настройки можно начинать принимать и передавать байты. serial_hw_write([byte]) — процедура отправки байта [byte] serial_hw_data = [byte] — отправка байта через псевдопеременную serial_hw_read([byte]):[boolean] — при наличии присланного байта заносит значение в — переменную [byte] и возвращает true — при отсуствии присланных данных возвращает false serial_hw_data_available — при наличии принятых байт данная переменная возвращает true, иначе — false [byte] = serial_hw_data — чтение байта через псевдопеременную, при отсутствии — принятых байт микроконтролер будет ожидать их прихода — при использовании такого способа чтения необходимо проверять — факт прихода данных Для организации связи с компьютером можно использовать UART-COM и UART-USB адаптеры. Впрочем, никто не мешает собрать их самостоятельно по схемам:

Внешний кварц

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

Подключать внешний кварц нужно к ногам OSC1 и OSC2 (pin16 и pin 15):
Для распространенных кварцев резистор не нужен, ёмкость конденсаторов выбирается в зависимости от частоты кварца.

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

Итоги

Вот мы и расмотрели основные возможности каждого модуля в микроконтроллере 16f628a.

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

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

Источник: https://habr.com/post/98147/

Реализация ШИМ на PIC-контроллерах — PDF Free Download

Реализация ШИМ на PIC-контроллерах. Пестунов Д.А

Система команд семейства PIC6 МНЕМОНИКА ОПИСАНИЕ ПРИМЕРЫ Цикл Флаги Байт-ориентированные команды ADDWF f, d Сложение W и f Сложить содержимое регистров W и f. : для ее выполнения необходимо обратиться

Подробнее

PIC16F87X Модули TMR0, TMR1, TMR2, CCP в микроконтроллерах PIC16F87X Перевод основывается на технической документации компании Microchip Technology Incorporated, USA. ООО Микро-Чип Москва — 2001 Распространяется

Подробнее

Лекция 7. Специальные функции и система команд микроконтроллеров серии PIC. Цели- задачи: Знать: Специальные функции микроконтроллеров серии PIC, особенности системы команд микроконтроллеров серии PIC.

Подробнее

PIC16F87X Однокристальные 8-разрядные FLASH CMOS микроконтроллеры компании Microchip Technology Incorporated PIC16F873 PIC16F874 PIC16F876 PIC16F877 Перевод основывается на технической документации компании

Подробнее

Справочник по среднему семейству микроконтроллеров PICmicro TM Раздел 6. Организация памяти Перевод основывается на технической документации компании Microchip Technology Incorporated, USA. ООО Микро-Чип

Подробнее

Справочник по среднему семейству микроконтроллеров PICmicro TM Раздел 14. Модуль CCP Перевод основывается на технической документации компании Microchip Technology Incorporated, USA. ООО Микро-Чип Москва

Подробнее

Справочник по среднему семейству микроконтроллеров PICmicro TM Раздел 29. Система команд Перевод основывается на технической документации компании Microchip Technology Incorporated, USA. ООО Микро-Чип

Подробнее

Использование 8 разрядного АЦП в микроконтроллерах PIC16C7X Статья основывается на технической документации компании Microchip Technology Incorporated, USA. ООО Микро-Чип Москва — 2001 Распространяется

Подробнее

Оглавление Справочное пособие по изучение пакета MPLAB 5.70….2 Настройка рабочего проекта….2 А.Меню пользователя….6 Список команд МК…8 Перечень макроопределений, встроенных в ассемблер MPASM…9

Подробнее

Вендор-ориентированный учебный курс в системе «Старшая профильно-профессиональная школа-вуз-работодатель»: «Программирование микроконтроллеров Microchip» Богураев М.В., Кисляков С.В. «УСЛОВНЫЕ ПЕРЕХОДЫ»

Подробнее

Вендор-ориентированный учебный курс в системе «Старшая профильно-профессиональная школа-вуз-работодатель»: «Программирование микроконтроллеров Microchip» Богураев М.В., Кисляков С.В. «ПЕРИФЕРИЙНЫЙ МОДУЛЬ

Подробнее

Министерство образования и науки Российской Федерации Сибирский государственный аэрокосмический университет имени академика М. Ф. Решетнева ОСНОВЫ МИКРОПРОЦЕССОРНОЙ ТЕХНИКИ: ПРОГРАММИРОВАНИЕ МИКРОКОНТРОЛЛЕРА

Подробнее

Министерство образования и науки Республики Казахстан Некоммерческое акционерное общество «Алматинский университет энергетики и связи» А.А. Копесбаева, З.В. Абдулина ПРОМЫШЛЕННЫЕ КОНТРОЛЛЕРЫ Учебное пособие

Подробнее

Справочник по среднему семейству микроконтроллеров PICmicro TM Раздел 5. ЦПУ и АЛУ Перевод основывается на технической документации компании Microchip Technology Incorporated, USA. ООО Микро-Чип Москва

Подробнее

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

Подробнее

ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ Государственное образовательное учреждение высшего профессионального образования САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ ПРОЕКТИРОВАНИЕ

Подробнее

Вендор-ориентированный учебный курс в системе «Старшая профильно-профессиональная школа-вуз-работодатель»: «Программирование микроконтроллеров Microchip» Богураев М.В., Кисляков С.В. «УПРАВЛЕНИЕ ПОРТОМ

Подробнее

PIC16F62X Однокристальные 8-разрядные FLASH CMOS микроконтроллеры компании Microchip Technology Incorporated Перевод основывается на технической документации DS40300B компании Microchip Technology Incorporated,

Подробнее

Вендор-ориентированный учебный курс в системе «Старшая профильно-профессиональная школа-вуз-работодатель»: «Программирование микроконтроллеров Microchip» Богураев М.В., Кисляков С.В. «ПЕРИФЕРИЙНЫЙ МОДУЛЬ

Подробнее

ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ «САМАРСКИЙ ГОСУДАРСТВЕННЫЙ АЭРОКОСМИЧЕСКИЙ УНИВЕРСИТЕТ имени академика С.П. КОРОЛЕВА» МИКРОКОНТРОЛЛЕРЫ СЕМЕЙСТВА PIC16F87X

Подробнее

Справочник по среднему семейству микроконтроллеров PICmicro TM Раздел 3. Сброс Перевод основывается на технической документации компании Microchip Technology Incorporated, USA. ООО Микро-Чип Москва — 2002

Подробнее

Микроконтроллеры PIC16F87X Методические указания к лабораторным работам 1-4 по курсу Основы микропроцессорной техники для студентов 4 курса факультета Радиотехники электроники и физики (специальности 201000

Подробнее

дата Отчет по лабораторной работе 4 «Работа с буферами данных» Оценка Бонус за (max 5) сложность подпись Цель работы: Ознакомиться с программными методами реализации буфера приёма/передачи данных. Задачи

Подробнее

Вендор-ориентированный учебный курс в системе «Старшая профильно-профессиональная школа-вуз-работодатель»: «Программирование микроконтроллеров Microchip» Богураев М.В., Кисляков С.В. «ПРОГРАММНАЯ ОБРАБОТКА

Подробнее

Федеральное агентство железнодорожного транспорта Уральский государственный университет путей сообщения Кафедра «Автоматика, телемеханика и связь на железнодорожном транспорте» А. Н. Попов РАЗРАБОТКА УСТРОЙСТВ

Подробнее

Разработка в рамках программы «Умная школа»: «Интеллектуальный эксперимент «Умный маятник» Богураев М.В., Флаксман Д.А. «Рабочие материалы за октябрь 2010 по разработке «Умный маятник»» Санкт — Петербург

Подробнее

Вендор-ориентированный учебный курс в системе «Старшая профильно-профессиональная школа-вуз-работодатель»: «Программирование микроконтроллеров Microchip» Богураев М.В., Кисляков С.В. «ЦИКЛЫ» Методические

Подробнее

ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ Государственное образовательное учреждение высшего профессионального образования САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ ПРИМЕНЕНИЕ

Подробнее

МИНОБРНАУКИ РОССИИ Федеральное государственное бюджетное образовательное учреждение высшего образования «Омский государственный технический университет» РАЗРАБОТКА И АССЕМБЛИРОВАНИЕ ПРОГРАММ В MPLAB IDE

Подробнее

Справочник по среднему семейству микроконтроллеров PICmicro TM Раздел 13. Таймер TMR2 Перевод основывается на технической документации компании Microchip Technology Incorporated, USA. ООО Микро-Чип Москва

Подробнее

Вендор-ориентированный учебный курс в системе «Старшая профильно-профессиональная школа-вуз-работодатель»: «Программирование микроконтроллеров Microchip» Богураев М.В., Кисляков С.В. «ОТНОСИТЕЛЬНАЯ АДРЕСАЦИЯ»

Подробнее

Вендор-ориентированный учебный курс в системе «Старшая профильно-профессиональная школа-вуз-работодатель»: «Программирование микроконтроллеров Microchip» Богураев М.В., Кисляков С.В. «ПРОГРАММНАЯ ОБРАБОТКА

Подробнее

дата Отчет по лабораторной работе 4 «АЦП. Компараторы. 7-сегментные индикаторы» Оценка Бонус за подпись (max 5) сложность Цель работы: Ознакомиться с модулем встроенного АЦП и компараторов МК. Задачи работы

Подробнее

Сервисная документация на плату управления Версия 01 от 25.04.2011 Лист пояснений и дополнений. Описание п/п 1 При включении питания схема сразу переходит в полный режим звуковой анимации. Базовый признак

Подробнее

дата Отчет по лабораторной работе 2 «Прерывания. Разработка обработчика прерываний» Оценка Бонус за подпись (max 5) сложность Цель работы: Ознакомиться с программированием прерываний микроконтроллеров

Подробнее

Лабораторная работа ТАЙМЕРЫ PIC18F4520. ПРЕРЫВАНИЯ. ЯЗЫК АССЕМБЛЕРА Версия 1.1 ЦЕЛЬ РАБОТЫ Получить навыки поиска необходимой информации в сети Интернет. Получить навыки установки необходимого программного

Подробнее

Бабкина Наталья Анатольевна. Микроконтроллеры серии PIC. Цели- задачи: Знать: Состав и назначение микроконтроллеров серии PIC, классификацию микроконтроллеров серии PIC, основные устройства микроконтроллеров

Подробнее

Некоммерческое акционерное общество АЛМАТИНСКИЙ УНИВЕРСИТЕТ ЭНЕРГЕТИКИ И СВЯЗИ Кафедра электроснабжения промышленных предприятий МИКРОПРОЦЕССОРНЫЕ СИСТЕМЫ В ЭЛЕКТРОЭНЕРГЕТИКЕ Методические указания и задания

Подробнее

В. Тимофеев osa@pic24.ru MPASM Простые решения для PIC16 (пособие для начинающих) Вступление…- 2 — Запись константы в регистр без участия WREG…- 3 — Обмен содержимого регистра и WREG…-

Подробнее

Регистровый состав и основные принципы работы с модулем USART микроконтроллера PIC18F458 Регистровый состав модуля USART… 1 Инициализация модуля USART… 2 Настройка скорости передачи… 3 Передача байтов…

Подробнее

PICFXX2 Однокристальные -разрядные FLASH CMOS микроконтроллеры с 0 разрядным АЦП компании Microchip Technology Incorporated PICF242 PICF252 PICF442 PICF452 Часть 6 (Таймеры и CCP модули) Перевод основывается

Подробнее

Вендор-ориентированный учебный курс в системе «Старшая профильно-профессиональная школа-вуз-работодатель»: «Программирование микроконтроллеров Microchip» Богураев М.В. «ЯЗЫК СИ ДЛЯ МИКРОКОНТРОЛЛЕРОВ PIC

Подробнее

Лабораторная работа 3 USART. EEPROM. Цель работы: Создание функций для работы с USART. Использование встроенного EEPROM. Задание Написать программу на языке ассемблера, которая считывает строку из последовательного

Подробнее

Федеральное агентство железнодорожного транспорта Уральский государственный университет путей сообщения Кафедра «Автоматика, телемеханика и связь на железнодорожном транспорте» И. А. Дубров М. Ю. Белошицкий

Подробнее

Программируемый таймер КР580ВИ53 (Отечественный аналог Intel i8253) Управление периферийными устройствами часто требует от микропроцессорной системы точного задания временных интервалов между управляющими

Подробнее

Сервисная документация на плату управления STL.CTR.02 Версия 01 от 23.04.2011 Лист пояснений и дополнений. Описание п/п 1 При включении питания схема сразу переходит в полный режим звуковой анимации. Базовый

Подробнее

Модуль 10 разрядного АЦП в микроконтроллерах PIC17C7XX Статья основывается на технической документации компании Microchip Technology Incorporated, USA. ООО Микро-Чип Москва — 2001 Распространяется бесплатно.

Подробнее

Справочник по среднему семейству микроконтроллеров PICmicro TM Раздел 11. Таймер TMR0 Перевод основывается на технической документации компании Microchip Technology Incorporated, USA. ООО Микро-Чип Москва

Подробнее

Универсальный синхронно-асинхронный приемопередатчик USART в микроконтроллерах PIC17C4X Статья основывается на технической документации компании Microchip Technology Incorporated, USA. ООО Микро-Чип Москва

Подробнее

Справочник по среднему семейству микроконтроллеров PICmicro TM Раздел 12. Таймер TMR1 Перевод основывается на технической документации компании Microchip Technology Incorporated, USA. ООО Микро-Чип Москва

Подробнее

PIC12F6XX Однокристальные 8-разрядные FLASH CMOS микроконтроллеры компании Microchip Technology Incorporated PIC12F629 PIC12F675 Перевод основывается на технической документации DS41190A компании Microchip

Подробнее

PIC18FXX2 Однокристальные 8-разрядные FLASH CMOS микроконтроллеры с 10 разрядным АЦП компании Microchip Technology Incorporated PIC18F242 PIC18F252 PIC18F442 PIC18F452 Часть 2 (Организация памяти) Перевод

Подробнее

ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ Государственное образовательное учреждение высшего профессионального образования «НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ ТОМСКИЙ ПОЛИТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ» УТВЕРЖДАЮ Проректор-директор

Подробнее

Модуль для работы с двумя шаговыми двигателями или восемью мощными биполярными выходами OUT9-1.x Фирма Фрактал Москва Зеленоград www.fractal.com.ru fractal@aha.ru (095) 536-33-36 1 Назначение

Подробнее

Министерство образования Российской Федерации Томский политехнический университет УТВЕРЖДАЮ Зав. каф. промышленной и медицинской электроники, профессор, д-р техн. наук Г. С. Евтушенко «24» октября 2003

Подробнее

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ СЕВЕРО-КАВКАЗСКАЯ ГОСУДАРСТВЕННАЯ ГУМАНИТАРНО-ТЕХНОЛОГИЧЕСКАЯ

Подробнее

Ввод и вывод информации через параллельные порты Методическое указание к лабораторной работе Краткие теоретические сведения: Устройство параллельных портов микроконтроллера o Подключение внешних устройств

Подробнее

Лекция 6. Микроконтроллеры серии PIC. Цели- задачи: Знать: Состав и назначение микроконтроллеров серии PIC, классификацию микроконтроллеров серии PIC, основные устройства микроконтроллеров серии PIC, их

Подробнее

Программирование микроконтроллеров PIC Автор курса: к.т.н. Драч В.Е. (доц. ЭИУ1-КФ) Раздел: Ассемблер для микроконтроллеров Микроконтроллер и ПЛИС. Сравнение Редакция 7 1 1. ШИМ — Широтно-импульсная модуляция

Подробнее

ГОУ ВПО «Новосибирский государственный технический университет» ООО «Электронные приборы и устройства» МУК-МП1 Применение микроконтроллеров 4 КОМПЛЕКС ЛАБОРАТОРНЫХ РАБОТ 4.3 Лабораторная работа 3. «Работа

Подробнее

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования «НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ ТОМСКИЙ ПОЛИТЕХНИЧЕСКИЙ

Подробнее

ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ Государственное образовательное учреждение высшего профессионального образования «Томский политехнический университет» УДК 621.325.5181.48.001.63 Методические рекомендации

Подробнее

TMR0, TMR1, TMR2, TMR3, ШИМы и регистры захвата в микроконтроллерах PIC17C4X Статья основывается на технической документации DS30412c компании Microchip Technology Incorporated, USA. ООО Микро-Чип Москва

Подробнее

ПРОМЫШЛЕННО-КОММЕРЧЕСКАЯ КОМПАНИЯ МИЛАНДР Техническое описание демонстрационно-отладочной платы для микроконтроллера 1886ВЕ2 и приемопередатчика интерфейса RS-232 5559ИН4. 1. Назначение и состав. Демонстрационно-отладочная

Подробнее

PIC1FXX2 Однокристальные -разрядные FLASH CMOS микроконтроллеры с 10 разрядным АЦП компании Microchip Technology Incorporated PIC1F242 PIC1F252 PIC1F442 PIC1F452 Часть 1 (Введение, Тактовый генератор,

Подробнее

Справочник по среднему семейству микроконтроллеров PICmicro TM Раздел 9. Порты ввода/вывода Перевод основывается на технической документации компании Microchip Technology Incorporated, USA. ООО Микро-Чип

Подробнее

Демонстрационно-отладочная плата Eval17. Техническое описание. 1. Общие положения. Демонстрационно-отладочная плата Eval17 (далее Eval17) предназначена для демонстрации функционирования микроконтроллеров

Подробнее

KiT_42(7).qxd 9/20/2004 12:53 PM Page 112 и технологии, 7 2004 Приемы и трюки использования встроенного компаратора в контроллерах Microchip Микроконтроллеры Microchip используются во многих устройствах,

Подробнее

MCU-AT45 PWM control module Микроконтроллерный ШИМ модуль Универсальный микроконтроллерный модуль MCU-AT45 на базе Atmel ATtiny45 для управления светодиодными драйверами Для управления яркостью свечения

Подробнее

МУЛЬТИПЛЕКСОР РЕЗУЛЬТАТ Лекция 14 Аналого-цифровое и цифро-аналоговое преобразование информации. Под аналого-цифровым преобразование понимается преобразование текущего уровня аналогового сигнала в цифровой

Подробнее

PIC18FXX2 Однокристальные 8-разрядные FLASH CMOS микроконтроллеры с 10 разрядным АЦП компании Microchip Technology Incorporated PIC18F242 PIC18F252 PIC18F442 PIC18F452 Перевод основывается на технической

Подробнее

11. Однокристальные PIC- контроллеры 11.1. Отличительные особенности PIC контроллеров Семейство МК 51, хотя и занимает в настоящее время первое место на отечественном рынке (около 25%), но постепенно сдает

Подробнее

Рекомендации по работе с АЦП в микроконтроллерах PIC16C7X Статья основывается на технической документации ООО Микро-Чип Москва — 2001 Распространяется бесплатно. Полное или частичное воспроизведение материала

Подробнее

PIC8FXX8 Однокристальные 8-разрядные FLASH CMOS микроконтроллеры с модулем CAN интерфейса компании Microchip Technology Incorporated PIC8F248 PIC8F258 PIC8F448 PIC8F458 Расширенный модуль ECCP (Захват/Сравнение/ШИМ)

Подробнее

PIC18FXX2 Однокристальные 8-разрядные FLASH CMOS микроконтроллеры с 10 разрядным АЦП компании Microchip Technology Incorporated PIC18F242 PIC18F252 PIC18F442 PIC18F452 Часть 5 (Порты ввода/вывода) Перевод

Подробнее

Вендор-ориентированный учебный курс в системе «Старшая профильно-профессиональная школа-вуз-работодатель»: «Программирование микроконтроллеров Microchip» Богураев М.В. «ЯЗЫК СИ ДЛЯ МИКРОКОНТРОЛЛЕРОВ PIC

Подробнее

Измеритель емкости и последовательного эквивалентного сопротивления электролитических конденсаторов — C/ESR-meter. Прибор предназначен для определения исправности электролитических конденсаторов путем

Подробнее

http://library.bntu.by/andre-filipp-mikrokontrollery-semeystva-sx-firmy-ubicom СОДЕРЖАНИЕ ПРЕДИСЛОВИЕ…10 ПРЕДИСЛОВИЕ ПЕРЕВОДЧИКА… 12 ГЛАВА 1. ЗНАКОМСТВО С МИКРОКОНТРОЛЛЕРАМИ СЕМЕЙСТВА S X…….13

Подробнее

Вендор-ориентированный учебный курс в системе «Старшая профильно-профессиональная школа-вуз-работодатель»: «Программирование микроконтроллеров Microchip» Богураев М.В., Кисляков С.В. «ВВОД ИНФОРМАЦИИ С

Подробнее

Справочник по среднему семейству микроконтроллеров PICmicro TM Раздел 26. Сторожевой таймер WDT и режим энергосбережения SLEEP Перевод основывается на технической документации компании Microchip Technology

Подробнее

Создание ассемблерных модулей Как создать перемещаемый код — исследуем вопрос http://progcode.narod.ru Введение..1 Создание перемещаемого модуля.2 — Исходные подпрограммы…2 — Начало модуля.3

Подробнее

ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ Государственное образовательное учреждение высшего профессионального образования «НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ ТОМСКИЙ ПОЛИТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ» УТВЕРЖДАЮ Проректор-директор

Подробнее

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования «НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ ТОМСКИЙ ПОЛИТЕХНИЧЕСКИЙ

Подробнее

Отличительные особенности: Генерация аналоговых сигналов с помощью ШИМ Высокочастотная масштабируемая синхронизация ШИМ Введение Данные «Рекомендации » являются руководством по использованию высокочастотного

Подробнее

Лаборатория электроники и программирования Электронный журнал с приложениями 1 Засыпкин С.В., 2011 Автор Засыпкин С.В. 1. Учебные занятия. 1.1. Программирование на языке С на примере микроконтроллера ATmega16A.

Подробнее

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ Государственное образовательное учреждение высшего профессионального образования «НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ ТОМСКИЙ ПОЛИТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ» УТВЕРЖДАЮ Проректор

Подробнее

Министерство образования и науки Российской Федерации Федеральное агентство по образованию Саратовский Государственный Технический Университет ИССЛЕДОВАНИЕ РЕГИСТРОВ Методические указания к выполнению

Подробнее

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования «НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ ТОМСКИЙ ПОЛИТЕХНИЧЕСКИЙ

Подробнее

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ Федеральное государственное автономное образовательное учреждение высшего образования «НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ ТОМСКИЙ ПОЛИТЕХНИЧЕСКИЙ УНИВЕРСИСТЕТ»

Подробнее

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования «НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ ТОМСКИЙ ПОЛИТЕХНИЧЕСКИЙ

Подробнее

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ Федеральное государственное автономное образовательное учреждение высшего образования «НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ ТОМСКИЙ ПОЛИТЕХНИЧЕСКИЙ УНИВЕРСИСТЕТ»

Подробнее

дата Отчет по лабораторной работе 3 «Работа с модулем асинхронного приёмо-передатчика UART» Оценка Бонус за подпись (max 5) сложность Цель работы: Ознакомиться с принципами работы асинхронного приёмо-передатчика

Подробнее

Модуль 10 разрядного АЦП в микроконтроллерах PIC18CXX2 Статья основывается на технической документации компании Microchip Technology Incorporated, USA. ООО Микро-Чип Москва — 2001 Распространяется бесплатно.

Подробнее

ЛАБОРАТОРНАЯ РАБОТА 6 ПРОГРАММИРОВАНИЕ ТАЙМЕРОВ ЧАСТЬ 2 Цель: Задание: получить общее представление о прерываниях, научиться использовать встроенный таймер0 и таймер1, закрепить знания о работе с портом

Подробнее

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ Государственное образовательное учреждение высшего профессионального образования «НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ ТОМСКИЙ ПОЛИТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»

Подробнее

Справочник по среднему семейству микроконтроллеров PICmicro TM Раздел 8. Прерывания Перевод основывается на технической документации компании Microchip Technology Incorporated, USA. ООО Микро-Чип Москва

Подробнее

Вендор-ориентированный учебный курс в системе «Старшая профильно-профессиональная школа-вуз-работодатель»: «Программирование микроконтроллеров Microchip» Богураев М.В., Кисляков С.В. «ОСНОВЫ РАБОТЫ В СРЕДЕ

Подробнее

Источник: https://docplayer.ru/25849740-Realizaciya-shim-na-pic-kontrollerah.html

Программная реализация трехканального ШИМ на микроконтроллере PIC12F629 (программа управления RGB-светодиодом)

Реализация ШИМ на PIC-контроллерах. Пестунов Д.А

Представленная ниже программа предназначена для управления RGB-светодиодом с помощью микроконтроллера PIC12F629.

Для этого в программе реализован программный трехканальный ШИМ (ссылку на статью, в которой описана теория того, как это реализовано, можно найти в конце этой статьи).

Каждый канал имеет разрядность 2 бита, позволяя таким образом сделать 22=4 различных уровня яркости свечения каждого кристалла, что в совокупности даёт возможность отобразить 4*4*4=64 различных цвета. Частота ШИМ — 100 Гц.

Алгоритм:

Поскольку для каждого канала мы используем 2 бита, то можно все три канала закодировать одним байтом (то есть каждый цвет можно кодировать одним байтом).В данной программе переменная «skor» служит для задания скорости смены цветов. Количество импульсов ШИМ с одной и той же уставкой (то есть кличество импульсов, отображающих один и тот же цвет) равно начальному значению переменной «skor». В нашем примере начальное значение «skor»=25, то есть каждая уставка действует в течении 25 импульсов (то есть один и тот же цвет отображается 25 раз). Поскольку частота у нас 100 Гц, то 25 импульсов — это 250 мс.Если есть желание организовать загрузку необходимых цветов с компьютера, то нужно делать аппаратный контроль передачи и, на время обработки подпрограммы прерывания от таймера, запрещать приём данных. Если этого не сделать, то пересылка данных может сбить частоту импульсов. В результате какое-то время некоторые светодиоды могут казаться максимально включенными, а другие — полностью выключенными.
list p = 12f629__config 01FC4h;*** Переменные ******************************************CBLOCK 0x20 ; Начальный адрес блокаCounter ; счётчик (1 полный импульс = 3 отсчётам счётчика)Temp ; вспомогательная переменнаяTemp2 ; ещё одна вспомогательная переменнаяSkor ; скорость смены цветовRGB1 ; адрес этой переменной 24hRGB2 ; в этих 7-ми байтах находятся наборы уставокRGB3 ; для 7-ми цветовRGB4 ; в каждом байте первые два бита для Blue,RGB5 ; вторые два бита для Green, третьи для RedRGB6RGB7 ; адрес этой переменной 2AhENDC;*** Константы / Адреса регистров ************************T1 equ .48 ; нач.значение аппаратн. счётчика = 255-207=48; 207*16=3328Status equ 03h ; Регистр выбора банкаGPIO equ 05h ; управление защелками порта (банк 0)Cmcon equ 19h ; Регистр компаратора (банк 0)TrisIO equ 05h ; выбор направления работы выводов порта (банк 1)INTCON equ 0Bh ; разрешение(1)/запрет(0) прерываний (любой банк)OPT_REG equ 01h ; Настройка таймера (банк 1)TMR0 equ 01h ; Регистр таймера (банк 0)OSCCAL equ 10h ; хранение калибров-ой константы (банк 1)INDF equ 0h ; Регистр косвенной адресацииFSR equ 04h ; Регистр адреса при косвенной адресации;*********************************************************; Пусть у нас GP0, GP1, GP5 — выходы управления RGB,; остальные ноги также сконфигурируем как выходы; GP5 — Blue, GP0 — Red, GP1 — Green; В силу того, что у нашего RGB общий плюс, имеем:; когда на ноге 0 — соответств-ий канал включен, когда 1 — выключен;********************************************************* org 0goto startorg 4;*** Подпрограмма прерывания от таймера ******************taimer_prerbcf INTCON,7 ; запрет прерыванийmovlw T1 ; устанавлив.начальн.значение счётчика T1movwf TMR0bsf Status,5 ; и предделительmovlw b'00000011'movwf OPT_REGbcf Status,5;*** Проверяем программный счётчик ***********************bcf Status,2 ; сбросить бит Zbtfsc Counter,2 ; если счётчик не= 4, — следующ.команда пропуск-сяclrf Counterbtfss Status,2 ; если выполн.обнуление, пропускаем след.командуgoto Proverka ; если счётчик не =0, то мы не отсчитали; целый импульс — переходим к проверкам;*** Сюда мы попадаем после каждого целого импульса ******;*** Проверяем указатель на текущую уставку **************;*** (если он равен 2Bh, то делаем его равным 24h) *******movlw 2Bhxorwf FSR,0btfss Status,2 ; если FSR не = 2Bh, — следующ.команда выполн.goto Nextmovlw 24hmovwf FSR;*** Уменьшаем Skor, если равна нулю, загружаем **********;*** новую уставку и выставляем начальное значение *******Next clrf GPIO ; зажигаем все светодиодыdecfsz Skor,1 ; если Skor = 0, — пропускаем следующую командуgoto Proverka;——————————movf INDF,0 ; читаем уставку по адресу, указанному в FSRmovwf Temp ; загружаем его в Tempincf FSR,1 ; переводим указатель на следующую уставкуmovlw .25 ; значение скоростиmovwf Skor;*** Сравниваем все значения с уставками, и переключаем если надоProverkaswapf Temp,0 ; после этого уст-ка Red будет в первых 2-х битах Wandlw b'00000011' ; выделяем уставку Redxorwf Counter,0 ; если счётчик=уставке, то установится флаг Zbtfsc Status,2 ; если Z=0, пропустить следующую командуbsf GPIO,0 ; погасить Red;—————————————movf Temp,0movwf Temp2 ; загружаем Temp в Temp2rrf Temp2,1rrf Temp2,0 ; сдвигаем на 2 бита вправо и записываем в Wandlw b'00000011' ; выделяем уставку Greenxorwf Counter,0 ; если счётчик=уставке, то установится флаг Zbtfsc Status,2 ; если Z=0, пропустить следующую командуbsf GPIO,1 ; погасить Green;—————————————movf Temp,0andlw b'00000011' ; выделяем уставку Bluexorwf Counter,0 ; если счётчик=уставке, то установится флаг Zbtfsc Status,2 ; если Z=0, пропустить следующую командуbsf GPIO,5 ; погасить Blue;*** Выход ***********************************************incf Counter,1 ; увеличиваем программный счётчикbcf INTCON,2 ; сбросить флаг прерывания от таймераbsf INTCON,7 ; разрешить прерыванияretfie ; выход;*********************************************************;*** КОНФИГУРИРОВАНИЕ КОНТРОЛЛЕРА ************************;*** Калибровка Генератора *******************************start bsf Status,5Call 3FFh ; Загрузить калибровочную константу в wmovwf OSCCAL;*** Установка направления работы и инициализация ног ****bcf Status,5 ; перейти в банк 0movlw .255 ; 00111111 — все выходы равны 1movwf GPIO ; инициализация защелокmovlw .7 ; биты 0..2 поднятьmovwf Cmcon ; компаратор выключенbsf Status,5 ; Перейти в 1-й банкclrf TrisIO ; все ноги сконфигурированы как выходы;*** Конфигурируем таймер и включаем предделитель ********clrwdtmovlw b'00000011' ; предделитель =16,movwf OPT_REG ; TMR0 работает от внутр.тактового сигналаbcf Status,5 ; переходим в банк 0;*** Конфигурируем начальные значения переменных *********clrf Tempmovlw .1movwf Skor ; чтобы в первом цикле попасть на загрузку уставокmovlw .4movwf Counter ; начальное значение счётчика равно 4movlw 24hmovwf FSR ; указатель на первую уставку;*** Записываем уставки **********************************movlw b'00110000' ; Красныйmovwf RGB1movlw b'00110100' ; Оранжевыйmovwf RGB2movlw b'00111100' ; Желтыйmovwf RGB3movlw b'00001000' ; Зеленыйmovwf RGB4movlw b'00001011' ; Голубойmovwf RGB5movlw b'00000011' ; Синийmovwf RGB6movlw b'00100010' ; Фиолетовыйmovwf RGB7;*** Разрешаем прерывания от таймера *********************clrf INTCON ; запретить все прерыванияbsf INTCON,5 ; Разрешить прерывания от таймераbsf INTCON,7 ; Разрешить немаскированные прерывания;*** РАБОЧАЯ ЧАСТЬ ***************************************;*** Сканирование наличия принятой информации ************Wait nop ; здесь проц может поделать что-то полезное,goto Wait ; пока не придёт прерывание от таймераend

list p = 12f629__config 01FC4h;*** Переменные ******************************************CBLOCK 0x20 ; Начальный адрес блокаCounter ; счётчик (1 полный импульс = 3 отсчётам счётчика)Temp ; вспомогательная переменнаяTemp2 ; ещё одна вспомогательная переменнаяSkor ; скорость смены цветовRGB1 ; адрес этой переменной 24hRGB2 ; в этих 7-ми байтах находятся наборы уставокRGB3 ; для 7-ми цветовRGB4 ; в каждом байте первые два бита для Blue,RGB5 ; вторые два бита для Green, третьи для RedRGB6RGB7 ; адрес этой переменной 2AhENDC;*** Константы / Адреса регистров ************************T1 equ .48 ; нач.значение аппаратн. счётчика = 255-207=48; 207*16=3328Status equ 03h ; Регистр выбора банкаGPIO equ 05h ; управление защелками порта (банк 0)Cmcon equ 19h ; Регистр компаратора (банк 0)TrisIO equ 05h ; выбор направления работы выводов порта (банк 1)INTCON equ 0Bh ; разрешение(1)/запрет(0) прерываний (любой банк)OPT_REG equ 01h ; Настройка таймера (банк 1)TMR0 equ 01h ; Регистр таймера (банк 0)OSCCAL equ 10h ; хранение калибров-ой константы (банк 1)INDF equ 0h ; Регистр косвенной адресацииFSR equ 04h ; Регистр адреса при косвенной адресации;*********************************************************; Пусть у нас GP0, GP1, GP5 — выходы управления RGB,; остальные ноги также сконфигурируем как выходы; GP5 — Blue, GP0 — Red, GP1 — Green; В силу того, что у нашего RGB общий плюс, имеем:; когда на ноге 0 — соответств-ий канал включен, когда 1 — выключен;*********************************************************org 0goto startorg 4;*** Подпрограмма прерывания от таймера ******************taimer_prerbcf INTCON,7 ; запрет прерыванийmovlw T1 ; устанавлив.начальн.значение счётчика T1movwf TMR0bsf Status,5 ; и предделительmovlw b'00000011'movwf OPT_REGbcf Status,5;*** Проверяем программный счётчик ***********************bcf Status,2 ; сбросить бит Zbtfsc Counter,2 ; если счётчик не= 4, — следующ.команда пропуск-сяclrf Counterbtfss Status,2 ; если выполн.обнуление, пропускаем след.командуgoto Proverka ; если счётчик не =0, то мы не отсчитали; целый импульс — переходим к проверкам;*** Сюда мы попадаем после каждого целого импульса ******;*** Проверяем указатель на текущую уставку **************;*** (если он равен 2Bh, то делаем его равным 24h) *******movlw 2Bhxorwf FSR,0btfss Status,2 ; если FSR не = 2Bh, — следующ.команда выполн.goto Nextmovlw 24hmovwf FSR;*** Уменьшаем Skor, если равна нулю, загружаем **********;*** новую уставку и выставляем начальное значение *******Next clrf GPIO ; зажигаем все светодиодыdecfsz Skor,1 ; если Skor = 0, — пропускаем следующую командуgoto Proverka;——————————movf INDF,0 ; читаем уставку по адресу, указанному в FSRmovwf Temp ; загружаем его в Tempincf FSR,1 ; переводим указатель на следующую уставкуmovlw .25 ; значение скоростиmovwf Skor;*** Сравниваем все значения с уставками, и переключаем если надоProverkaswapf Temp,0 ; после этого уст-ка Red будет в первых 2-х битах Wandlw b'00000011' ; выделяем уставку Redxorwf Counter,0 ; если счётчик=уставке, то установится флаг Zbtfsc Status,2 ; если Z=0, пропустить следующую командуbsf GPIO,0 ; погасить Red;—————————————movf Temp,0movwf Temp2 ; загружаем Temp в Temp2rrf Temp2,1rrf Temp2,0 ; сдвигаем на 2 бита вправо и записываем в Wandlw b'00000011' ; выделяем уставку Greenxorwf Counter,0 ; если счётчик=уставке, то установится флаг Zbtfsc Status,2 ; если Z=0, пропустить следующую командуbsf GPIO,1 ; погасить Green;—————————————movf Temp,0andlw b'00000011' ; выделяем уставку Bluexorwf Counter,0 ; если счётчик=уставке, то установится флаг Zbtfsc Status,2 ; если Z=0, пропустить следующую командуbsf GPIO,5 ; погасить Blue;*** Выход ***********************************************incf Counter,1 ; увеличиваем программный счётчикbcf INTCON,2 ; сбросить флаг прерывания от таймераbsf INTCON,7 ; разрешить прерыванияretfie ; выход;*********************************************************;*** КОНФИГУРИРОВАНИЕ КОНТРОЛЛЕРА ************************;*** Калибровка Генератора *******************************start bsf Status,5Call 3FFh ; Загрузить калибровочную константу в wmovwf OSCCAL;*** Установка направления работы и инициализация ног ****bcf Status,5 ; перейти в банк 0movlw .255 ; 00111111 — все выходы равны 1movwf GPIO ; инициализация защелокmovlw .7 ; биты 0..2 поднятьmovwf Cmcon ; компаратор выключенbsf Status,5 ; Перейти в 1-й банкclrf TrisIO ; все ноги сконфигурированы как выходы;*** Конфигурируем таймер и включаем предделитель ********clrwdtmovlw b'00000011' ; предделитель =16,movwf OPT_REG ; TMR0 работает от внутр.тактового сигналаbcf Status,5 ; переходим в банк 0;*** Конфигурируем начальные значения переменных *********clrf Tempmovlw .1movwf Skor ; чтобы в первом цикле попасть на загрузку уставокmovlw .4movwf Counter ; начальное значение счётчика равно 4movlw 24hmovwf FSR ; указатель на первую уставку;*** Записываем уставки **********************************movlw b'00110000' ; Красныйmovwf RGB1movlw b'00110100' ; Оранжевыйmovwf RGB2movlw b'00111100' ; Желтыйmovwf RGB3movlw b'00001000' ; Зеленыйmovwf RGB4movlw b'00001011' ; Голубойmovwf RGB5movlw b'00000011' ; Синийmovwf RGB6movlw b'00100010' ; Фиолетовыйmovwf RGB7;*** Разрешаем прерывания от таймера *********************clrf INTCON ; запретить все прерыванияbsf INTCON,5 ; Разрешить прерывания от таймераbsf INTCON,7 ; Разрешить немаскированные прерывания;*** РАБОЧАЯ ЧАСТЬ ***************************************;*** Сканирование наличия принятой информации ************Wait nop ; здесь проц может поделать что-то полезное,goto Wait ; пока не придёт прерывание от таймераend

Теория, как сделать программный n-канальный ШИМ

https://www.youtube.com/watch?v=lft2-w3V5X4

Схема подключения RGB-светодиодов к контроллеру и результаты работы программы

Скачать готовую прошивку и asm-файл

Источник: https://radiohlam.ru/rgb_prog/

Использование модулей АЦП и ШИМ в микроконтроллерах PIC16

Реализация ШИМ на PIC-контроллерах. Пестунов Д.А

Микроконтроллеры PIC16 имеют на борту 10-ти разрядный модуль аналого-цифрового преобразователя (АЦП) последовательного приближения.

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

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

На рисунке ниже представлена структурная схема аналогового входа АЦП:

Здесь Rs – это внутреннее сопротивление источника напряжения, ANx – линия порта микроконтроллера, обладающая емкостью Cpin и током утечки Iu. Внутренние соединения микроконтроллера имеют сопротивление Ric.

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

Сопротивление переключателя защелки зависит от напряжения питания, график зависимости показан на рисунке справа.

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

После выбора аналогового канала битами CHS(2:0) регистра ADCON0, необходимо организовать определенную паузу (Tacq) перед началом преобразования, для того чтобы конденсатор Chold успел зарядиться.

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

В основном на время заряда влияет внутреннее сопротивление источника напряжения Rs, которое не должно превышать 10 кОм, для компенсации внутреннего тока утечки Iu, кроме этого влияние оказывает сопротивление переключателя защелки Rss и емкость самого конденсатора Chold, которая может различаться у различных моделей микроконтроллеров.

Время преобразования составляет 12Tad, где Tad это время получения одного бита, для корректного результата Tad не должно быть меньше 1,6 мкс. Время Tad в зависимости от частоты тактового генератора подбирается настройкой битов ADCS(2:0), в даташите на микроконтроллер для этого приводится таблица, где можно подобрать правильное значение.

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

В принципе, если аналоговый канал не меняется и частота преобразований небольшая (время между преобразованиями больше чем Tacq+2Tad), можно и не рассчитывать временные задержки Tacq, 2Tad, и забыть о них.

Чтобы использовать линии порта микроконтроллера для АЦП, необходимо их настроить как аналоговые входы битами ANS(7:0) регистра ANSEL, при этом линия порта должна быть настроена на вход битами регистра TRIS. После этого выбирается требуемый аналоговый канал.

Результат преобразования (10 бит) сохраняется в регистрах ADRESH и ADRESL. Эти регистры представляют собой спаренный 16-ти разрядный регистр, запись результата может выполняться с правым или левым выравниваем, как показано на картинке ниже.

Настройка выравнивания осуществляется с помощью бита ADFM регистра ADCON0.

В качестве опорного напряжения может использоваться внешнее напряжение с вывода Vref, или внутреннее Vdd от источника питания, настройка осуществляется битом VCFG.

Для увеличения точности результата опорное напряжение должно быть стабилизированным с минимальным уровнем пульсаций. При опорном напряжении Vref =5 В, получим дискретность 5В/1024=0,0049 В=4,9 мВ для 10-ти битного результата.

Для получения 8-ми битного результата необходимо применить левое выравнивание и считывать только регистр ADRESH, в этом случае для Vref =5 В дискретность составит 5В/256=0,0195 В=9,5 мВ.

Включение модуля АЦП производится битом ADON регистра ADCON0, запуск преобразования осуществляется установкой бита GO/-DONE регистра ADCON0, который аппаратно сбрасывается после окончания преобразования, то есть проверкой этого бита можно определить конец преобразования.

Перейдем к рассмотрению 10-ти разрядного ШИМ (широтно-импульсная модуляция) в микроконтроллерах PIC16. ШИМ осуществляется посредством модуля CCP, который настраивается в регистре CCP1CON, и содержит 16-ти разрядный регистр CCPR1, состоящий из двух регистров CCPR1H и CCPR1L.

Сигнал от модуля в режиме ШИМ передается на вывод CCP1 микроконтроллера, который должен быть настроен на выход. Для реализации ШИМ используется таймер TMR2, период ШИМ задается в регистре PR2, старшие 8 бит длительности импульса задаются в регистре CCPR1L , младшие 2 бита в регистре CCP1CON(5:4).

Ниже представлена структурная схема модуля ШИМ:

Когда значение таймера TMR2 в процессе инкремента сравнивается с числом в регистре PR2, происходит обнуление TMR2, одновременно с этим устанавливается высокий логический уровень на выводе CCP1 (если длительность импульса в регистрах CCPR1L и CCP1CON равна нулю, высокий логический уровень не устанавливается).

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

Буферизация необходима для возможности записи нового значения длительности импульса в регистры CCPR1L, CCP1CON, без искажения предыдущего значения. Биты в регистре CCPR1L и CCP1CON(5:4) могут быть изменены в любое время, но значение в регистре CCPR1H не изменяется, пока не произойдет совпадение значений TMR2 и PR2. В ШИМ режиме регистр CCPR1H доступен только для чтения.

Таймер TMR2 и внутренний двухразрядный счетчик образуют условный 10-ти разрядный счетчик, при этом если TMR2 инкрементируется в каждом машинном цикле с частотой Fosc/4 (при коэффициенте предделителя 1:1), то внутренний двухразрядный счетчик тактируется за каждый период тактового генератора с частотой Fosc, тем самым получается условный 10-ти разрядный счетчик. Когда значение CCPR1H и внутренней двухразрядной защелки сравнивается со значением TMR2 и внутреннего двухразрядного счетчика, на выводе CCP1 устанавливается низкий логический уровень. Ниже можно увидеть временную диаграмму одного периода ШИМ:

Период ШИМ можно рассчитать по следующей формуле из даташита:

Tшим=(PR2+1) ×4×Tosc×(коэффициент предделителя TMR2)

По мне лучше переписать данное уравнение в более удобную форму:

Fшим=Fosc/(4×(PR2+1)×(коэффициент предделителя TMR2))

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

В даташите также приведена таблица с рассчитанными значениями частоты и разрешения ШИМ для частоты тактового генератора в 20 МГц:

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

Выполним несколько расчетов для частоты тактового генератора в 4 МГц. Значение разрешения ШИМ примем равным 8 бит, для получения наибольших частот ШИМ для заданной частоты тактового генератора, значение длительности импульса необходимо загружать в регистры CCPR1L и CCP1CON с “правым выравниванием”.

То есть старшие 6 бит длительности импульса загружаем в биты (5:0) регистра CCPR1L (в 6-й и 7-й бит CCPR1L записываем нули), а младшие 2 бита длительности импульса в регистр CCP1CON(5:4) как показано на рисунке ниже:

При этом числовое значение для регистра PR2, определяющее период ШИМ, составит 0x3F=63.

Посчитаем частоту ШИМ при коэффициенте предделителя TMR2 равного (1:1):

Fшим=4000 кГц/(4×(63+1)×1)=15,625 кГц

Для коэффициента предделителя TMR2 (1:4):

Fшим=4000 кГц/(4×(63+1)×4)=3,9 кГц

При коэффициенте (1:16) получим: Fшим=976 Гц.

Используя “левое выравнивание” можно получить наименьшие значения частот ШИМ для заданной частоты тактового генератора, при этом значение длительности импульса загружается только в регистр CCPR1L (в 5-й и 4-й бит CCP1CON записываем нули), как показано на рисунке ниже:

Числовое значение для регистра PR2 составит 0xFF=255, для коэффициентов предделителя TMR2 (1:1; 1:4; 1:16) получим частоты ШИМ 3,9 кГц; 976 Гц; 244 Гц. Подбор частоты путем различного “выравнивания” возможен, если только разрешение ШИМ меньше 10 бит. Таким образом, выбрав требуемое разрешение и варьируя частотой тактового генератора, коэффициентом предделителя TMR2, применяя различное “выравнивание”, можно подбирать различные частоты для ШИМ.

Теперь рассмотрим практическое применение модулей АЦП и ШИМ на основе 8-ми выводного микроконтроллера PIC12F683.

Будем регулировать яркость светодиода мощностью в один ватт при помощи переменного резистора, схема представлена ниже:

Как видно из схемы, измерение напряжения производится на среднем выводе переменного резистора, линия микроконтроллера GP0/AN0 используется в качестве аналогового входа модуля АЦП. Напряжение на среднем выводе переменного резистора варьируется от 0 до 5В, для АЦП используется внутреннее опорное напряжение от источника питания Vdd, то есть 5В. Разрешение АЦП и ШИМ я настроил на 8 бит, это значение очень часто применяется в конструкциях. Полученный после преобразования байт передается в модуль ШИМ, сигнал от которого с вывода GP2/CCP1 передается на затвор полевого транзистора, который коммутирует светодиод.

Код программы представлен ниже, в принципе необходимо только настроить АЦП и ШИМ, а дальше все просто:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Основная программа Start bsf STATUS,RP0 movlw b'01100001' ;установка тактовой частоты микроконтроллера movwf OSCCON ;в 4 МГц, внутренний тактовый генератор bcf STATUS,RP0 ; ; movlw b'00000000' ;запись нулей в выходные защелки movwf GPIO ; ; movlw 0x07 ;выключение компараторов movwf CMCON0 ; ; bsf STATUS,RP0 ; movlw b'11111011' ;настройка линии GP2 на выход для модуля ШИМ, movwf TRISIO ;остальные линии на вход bcf STATUS,RP0 ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;настройка модуля АЦП bsf STATUS,RP0 ;установка времени преобразования для АЦП movlw b'01010001' ;Tad = 4мкс (Fosc/16), настройка линии movwf ANSEL ;GP0(AN0) как аналоговый вход для АЦП, остальные bcf STATUS,RP0 ;линии цифровые входы ; movlw b'00000000' ;Установка левого выравнивания результата АЦП, movwf ADCON0 ;внутренний источник опорного напряжения от Vdd, ;выбор аналогового канала AN0, преобразование ;не запущено, модуль АЦП выключен ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;настройка модуля ШИМ bsf STATUS,RP0 ; movlw .255 ;запись числа 255 в регистр периода ШИМ movwf PR2 ; bcf STATUS,RP0 ; ; movlw .0 ;запись нулей в регистры длительности импульса movwf CCPR1L ;ШИМ, CCPR1L и CCP1CON(5:4) bcf CCP1CON,4 ; bcf CCP1CON,5 ; ; movlw b'00000110' ;установка предделителя TMR2 (1:16) movwf T2CON ;включение таймера TMR2 ; movlw b'00001100' ;включение CCP1 модуля в режим ШИМ movwf CCP1CON ;при этом ранее сброшенные младшие биты (5:4) ;длительности импульса ШИМ не меняем ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Рабочая программа bsf ADCON0,ADON ;включение модуля АЦПbegin bsf ADCON0,GO_DONE ;установка бита GO_DONE регистра ADCON0 для ;запуска преобразования АЦП ; prov btfsc ADCON0,GO_DONE ;опрос бита GO_DONE goto prov ;бит GO_DONE не равен 0, преобразование не ;закончено, переход на метку prov ; movf ADRESH,W ;бит GO_DONE равен 0, преобразование закончено, movwf CCPR1L ;копирование значения регистра ADRESH в регистр ;CCPR1L, то есть результат преобразования ;загружаем в регистр длительности импульса ШИМ ; call pause ;вызов подпрограммы паузы goto begin ;переход на метку begin, для повторного ;запуска преобразования ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;пауза 100 мс pause movlw .130 ;подпрограмма паузы 100 мс movwf Sec1 ;p2 movlw .255 ; movwf Sec ;p1 decfsz Sec,F ; goto p1 ; decfsz Sec1,F ; goto p2 ; return ;выход из подпрограммы ;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;              movlw       b'01100001'     ;установка тактовой частоты микроконтроллера              movwf       OSCCON          ;в 4 МГц, внутренний тактовый генератор              movlw       b'00000000'     ;запись нулей в выходные защелки              movlw       0x07            ;выключение компараторов              movlw       b'11111011'     ;настройка линии GP2 на выход для модуля ШИМ,                movwf       TRISIO          ;остальные линии на вход;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;              bsf         STATUS,RP0      ;установка времени преобразования для АЦП              movlw       b'01010001'     ;Tad = 4мкс (Fosc/16), настройка линии              movwf       ANSEL           ;GP0(AN0) как аналоговый вход для АЦП, остальные              bcf         STATUS,RP0      ;линии цифровые входы              movlw       b'00000000'     ;Установка левого выравнивания результата АЦП,                movwf       ADCON0          ;внутренний источник опорного напряжения от Vdd,                                          ;выбор аналогового канала AN0, преобразование                                          ;не запущено, модуль АЦП выключен;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;              movlw       .255            ;запись числа 255 в регистр периода ШИМ              movlw       .0              ;запись нулей в регистры длительности импульса              movwf       CCPR1L          ;ШИМ, CCPR1L и CCP1CON(5:4)              movlw       b'00000110'     ;установка предделителя TMR2 (1:16)              movwf       T2CON           ;включение таймера TMR2              movlw       b'00001100'     ;включение CCP1 модуля в режим ШИМ                movwf       CCP1CON         ;при этом ранее сброшенные младшие биты (5:4)                                          ;длительности импульса ШИМ не меняем;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;              bsf         ADCON0,ADON     ;включение модуля АЦПbegin         bsf         ADCON0,GO_DONE  ;установка бита GO_DONE регистра ADCON0 для                                          ;запуска преобразования АЦПprov          btfsc       ADCON0,GO_DONE  ;опрос бита GO_DONE              goto        prov            ;бит GO_DONE не равен 0, преобразование не                                          ;закончено, переход на метку prov              movf        ADRESH,W        ;бит GO_DONE равен 0, преобразование закончено,              movwf       CCPR1L          ;копирование значения регистра ADRESH в регистр                                          ;CCPR1L, то есть результат преобразования                                          ;загружаем в регистр длительности импульса ШИМ              call        pause           ;вызов подпрограммы паузы              goto        begin           ;переход на метку begin, для повторного;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;pause         movlw       .130            ;подпрограмма паузы 100 мс              return                      ;выход из подпрограммы

Вначале идет настройка внутреннего тактового генератора микроконтроллера на 4 МГц, запись нулей в выходные защелки, отключение компараторов. Далее настраиваем линию GP2/CCP1 на выход, чтобы использовать ее для ШИМ, остальные линии на вход, в том числе и GP0/AN0 для АЦП, эти настройки производятся в регистре TRISIO, который расположен в 1-ом банке.

Следующим шагом будет настройка модуля АЦП.

В регистре ANSEL (находится в 1-ом банке) устанавливаем время преобразования одного бита Tad равное 4 мкс (Fosc/16), для частоты тактового генератора в 4 МГц из таблицы в даташите микроконтроллера доступно два значения: 2 мкс (Fosc/8) и 4 мкс (Fosc/16).

В этом же регистре настраиваем линию GP0/AN0 как аналоговый вход для правильного функционирования АЦП, остальные линии как цифровые входы. Затем следует настройка регистра ADCON0, где устанавливаем левое выравнивание результата преобразования для регистров ADRESH, ADRESL.

Для 8-ми битного результата считывать будем только регистр ADRESH. Здесь же выбираем внутренний источник опорного напряжения Vdd, при этом модуль АЦП не включаем, и преобразование не запускаем. На этом настройку модуля можно считать завершенной.

Далее настраиваем ШИМ, первым делом устанавливаем период в регистре PR2 (находится в 1-ом банке). Будем использовать 8-ми битный ШИМ с загрузкой длительности импульса с “левым выравниванием”, то есть только в регистр CCPR1L, соответственно в PR2 записываем 0xFF=255.

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

Неиспользуемые в данном случае младшие биты (5:4) длительности импульса в регистре CCP1CON должны быть сброшены, иначе получим некорректный результат. В регистре T2CON устанавливаем коэффициент предделителя TMR2 равным (1:16), и запускаем таймер.

Частота ШИМ составит 244 Гц, чего вполне достаточно, для исключения мерцания светодиода. В регистре CCP1CON включаем режим ШИМ, при этом следим чтобы биты (5:4) были сброшены, как было сказано выше. Вот и все, ШИМ настроен и запущен.

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

Путем цикличной проверки бита GO/-DONE, определяем конец преобразования. Копируем результат преобразования из регистра ADRESH в регистр длительности импульса CCPR1L.

Уходим на паузу в 100 мс, после чего переходим на метку begin, для выполнения нового цикла, в принципе все просто.

Ниже представлен видеоролик демонстрирующий работу модулей АЦП и ШИМ. Здесь в вышеприведенную схему я дополнительно добавил цифровое табло на драйвере MC14489AP, для отображения результата измерения модуля АЦП.

Прошивка МК и исходник+модель Proteus 7.7

Последние записи:

Источник: https://radiolaba.ru/microcotrollers/ispolzovanie-moduley-atsp-i-shim-v-mikrokontrollerah-pic16.html

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