Microchip представила первый pic микроконтроллер с 16-битным ацп, 10 msps ацп, цап, usb и lcd

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

microchip представила первый pic микроконтроллер с 16-битным АЦП, 10 msps АЦП, ЦАП, usb и lcd

Микроконтроллеры 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 передается на затвор полевого транзистора, который коммутирует светодиод.

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

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;              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

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

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

Microchip представляет первый микроконтроллер PIC с 16-разрядным АЦП, ЦАП, USB и драйвером ЖКИ

» Новости » Микроконтроллеры

18-09-2013

Microchip » PIC24FJ128GC010

Беспрецедентный набор аналоговой периферии и технология управления питанием XLP для портативного медицинского и промышленного оборудования

Microchip представила новое семейство микроконтроллеров – PIC24FJ128GC010, фактически, представляющее собой аналоговую систему на кристалле, в которой интегрированы все звенья цепочки аналоговой обработки сигналов, включая уникальный для отрасли микроконтроллеров 16-разрядный АЦП, 12-разрядный АЦП с быстродействием 10 Msps, ЦАП и два операционных усилителя. Реализованная в микроконтроллерах технология управления питанием XLP (eXtreme Low Power) увеличивает время автономной работы портативного медицинского и промышленного оборудования.

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

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

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

Интеграция 16-разрядного АЦП, USB, драйвера ЖКИ и процессора с малым энергопотреблением позволит создавать исключительно компактные устройства с батарейным питанием.

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

Поддержка разработки

Семейство PIC24FJ128GC010 поддерживается стартовым набором Starter Kit for PIC24F Intelligent.Integrated.Analog (номер для заказа DM240015), который в течение ограниченного времени предлагается по специальной цене $89.99.

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

Все, что требуется добавить – это датчики.

Цены и доступность

Микросхемы семейства PIC24FJ128GC010 выпускаются серийно. Для апробирования изделий предлагаются бесплатные образцы. При больших объемах заказа цены начинаются от $2.59 за штуку.

PIC24FJ128GC010 (128 КБ Flash) и PIC24FJ64GC010 (64 КБ Flash) выпускаются в 100-выводных корпусах TQFP и 121-выводных BGA.

PIC24FJ128GC006 (128 KБ Flash) и PIC24FJ64GC006 (64 KБ Flash) доступны в 64-выводных корпусах TQFP и QFN.

Источник: https://www.rlocman.ru/news/new.html?di=149065

PCF8591 — АЦП и ЦАП в одном

Дата публикации: 01 февраля 2015.

Рейтинг:  5 / 5

Данная микросхема выполнена по технологии КМОП, имеет 4 аналоговых входа и 1 аналоговый выход, управляемые посредством задания данных на шине I2C. Биты А2…

А0 в slave-адресе микросхемы задаются внешними сигналами по традиционному способу: подключением соответствующих выводов либо к общему проводу, либо к напряжению питания. Это позволяет использовать до 8 однотипных микросхем.

В составе PCF8591 имеется только один A/D преобразователь, но использование методов мультиплексирования расширяет входные возможности микросхемы. Вход АЦП последовательно подключается к 4 сигнальным входам, и происходит считывание информации с них.

К сожалению, мультиплексирование нельзя использовать для D/A преобразования, поэтому аналоговый выход только один. Максимальная скорость преобразования данных ограничена максимальным быстродействием шины I2C.

Рисунок 1. Расположение выводов микросхемы PCF8591

Рисунок 2. Блок-схема, отражающая внутреннее устройство и взаимодействие элементов микросхемы

Таблица 1. Назначение выводов PCF8591

Символ Вывод Описание
AIN0 1  Аналоговый вход (A/D)
AIN1 2  Аналоговый вход (A/D)
AIN2 3  Аналоговый вход (A/D)
AIN3 4  Аналоговый вход (A/D)
А0 5  Адресный вход 0
A1 6  Адресный вход 1
A2 7  Адресный вход 2
Vss 8  Общий провод микросхемы (питание)
SDA 9  Линия SDA шины I2C
SCL 10  Линия SCL шины I2C
OSC 11  Вывод подключения внешнего генератора
EXT 12  Внешний/внутренний генератор
AGND 13  Аналоговая «земля»
Vref 14  Опорное напряжение
AOUT 15  Аналоговый выход (D/A)
Vdd 16  Напряжение питания«+»

