MSP430 и ADC. Использование АЦП.

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

Итак, микроконтроллеры MSP430 имеют в своем составе периферийный модуль ADC10, который представляет из себя 10-битный аналого-цифровой преобразователь (АЦП). А у некоторых контроллеров их целых два — 10 и 12-битный. К основным особенностям можно отнести то, что преобразование может быть запущено при помощи сигнала от таймера A.

Естественно, для работы АЦП необходимо опорное напряжение. MSP430 дает возможность использовать один из двух внутренних источников опорного напряжения (на 1.5 В и на 2.5 В) или внешний источник опорного напряжения.  Вообще ADC10 может работать с двумя источниками опорного напряжения, верхнее напряжение может принимать значения от 1.4 В до значения напряжения питания, а нижнее — от нуля до 1.2 В.

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

АЦП в MSP430 может работать в одном из четырех режимов:

  • однократное преобразование сигнала с одного из каналов
  • однократное преобразование сигналов с нескольких входов
  • повторяющиеся преобразования сигнала с одного из входов
  • и повторяющиеся преобразования с нескольких каналов

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

Регистр ADC10CTL0.

Регистр контроля и управления 😉 Здесь необходимо произвести настройку и выбор источника опорного напряжения. Включение модуля ADC10, запуск преобразования, разрешение прерываний — все это также производится в этом регистре. Кроме того, в регистре ADC10CTL0 можно задать продолжительность выборки — 4, 8, 16 или 64 тактов ADC10. Зачем это менять? А все просто, чем больше продолжительность выборки, тем измерение точнее. Но вместе с этим увеличивается вероятность того, что сигнал на входе изменится за время измерения.

Регистр ADC10CTL1.

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

Регистры ADC10AE0 и ADC10AE1 позволяет включить/отключить любой из внешних каналов АЦП. Нулевой бит регистра ADC10AE0 соответствует входу A0, первый — A1 ну и так далее =)

Ну и тут еще надо упомянуть регистр ADC10MEM — из него мы будем забирать результат преобразования.

Не буду больше пересказывать даташит — давайте перейдем к созданию собственного примера 😉

Задачу поставим такую — измерять сигнал на третьем канале АЦП.

#include "io430.h"
 
#define CONVERSION_VALUE          0.003222
 
float adcValue;
 
int main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
 
  ADC10CTL0 |= ADC10SHT0 | ADC10ON;
  ADC10CTL1 |= INCH0 | INCH1;
  ADC10AE0 |= BIT3;
 
  ADC10CTL0 |= ENC;
 
  while(1)
  {
    ADC10CTL0 |= ADC10SC;
    while(ADC10CTL1 & ADC10BUSY);
 
    adcValue = CONVERSION_VALUE * ADC10MEM;
  }
 
  return 0;
}

А теперь будем обсуждать, что мы тут такое сделали…

Итак, результат преобразования у нас 10 бит. В качестве верхнего опорного напряжения мы будем использовать напряжение питания (3.3 В), а в качестве нижнего — 0. Соответственно, на 3.3 В у нас приходится 10 бит, то есть 1024 отсчета. Таким образом, чтобы из полученного значения результата АЦП получить напряжение в вольтах, необходимо результат умножить на коэффициент 0.003222 (3.3 / 1024).

В регистре ADC10CTL0 мы меняем только два бита — а именно выставляем в единицу бит ADC10SHT0 и бит ADC10ON. Бит ADC10SHT0 нам нужен для установки предделителя частоты равным 8. А бит ADC10ON включает аналого-цифровой преобразователь.

Теперь регистр ADC10CTL1 — в нем мы настраиваем используемый канал — мы будем брать сигнал с третьего канала АЦП, поэтому биты INCH0 и INCH1 должны быть равны единице.

Следующей командой мы включаем все тот же третий канал АЦП:

ADC10AE0 |= BIT3;

Ну и наконец разрешаем преобразование:

ADC10CTL0 |= ENC;

В цикле while(1) мы запускаем одиночное преобразование, ждем пока оно завершится (для этого опрашиваем флаг BUSY) и вычисляем значение напряжения на интересующем нас входе ) Таким образом, мы можем измерять значения напряжения от 0 до 3.3 В.

Понравилась статья? Поделись с друзьями!

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

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