реклама на сайте
подробности

 
 
> LPC2103 и АЦП, Неверные показания АЦП
XWoo
сообщение Jul 22 2010, 20:49
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 91
Регистрация: 19-11-09
Пользователь №: 53 737



Появилась у меня недавно платка, чем-то напоминающая Olimex LPC-H2103. В платке я задействовал таймер, spi, uart, подключил два 7-мисегментных индикатора. PLL выключил (Cclk=Pclk=Fosc=14.7456 МГц). Теперь взялся за АЦП. Примеры скачал. Запустил АЦП в Burst режиме (с прерыванием):

PINSEL0 |= 0x00F00000; // AD3,4
PINSEL1 |= 0x0003F000; // AD0,1,2

ADCR = 0x0020921F;
ADCR |= 0x00010000; // start burst mode

CLKDIV = 147-1 = 146, т.е. АЦП работает на ~100 КГц.
Задействованы аналоговые входы AD0..AD4.

В прерывании опрашиваю входы и результат загоняю в массив:

unsigned int r, ch;

r = ADGDR;
ch = (r >> 24) & 0x00000007;
ADCresult[ch] = (unsigned short)((r>>6) & 0x03FF);

Потом данные из массива отправляю по uart'у и вывожу целую и десятичную часть на 2 индикатора.

Всё работает, но есть одно "НО". У меня не соответствуют значения напряжения в АЦП (10-битный код из регистра ADGDR) и напряжения на аналоговом входе. Я подаю на вход AD4 (вывод 36) напряжение от 0 до 3,3 В. При этом показания напряжения АЦП отличаются от входного на несколько сот милливольт: вместо 3,0В АЦП выдаёт 2,9В; вместо 1,8В - 1,6В; вместо 0,5В - 0,4В - т.е. само отличие непостоянно: чем ближе к нулю, тем оно меньше.

10-битный код я преобразовываю в напряжение следующим образом: [код]*Vref, где Vref=3.3B - образцовое напряжение АЦП (вывод Vdda). Например, если код равен 0x02F6, то это соответствует напряжению 2501 милливольт, однако на вход AD4 подано напряжение 2.9 вольт! Разница в 400 мВ!

Может я неверно расчитываю показания АЦП? Как убрать такое несоответствие?

Ещё у меня младшие 8 бит постоянно меняются, т.е. в коде 0x02F6 число 0xF6 после следующего
измерения АЦП будет уже другим, например: 0x02E5, 0x02FE.
Это наверное нестабильность по питанию? Или какие-то помехи?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
XWoo
сообщение Jul 29 2010, 10:21
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 91
Регистрация: 19-11-09
Пользователь №: 53 737



да дело тут не в батарейках (3 различных мультиметра показывали одно и тоже), а в том что компилятор кейл строку "#define Vref (33/10)" воспринимает не как 3.3, а как 3, поэтому и произведение показаний ацп (10 бит) на Vref было занижено. а вот когда я поставил "#define Vref (3.3)", тогда всё встало на свои места.

оба напряжения я уменьшил до 1.90В и 3.35В (соответственно и Vref поставил равным 3.35).

если сделать эти напряжения равными 1.80/1.85 и 3.30, то моя платка не работала.


эту строку "#define Vref (33/10)" я увидел в примерах (исходники на си и pdf). видимо тому, кто писал тот код, не требовалась десятичная часть показаний АЦП, нужна была только целая часть.
Go to the top of the page
 
+Quote Post
rezident
сообщение Jul 29 2010, 10:39
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(XWoo @ Jul 29 2010, 16:21) *
эту строку "#define Vref (33/10)" я увидел в примерах (исходники на си и pdf). видимо тому, кто писал тот код, не требовалась десятичная часть показаний АЦП, нужна была только целая часть.

Это просто ваш компилятор оптимизировал вычисление константы. Причем целочисленное вычисление. Поскольку константы без явного указания типа все целочисленные (тип int).
А вообще вычислять напряжение АЦП с применением плавающей арифметики как-то неразумно. Тем более когда точность и диапазон изменения величин небольшой. По крайней мере уж на 32-х битных ARM проблем с целочисленным вычислением напряжения, измеряемого встроенным АЦП быть не должно.
Кстати, если уж совсем придираться biggrin.gif, то дефайн нужно было привести к виду
Код
#define VREF 3.3f

Во-первых, суффикс f явно приводит константу к типу float. Во-вторых, в макросах общепринято использовать только заглавные символы, чтобы отличать их (макросы) от переменных и функций.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 9th August 2025 - 06:51
Рейтинг@Mail.ru


Страница сгенерированна за 0.01382 секунд с 7
ELECTRONIX ©2004-2016