Slave-адрес микросхемы задается, как показано на рис.3. Он содержит фиксированную часть (биты 7…4) и изменяемую часть (биты 3…1). Бит 0, как всегда, несет в себе признак «R/W» (чтение/запись).

Рисунок 3. Slave-адрес микросхемы

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

В-третьих, возможна установка (двумя битами) номера канала A/D, в котором будет происходить преобразование. Если ус­тановлен флаг автоинкремента, после каждого A/D преобразования номер входного канала будет увеличиваться на единицу.

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

Рекомендуется также отключать аналоговый выход (переводить его в Z-состояние), если он не используется. Эта мера позволит сократить ток потребления микросхемы. На рис. 4 показаны возможные со­стояния байта контроля и управления.

Рисунок 4. Со­стояния байта контроля и управления

D/A преобразование

Третий байт, который должна получать микросхема PCF8591, — это байт данных для цифроаналогового преобразователя. Естественно, в этом случае в байте контроля и управления (рис. 4) должен быть активизирован аналоговый выход.

Физически D/A преобразователь состоит из резисторной матрицы, показанной на рис. 5. Точки соединения резисторов образуют ответвления, которые с помощью переключателей связываются с выходной линией. Управляет схемой декодер ответвлений.

Выходное напряжение (L)AC out) подается затем на усилитель с автоматаческой балансировкой нуля (auto-zeroed unity gain amplifier).

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

Рисунок 5. D/A преобразователь

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

Рисунок 6. Процедура D/A преобразования

Процедура D/A преобразования показана на рис. 6. Любая точка на графике в диапазоне 00h…FFh может быть определена по формуле:

где VA0UT — выходное напряжение D/A преобразователя; VREF — опорное напряжение; VAGND — потенциал аналоговой «земли»; D — соответствующий разряд байта данных.

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

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

4) на выходе микросхемы, появляются данные, содержащиеся в регистре DAC с момента окончания предыдущего цикла работы микросхемы.

Рисунок 7.

A/D преобразование

Чтобы выполнить A/D преобразование, вначале нужно передать байт контроля и управления с признаком R/W = 0. Затем осуществить считывание данных согласно рис. 8.

Рисунок 8. A/D преобразование

Важно отметить, что считывание сигнала с аналогового входа и передача цифровых данных на шину ГС происходит по сигналу АСК. Причем момент считывания аналогового сигнала и момент начала передачи цифрового сигнала (точнее, его старшего бита) разнесены во времени, как показано на рис. 8.

Как уже было сказано ранее, входы микросхемы могут работать в обычном и дифференциальном режимах. График, отражающий рабо­ту микросхемы в обычном режиме, приведен на рис. 9, дифференциальный режим показан на рис. 10.

Рисунок 9. Обычный режим измерения

Рисунок 10. Дифференциальный режим измерения

Чтобы обеспечить стабильность A/D и D/A преобразований, необходим специальный источник опорного напряжения, подключаемый к выводам Vref и AGND микросхемы. Встроенный генератор не­обходим для обеспечения цикла преобразования A/D и для корректировки буферного усилителя с автоматической подстройкой нуля.

Читайте также:  Переделка электрической отвертки на литий за пол часа

Чтобы задействовать внутренний генератор, вывод ЕХТ должен быть замкнут к Vss. Тогда на выводе OSC появится сигнал частоты преобразования, который можно проконтролировать. Если вывод ЕХТ подключить к VDD, внугренний генератор перейдет в высокоимпедансное состояние и на вывод OSC можно подавать сигнал от внешнего генератора.

Литература:
Б. Ю. Семенов, «ШИНА I2C В РАДИОТЕХНИЧЕСКИХ КОНСТРУКЦИЯХ»

Источник: https://radioparty.ru/prog-avr/program-c/555-lesson-pcf8591

PIC контроллеры

PIC — микроконтроллеры Гарвардской архитектуры, производимые американской компанией Microchip Technology Inc. Название PIC является сокращением от Peripheral Interface Controller, что означает «периферийный интерфейсный контроллер». Название объясняется тем, что изначально PIC предназначались для расширения возможностей ввода-вывода 16-битных микропроцессоров CP1600.

