|
|
  |
LPC2103 и АЦП, Неверные показания АЦП |
|
|
|
Jul 22 2010, 20:49
|

Частый гость
 
Группа: Участник
Сообщений: 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. Это наверное нестабильность по питанию? Или какие-то помехи?
|
|
|
|
|
Jul 23 2010, 08:29
|
Участник

Группа: Участник
Сообщений: 34
Регистрация: 8-12-09
Пользователь №: 54 123

|
Vref=3.3B, а какое оно в реальности?
|
|
|
|
|
Jul 29 2010, 10:39
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(XWoo @ Jul 29 2010, 16:21)  эту строку "#define Vref (33/10)" я увидел в примерах (исходники на си и pdf). видимо тому, кто писал тот код, не требовалась десятичная часть показаний АЦП, нужна была только целая часть. Это просто ваш компилятор оптимизировал вычисление константы. Причем целочисленное вычисление. Поскольку константы без явного указания типа все целочисленные (тип int). А вообще вычислять напряжение АЦП с применением плавающей арифметики как-то неразумно. Тем более когда точность и диапазон изменения величин небольшой. По крайней мере уж на 32-х битных ARM проблем с целочисленным вычислением напряжения, измеряемого встроенным АЦП быть не должно. Кстати, если уж совсем придираться  , то дефайн нужно было привести к виду Код #define VREF 3.3f Во-первых, суффикс f явно приводит константу к типу float. Во-вторых, в макросах общепринято использовать только заглавные символы, чтобы отличать их (макросы) от переменных и функций.
|
|
|
|
|
Jul 29 2010, 11:13
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Попробуйте вычислять так: voltage = adc_value * VREF / RES где VFEF - опорное напряжение в милливольтах (например, 3300 для 3.3в) и RES - разрешение АЦП (для 10 бит - 1023). Получится так: Код unsigned int voltage = adc_value * 3300 / 1023; где voltage - в милливольтах. Все вычисления целочисленные, а желаемого разрешения можно добиться, меняя VREF в большую сторону - 33000, 330000 и т.д.
|
|
|
|
|
Jul 29 2010, 11:29
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(sonycman @ Jul 29 2010, 17:13)  Получится так: Код unsigned int voltage = adc_value * 3300 / 1023; где voltage - в милливольтах. Лучше будет так Код unsigned int voltage = ((unsigned long) adc_value * 3300UL) / 1023UL; без скобок компилятор опять может оптимизировать вычисление константы и умножение будет снова на число 3.
|
|
|
|
|
Jul 29 2010, 15:45
|

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

|
rezident и sonycman, спасибо вам за советы. Завтра попробую. И спасибо всем за участие.  Думаю эту тему можно закрыть.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|