Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Микроконтроллеры PIC фирмы Microchip для начинающих выпуск №26


РАССЫЛКА Микроконтроллеры PIC фирмы Microchip для начинающих
Ведущий: Алексей (pont_a@mail.ru)


Доброго времени суток, дамы и господа!!

Сегодня продолжаем рассматривать периферийный модуль АЦП микроконтроллера PIC18F452! Этот выпуск будет посвящен алгоритмам и примерам работы с АЦП.

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

  1. Необходимо настроить сам периферийный модуль АЦП. Настроить аналоговые входы, сконфигурировать входы опорного напряжения, выбрать измеряемый канал. Настроить частоту преобразования. Период преобразования Tad выбирается из следующих соображений, чтобы он был не менее 1,6 мкс. Иначе, результат может оказаться неверным. Поэтому, делитель ADCS2:0 необходимо правильно настроить, исходя из тактовой частоты микроконтроллера! На одно преобразование аналогового сигнала модулю АЦП требуется 12 Tad. Если модуль АЦП предполагается использовать в SLEEP «энергосберегающем, спящем» режиме микроконтроллера, то делителем ADCS2:0 необходимо выбрать тактирование АЦП от собственного внутреннего RC-генератора АЦП (Tad = 2-6 мкс).  Приведу пример расчета делителя. Например, если тактовая частота микроконтроллера равна 40МГц – это период = 0,000000025сек. Теперь, делим 1,6мкс/0,025мкс=64. Поэтому, выбираем битами ADCS2:0 значение Fosc/64. И мы получим Tad, равное 1,6 мкс. Уже подсчитанное значение делителя для номинального периода Tad при наиболее часто встречающихся тактовых частотах кварца можно найти в таблице 17-1 в datasheet на наш микроконтроллер.            
  2. Включить модуль АЦП.
  3. Настроить прерывание от АЦП, если оно необходимо в программе.
  4.  Выждать время acquisition time. Это время рассчитывается в datasheet и при стандартных условиях (выходное сопротивление источника аналогового сигнала=2,5кОм, максимальная рабочая температура = 50 °С, погрешность – ? младшего бита результата преобразования) равно 12.86 мкс. Но, это время можно и увеличить. Данное время необходимо, чтобы зарядился конденсатор, находящийся в модуле преобразования. Потому что, реально, аналоговый сигнал «запоминается» на конденсаторе, а потом входной аналоговый сигнал отключается и преобразователь работает только с этим запомненным сигналом. Конденсатор этот называется Chold.  
  5. Запускаем преобразование. Преобразование начинается установкой в единицу бита GO/DONE регистра ADCON0. После установки этого бита, конденсатор Chold отключается от входного аналогового сигнала, и преобразователь работает с «запомненным» на Chold аналоговым сигналом. Как мы помним, на преобразование затрачивается 12 периодов Tad.
  6. Ждем автоматического сброса бита GO/DONE или прерывания от АЦП. Как только происходит прерывание или сброс бита, конденсатор Chold, автоматически, обратно подключается к аналоговому входному сигналу.
  7. Читаем полученное значение преобразования. Из регистров ADRESH:ADRESL читаем выровненный влево или вправо результат.
  8. Переключаем мультиплексор на другой измеряемый канал. Если измеряем только один канал, то с мультиплексором ничего не делаем. Если каналов несколько, то выбираем следующий канал, настраивая на него мультиплексор АЦП.
  9. Ждем, когда зарядится конденсатор Chold. Это время должно быть не меньше 2-х периодов Tad, чтобы новое аналоговое значение успело «запомниться» на конденсаторе.  А потом, повторяем всю последовательность действий с пункта 5.  

А теперь примеры на ассемблере.
Как мы помним по нашей схеме из предыдущих выпусков рассылки, у нас тактовая частота задается кварцем и равна 20МГц. Находим в datasheet по таблице 17-1 номинальное значение делителя для такой тактовой частоты – оно равно 32. Таким образом, период Tad будет равен: 32/20000000= 0,0000016 сек или 1,6 мкс.  
; Настраиваем модуль АЦП
         MOVLW          0x8E                           ; опорное напряжение равно напряжению микроконтроллера, используется только вход AN0, правое выравнивание
         MOVWF           ADCON1, ab
         MOVLW          0x81                            ; делитель - Fosc/32, выбираем на мультиплексор канал AN0, и включаем АЦП
         MOVWF           ADCON0, ab
         BCF                   PIE1, ADIE, ab         ; прерывание использовать не будем
; ждем  когда зарядиться конденсатор Chold (acquisition time=12,86мкс)
; на каждую команду требуется 200нсек (4/20000000), таким образом, 12,86/0,2=65 - столько команд потребуется, чтобы выдержать интервал в 12,86 мкс
; организуем программную задержку (пусть и будет погрешность, но она будет в сторону увеличения времени, а это не критично)
       MOVLW            0x11
       MOVWF             temp, ab                     ; счетчик циклов      
Wait_aq:                                                      
       NOP
       NOP       
       DECFSZ             temp, rf, ab                ; Цикл выполняется за 4-5 команд 
       BRA                    Wait_aq                     ; поэтому, грубо 4*17=72 команды
Start_ADC:
       BSF                     ADCON0, GO_DONE, ab   ; старт преобразования                                                         
       BTFSC                ADCON0, GO_DONE, ab   ; ждем пока не сброситься данный бит    
       BRA                    $-2                              ; возврат на одну команду назад (-2, потому что каждая команда занимает в памяти программ 2 байта)
; читаем результат         
       MOVFF             ADRESH, ADC_value_h    
       MOVFF             ADRESL, ADC_value_l
      ; измеряемый канал один – AN0, поэтому мультиплексор не трогаем
      ; ждем 2 периода Tad = 1,6*2/0,2 = 16 команд, пока заряжается конденсатор
       MOVLW            0x04
       MOVWF             temp, ab                     ; счетчик циклов      
Wait_Chold:                                                 
       NOP
       NOP       
       DECFSZ             temp, rf, ab                ; Цикл выполняется за 4-5 команд 
       BRA                    Wait_Chold                ; поэтому, грубо 4*4=16 команд
       CLRWDT
       BRA                    Start_ADC                 ; начинаем следующее преобразование

В следующем выпуске, начнем рассматривать модуль захвата/сравнения микроконтроллера PIC18F452.

Полный архив рассылки Вы можете прочитать на нашем сайте!  При любом опубликовании текстов данной рассылки ссылка на сайт
http://www.2aplusa.ru обязательна!

Желаю Вам удачи! До скорой встречи!


С уважением, Алексей pont_a@mail.ru
Cайт разработчиков 2AplusA http://2aplusa.ru


В избранное