В номенклатуре Microchip Technology Inc. представлен широкий спектр 8-и, 16-и и 32-битных микроконтроллеров и цифровых сигнальных контроллеров под маркой PIC. Отличительной особенностью PIC-контроллеров является хорошая преемственность различных семейств.

Это и программная совместимость (единая бесплатная среда разработки MPLAB IDE), и совместимость по выводам, по периферии, по напряжениям питания, по средствам разработки, по библиотекам и стекам наиболее популярных коммуникационных протоколов.

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

8-битные микроконтроллеры

8-битные микроконтроллеры имеют модифицированную Гарвардскую архитектуру и делятся на 2 больших семейства: PIC10/12/16 и PIC18.

 8-битные микроконтроллеры PIC10/12/16

8-битные микроконтроллеры PIC10/12/16 представлены двумя базовыми архитектурами ядра: BASELINE и MID-RANGE.

 Архитектура базового (BASELINE) семейства

Базовая архитектура (BASELINE) состоит из контроллеров семейства PIC10 и части контроллеров семейств PIC12 и PIC16. Основываются они на 12-и разрядной архитектуре слова программ и представлены контроллерами в корпусах от 6 до 28-и выводов.

Упрощенная архитектура базового семейства предоставляет наиболее дешевое решение из предлагаемых Microchip.

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

  • маловыводные и миниатюрные корпуса
  • Flash память программ
  • низкое потребление тока
  • низкая цена
  • легкое освоение, всего 35 команд

Архитектура среднего (MID-RANGE) семейства

Архитектура среднего семейства (Mid-Range) нашла применение в микроконтроллерах серий PIC12 и PIC16, и имеет ширину слова памяти программ 14 бит. Эти микроконтроллеры выпускаются в корпусах от 8 до 64 выводов.

Микроконтроллеры с Flash памятью работают в диапазоне напряжений питания от 2.0 до 5.

5В, имеют систему прерываний, аппаратный стек и энергонезависимую память данных EEPROM, а также богатый набор периферии, такой как USB, SPI, I²C, USART, LCD, компараторы, АЦП и т. п.

  • различные корпуса: 6 — 64 выводов
  • Flash память программ
  • малый ток потребления
  • богатая периферия
  • производительность 5 MIPS
  • легкое освоение, всего 35 команд

Расширенное ядро микроконтроллеров среднего семейства

В более новых микроконтроллерах Microchip применяет улучшенную архитектуру 8-битных PIC микроконтроллеров среднего семейства PIC12 и PIC16:

  • увеличенный объем памяти программ и данных
  • более глубокий и улучшенный аппаратный стек
  • дополнительные источники сброса
  • расширенная периферия, периферия включает модуль mTouch ™ для создания сенсорных пользовательских интерфейсов
  • уменьшенное время входа в прерывание
  • производительность увеличена на 50 %, а размер кода снижен на 40 %
  • 14 дополнительных инструкций, оптимизированных под С-компилятор — итого, 49 инструкций

8-битные микроконтроллеры PIC18

Высокопроизводительное семейство 8-битных микроконтроллеров PIC18F представлено широкой гаммой микроконтроллеров, включающих большой набор периферийных модулей: 10бит АЦП, компараторы, ШИМ, захват/сравнение, драйвер ЖКИ; интерфейсы связи USB, CAN, I2C, SPI, USART, Ethernet и т. д.

  • быстродействия до 16 MIPS
  • объем памяти программ до 128Кб
  • корпуса от 18 до 100 выводов.
  • эффективное кодирование на C
  • NanoWatt технологии
  • встроенный программируемый генератор
  • 3В и 5В семейства
  • продвинутая архитектура (16-и разрядные слова программ)
  • гибкость самопрограммирования
  • поддержка широко распространенных протоколов связи (CAN, USB, ZigBee™, TCP/IP)
  • программная совместимость и совместимость по выводам и периферийным модулям внутри семейства, а также со старшими (16-битными) семействами, предоставляют возможность расширения и увеличения функциональности при развитии разработок.

16-битные контроллеры

Компания Microchip Technology Inc.

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

Общие атрибуты всех 16-и разрядных семейств — это совместимость по выводам, общая система команд и, соответственно, общие компиляторы Си и средства разработки. Широкая линейка 16-битных контроллеров включает контроллеры от 18 до 100 выводов с объемом flash памяти от 6 Кб до 256 Кб.

 16-битные микроконтроллеры PIC24F и PIC24H

Основные особенности:

  • выполнение команды за 2 такта генератора
  • гарантированное время отклика на прерывание — 5 командных тактов
  • доступ к памяти (в том числе инструкции чтения-модификации-записи) за 1 командный такт
  • аппаратный умножитель (за 1 такт)
  • аппаратный делитель 32/16 и 16/16 чисел (17 командных тактов)
  • диапазон питающих напряжений 1.8…3.6В, один источник питания.
  • внутрисхемное и само- программирование
  • встроенный генератор с PLL
  • расширенная периферия (до 3-х SPI, до 3-х I2C, до 4-х UART (с поддержкой IrDA, LIN), CAN (и расширенный ECAN), USB OTG)
  • модуль измерения времени заряда (CTMU), основное применение — управление емкостными сенсорами
  • ток портов ввода/вывода общего назначения — 18 мА
  • порты толерантны к устройствам с 5 В питанием
  • до девяти 16-битных таймеров общего назначения
  • до восьми модулей захвата
  • ряд энергосберегающих режимов
  • до двух АЦП (32 канала) с конфигурируемой разрядностью
  • до восьми 16-битных модулей сравнения / генерации ШИМ
  • программное переназначение выводов (PPS)
  • прямой доступ к памяти DMA(у PIC24H)
  • расширенный набор инструкций, 16 ортогональных регистров общего назначения, векторная приоритетная система прерываний, и другие особенности (методы адресации, аппаратные циклы).

16-битные микроконтроллеры представлены в двух модификациях — PIC24F и PIC24H, которые отличаются технологией изготовления FLASH программной памяти. Это определяет диапазон питающих напряжений — для PIC24F — 2,0…3,6 В, для PIC24H — 3,0…3,6 В.

Первое семейство (PIC24F) производится по более дешевой технологии (0,25 мкм) и работает с максимальной производительностью ядра 16MIPS@32МГц. Второе семейство (PIC24H) производится с использованием более сложного техпроцесса изготовления, что позволяет добиться большей скорости работы (40MIPS@80МГц).

Оба семейства поддерживают внутрисхемное программирование (ICSP), а также самопрограммирование (RTSP).

Контроллеры цифровой обработки сигналов dsPIC30F и dsPIC33F

Компания Microchip предлагает два семейства 16-ти разрядных Flash микроконтроллеров с поддержкой команд цифровой обработки сигналов — dsPIC30F и dsPIC33F. Высокое быстродействие в (30 MIPS для dsPIC30F и 40 MIPS для dsPIC33F) и эффективная система команд позволяет использовать контроллеры в сложных системах реального времени. Ключевые особенности:

  • расширенная система команд, включающая специфические команды поддержки цифровой обработки сигналов (DSP).
  • 24-разрядные инструкции выполняются за 4 периода тактовой частоты у dsPIC30F и за 2 — у dsPIC33F, за исключением команд деления, переходов, команд пересылки данных из регистра в регистр и табличных команд.
  • разрядность программного счетчика (24 бита) позволяет адресовать до 4М слов программной памяти (4М*24бит).
  • аппаратная поддержка циклов типа DO и REPEAT, выполнение которых не требует дополнительных издержек программной памяти и времени на анализ условий окончания, в то же время эти циклы могут быть прерваны событиями прерывания в любой момент;
  • 16 рабочих регистров, каждый регистр массива может выступать как данные, адрес или смещение адреса
  • два класса команд: микроконтроллерные инструкции (MCU) и команды цифровой обработки сигналов (DSP). Оба этих класса равноправно интегрированы в архитектуру контроллера и обрабатываются одним ядром.
  • различные типы адресации;
  • система команд оптимизирована для получения максимальной эффективности при программировании на языке высокого уровня Си.

Если о PIC24F можно говорить, как об усеченном доработанном варианте dsPIC30F (без ядра ЦОС, с трехвольтовым питанием и переработанным конвейером), то PIC24H — это усеченный вариант dsPIC33F. Хотя в данном сравнении нарушены причинно-следственные связи, технически оно верно.

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

Особо следует отметить переработанную по сравнению с dsPIC30F систему тактирования. dsPIC33F, как и семейство PIC24H, имеют PLL с дробным коэффициентом умножения (конфигурируемым программно), что позволяет получить сетку частот от 12,5 МГц до 80 МГц с шагом 0,25 МГц при использовании кварцевого резонатора 4 МГц.

Кроме того, контроллеры dsPIC33F и PIC24H имеют два внутренних высокостабильных RC-генератора с частотами 7,3728 МГц и 32,768 кГц. Отдельный делитель тактовой частоты ядра (модуль DOZE) присутствует во всех новых 16-битных семействах.

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

  • календарь и часы реального времени RTCC
  • аппаратный подсчет CRC
  • расширенная периферия (SPI, I2C, UART (с поддержкой IrDA, LIN), CAN (ECAN))
  • 10-и и 12-битные АЦП
  • компараторы
  • 10-и и 16-битные ЦАП
  • прямой доступ к памяти (DMA)
  • ведущий параллельный порт (PMP)
  • программное переназначение выводов (PPS)
  • многоуровневая система защиты кода (Code Guard)

Для управления двигателями и преобразователями энергии

  • специализированный ШИМ для управления приводом (Motor Control PWM)
  • интерфейс квадратурного энкодера

Для импульсных источников питания (SMPS)

  • Специализированный сверхбыстрый ШИМ с высоким разрешением (SMPS PWM)
  • Специализированные сверхбыстрые АЦП (SMPS ADC)

Для работы со звуком:

  • 12-битный АЦП
  • 16-битный ЦАП
  • специализированный ШИМ (output compare PWM)
  • интерфейс кодирования данных DCI (I2S, AC97)

Для управления графическими дисплеями:

  • ведущий параллельный порт PMP (QVGA)
  • модуль измерения времени заряда CTMU (сенсорные дисплеи touch-screen)

 32-битные микроконтроллеры

Старшим семейством контроллеров от Microchip Technology является 32-разрядное семейство микроконтроллеров PIC32:

  • ядро MIPS32 M4K, частота тактирования 80 МГц, большинство команд выполняются за 1 такт генератора, производительность 1.53 Dhrystone MIPS/МГц
  • порты ввода/вывода относятся к основному частотному диапазону, т.о., к примеру, можно дергать портами с тактовой частотой.
  • дополнительный частотный диапазон организуется для периферии из основного посредством программно настраиваемого делитель, т.о. частота тактирования периферии может быть снижена для снижения энергопотребления.
  • 64- и 100-выводные корпуса, до 128 кБ SRAM и 512 кБ Flash с кэшем предвыборки
  • совместимость по выводам и отладочным средствам с 16-битными контроллерами Microchip
  • аппаратный умножитель-делитель с независимым от основного ядра конвейером, оптимизированным по скорости выполнения
  • набор расширенных инструкций MIPS16e™ — набор 16-битных инструкций, позволяющий на некоторых приложениях снизить объем кода на 40 %
  • независимый от основного ядра контроллер USB
Читайте также:  Простое переговорное устройство

Семейство 32-разрядных микроконтроллеров PIC32 выделяется значительно увеличенной производительностью и объемом памяти на кристалле по сравнению с 16-разрядными микроконтроллерами и контроллерами цифровой обработки сигналов PIC24/dsPIC.

Контроллеры PIC32 также оснащены большим количеством периферийных модулей, включая различные коммуникационные интерфейсы — те же, что у PIC24, и 16-битный параллельный порт, который может использоваться, например, для обслуживания внешних микросхем памяти и жидко-кристаллических TFT-индикаторов.

Семейство PIC32 построено на ядре MIPS32®, с конкурентоспособной комбинацией низкого потребления энергии, быстрой реакции на прерывание, функциональностью средств разработки и лидирующем в своем классе быстродействием 1.53 Dhrystone MIPS/МГц.

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

Источник: https://texvedkom.org

Обсудить на форумеМикроконтроллеры AVR имеют гарвардскую архитектуру (программа и данные находятся в разных адресных пространствах) и систему команд, близкую к идеологии RISC. Процессор AVR имеет 32 8-битных регистра общего назначения, объединённых в регистровый файл. Группа оперативного управления. Эти ресурсы предназначены для управления приводами и элементами электроавтоматики, которые непосредственно участвуют в процессе обработки. Как известно , процессор является основным вычислительным блоком компьютера, в наибольшей степени определяющим его мощь. Процессор является устройством, исполняющим программу — последовательность команд (инструкций), задуманную программистом и Производитель отечественных процессоров «Эльбрус» компания МЦСТ и разработчик технологий распознавания графической информации компания Smart Engines представили программно-аппаратный комплекс (ПАК) «Всеслав», назначением В линейке модулей CJ1 присутствует четыре модели источников питания. Два из них работают от постоянного напряжения в районе 24В, два от переменного сетевого. Модуль CJ1W-PD202 предназначен для питания небольших систем, включающих в основном Программируемые контроллеры SIMATIC S7-200 предназначены для построения относительно простых систем автоматического управления, отличающихся минимальными затратами на приобретение аппаратуры и разработку системы. 

Источник: https://ingeneryi.info/radio-kom/rd-kom/ms-kom/1779-pic.html

Alex_EXE

В статье описан вольтметр, с пределом измерения 50 вольт, сделанный на PIC16F676 или как использовать АЦП этого микроконтроллера.

Резисторы R1 и R3 были подобранны мною не очень удачно, т.к. 2-ой сегмент индикатора светиться немного тускло, советую подобрать свои значения. Транзистор VT1 использовал КТ3102, его можно заменить на любой другой npn транзистор.

Исходник вольтметра, компилятор HI-TECH PICC 9.50:

#include< pic.h> __CONFIG(0x031D4); void low_init() { CMCON=0x07; ADCON1=0b00110000; /* | — || — ADCS2 ||| — ADCS1 |||| — ADCS0 ||||| — |||||| — ||||||| — |||||||| — */ ADCON0=0b10001101; /* | — ADFM — || — VCFG — ||| |||| — CHS2 ||||| — CHS1 |||||| — CHS0: выбор вывода для АЦП ||||||| — GO/DONE |||||||| — ADON */ ANS4 = 1; // 3 — анаологовый TRISA=0b00010000; TRISC=0x00; } void delay(unsigned int p) { unsigned int i; for(i=0;i } void seg7(int c,int s) { unsigned char t=0; PORTA=0b00000000; switch(s) { case 1 :{ t=1;}break; case 2 :{ t=2;}break; case 3 :{ t=32;}break; } switch(c%10) { case 0 : {PORTC=0b00000000;PORTA=t+4;}break; case 1 : {PORTC=0b00011110;PORTA=t+4;}break; case 2 : {PORTC=0b00010001;PORTA=t;}break; case 3 : {PORTC=0b00010100;PORTA=t;}break; case 4 : {PORTC=0b00001110;PORTA=t;}break; case 5 : {PORTC=0b00100100;PORTA=t;}break; case 6 : {PORTC=0b00100000;PORTA=t;}break; case 7 : {PORTC=0b00010110;PORTA=t+4;}break; case 8 : {PORTC=0b00000000;PORTA=t;}break; case 9 : {PORTC=0b00000100;PORTA=t;}break; } } void main() { int i,v,v1; long int v2; float vf; low_init(); delay(10000); while(1) { GODONE=1; // Устанавливаем бит GO для того что бы сделать опрос АЦП for(i=0;i < 200;i++) { seg7(v1/10,1); delay(5); seg7(v1%10,2); delay(5); seg7(v2/10,3); delay(5); } delay(100); while(GODONE){} v=ADRESL; // читаем младший байт с АЦП i=ADRESH; // читаем старший байт с АЦП (а именно 2 байта с него) v=v+i*256; // складываем младщий и старший байт с АЦП v1=(v*10/241)%100; // преобразуем vf=1000/241; v2=(int)((float)v/241*1000)%100; } }

В схеме применён красный индикатор с общим анодом — BA56-12GWA.
Все элементы на плате, кроме индикатора и штырьков, располагаются со стороны дорожек. Резисторы R6-R12 чип 0805, резистор R1 на 0.125Вт в обычном корпусе, все остальные детали 1206.

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

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

Настройка вольтметра производиться путём подстройки резистора R4 и подборкой делителя (в статье делитель 241).

Данный архив содержит:

  • Исходники
  • Прошивку
  • Печатную плату в формате *.lay

Скачать

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

Статья обновлена 16 декабря 2010.

Дополнение к статье от Владимира

Скачать печатки под DIP14 и SO14

Источник: https://alex-exe.ru/radio/microcontrollers/atd-pic16f676-7seg-old/

ZiB

Новая линейка микроконтроллеров STM32F3хx интересна наличием 16 битного сигма-дельта АЦП с частотой преобразования до 50 кГц.

К сожалению отладочная плата STM32F3-Discovery выполнена на микроконтроллере STM32F30x, который не содержат в своем составе данного АЦП.

Вообще получилась интересная ситуации либо мы имеет 16 битный АЦП + 12 битный АЦП с частотой преобразования до 1 МГц (STM32F37x), либо не имеем 16 битного АЦП, но имеем 12 битный АЦП с частотой преобразования до 5 МГц (STM32F30x). Будем надеется, что появиться микроконтроллер с 16 битным АЦП и скоростным 12 битным.

Сигма-дельта АЦП

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

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

Настройка входных каналов независимая, поэтому можно использовать их различные комбинации (симметричные + несимметричные).

Для большей наглядности, полностью не симметричный режим:

Дифференциальный режим:

и их комбинация (одна из возможных):

АЦП имеет входной усилитель с программируемым коэффициентом усиления от 0,5 до 32.

(Пока не забыл: для текущий ревизии в одном из несимметричных режимов усилитель работает не корректно при коэффициентах 16 и 32, см. листок ошибок STM32F37xxx STM32F383xx — Errata sheet)

Максимальная частота преобразований 50 кГц реализуется при работе АЦП на один вход, при обработки нескольких входов максимальная частота преобразований уже 16,6 кГц.

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

  • коэффициент усиления входного сигнала
  • дифференциальный или несимметричный режим
  • смещение

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

Можно выбрать различные источники опорного напряжения АЦП:

  • внутренний источник напряжением 1,8 В или 1,2 В
  • опорное напряжение равно аналоговому питанию АЦП
  • внешний источник опорного напряжения от 1,1 В до аналогового напряжения питания АЦП

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

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

Для автоматизации результаты преобразований можно “забирать” посредством модуля ПДП (DMA).

Ну и последнее, что стоит отметить это три энергосберегающих режима работы:

  • режим медленного преобразования (в этом режиме максимальные частоты преобразования 12 и 4 кГц)
  • режим ожидания
  • АЦП выключено

Функциональная схема модуля АЦП:

Пример

В наличии у меня “своя” плата с микроконтроллером STM32F373R8.

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

STM32F37x DSP and standard peripherals library (скачать)

В примерах от производителя идущих в комплекте со стандартной библиотекой на текущий момент нет примеров по использованию АЦП совместно с ПДП (DMA), поэтому интереснее рассмотреть именно такой режим.

Обозначим задачу:

  • последовательное преобразование 4-ёх несимметричных каналов
  • фиксированная частота преобразований (запуск от таймера) 400 Гц
  • результаты преобразования “забирать” посредством модуля ПДП (DMA)

Последовательность действий для настройки АЦП:

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

Всё выше сказанное в коде:
// разрешаем тактирование сигма-дельта АЦП

RCC_APB2PeriphClockCmd(RCC_APB2Periph_SDADC1, ENABLE);
RCC_SDADCCLKConfig(RCC_SDADCCLK_SYSCLK_Div8); // питание аналоговой части

RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
PWR_SDADCAnalogCmd(PWR_SDADCAnalog_1, ENABLE); // выбор опорного напряжения

SDADC_VREFSelect(SDADC_VREF_VDDA); // пауза для стабилизации

delay_ms(10); // включаем АЦП

SDADC_Cmd(SDADC1, ENABLE); // вход в реим инициализации

SDADC_InitModeCmd(SDADC1, ENABLE);
while (SDADC_GetFlagStatus(SDADC1, SDADC_FLAG_INITRDY) == RESET)
{
} // выбор режима работы (конфигурационная ячейка 0)

SDADC_AINStructure.SDADC_InputMode = SDADC_InputMode_SEZeroReference;
SDADC_AINStructure.SDADC_Gain = SDADC_Gain_1;
SDADC_AINStructure.SDADC_CommonMode = SDADC_CommonMode_VSSA;
SDADC_AINStructure.SDADC_Offset = 0;
SDADC_AINInit(SDADC1, SDADC_Conf_0, &SDADC_AINStructure); // выбор каналов и задания режима работы

SDADC_ChannelConfig(SDADC1, SDADC_Channel_4, SDADC_Conf_0);
SDADC_ChannelConfig(SDADC1, SDADC_Channel_5, SDADC_Conf_0);
SDADC_ChannelConfig(SDADC1, SDADC_Channel_6, SDADC_Conf_0);
SDADC_ChannelConfig(SDADC1, SDADC_Channel_8, SDADC_Conf_0); SDADC_InjectedChannelSelect(SDADC1, SDADC_Channel_4 | SDADC_Channel_5 | SDADC_Channel_6 | SDADC_Channel_8); // внешний триггер

SDADC_ExternalTrigInjectedConvConfig(SDADC1, SDADC_ExternalTrigInjecConv_T13_CC1);
SDADC_ExternalTrigInjectedConvEdgeConfig(SDADC1, SDADC_ExternalTrigInjecConvEdge_Rising); // выход из режима настройки

SDADC_InitModeCmd(SDADC1, DISABLE); // самокалибровка

SDADC_CalibrationSequenceConfig(SDADC1, SDADC_CalibrationSequence_1);
SDADC_StartCalibration(SDADC1);
while (SDADC_GetFlagStatus(SDADC1, SDADC_FLAG_EOCAL) == RESET)
{
} // разрешение работы с ПДП

SDADC_DMAConfig(SDADC1, SDADC_DMATransfer_Injected, ENABLE);

Примечание: ожидания нужно сделать с таймаутами.

Далее настраиваем контроллер ПДП:

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE); // ПДП2 канал 3 — сигма-дельта АЦП

DMA_DeInit(DMA2_Channel3);
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) &SDADC1->JDATAR;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t) &adc_400hz_buffer[0];
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = ARRAY_LENGHT(adc_400hz_buffer);
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA2_Channel3, &DMA_InitStructure); DMA_ITConfig(DMA2_Channel3, DMA_IT_HT, ENABLE);
DMA_ITConfig(DMA2_Channel3, DMA_IT_TC, ENABLE); DMA_Cmd(DMA2_Channel3, ENABLE);

И таймер, для запуска преобразований:

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM13, ENABLE); // 400 Гц

TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.TIM_Period = 625 — 1;
TIM_TimeBaseStructure.TIM_Prescaler = MCU_SYSCLK_MHZ * 2 — 1;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM13, &TIM_TimeBaseStructure); // запуск преобразований АЦП

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 1;
TIM_OC1Init(TIM13, &TIM_OCInitStructure); TIM_OC1PreloadConfig(TIM13, TIM_OCPreload_Disable); // разрешение работы таймера

TIM_Cmd(TIM13, ENABLE);

В обработчике прерываний по заполнению половины и полного буфера обрабатываем данные:

void DMA2_Channel3_IRQHandler(void)
{ PIN_OFF(PIN_LED_RED); // НЧ канал АЦП нечетный блок
if (DMA_GetITStatus(DMA2_IT_HT3)) { mcu_adc_400hz_refresh(&adc_400hz_buffer[0]); DMA_ClearITPendingBit(DMA2_IT_HT3); } // НЧ канал АЦП четный блок
if (DMA_GetITStatus(DMA2_IT_TC3)) { mcu_adc_400hz_refresh(&adc_400hz_buffer[ADC_400HZ_CHANNEL_QAUNTITY]); DMA_ClearITPendingBit(DMA2_IT_TC3); }
}

Не забываем переводить линии ввода-вывода в аналоговый режим.

Проект целиком не привожу, ещё не все реализовал как хотел.

Документация

RM0313: STM32F37xx and STM32F38xx advanced ARM-based 32-bit MCUs

Источник: http://ziblog.ru/2013/05/17/sigma-delta-atsp-s-razryadnostyu-16-bit-v-mikrokontrollerah-serii-stm32f37h.html

Ссылка на основную публикацию