Каскадні АЦП для отримання більш високої роздільної здатності


11

Припустимо, у мене є пара 12-бітних АЦП, я можу уявити, що вони можуть бути каскадно отримані <= 24-бітний вихід.

Я можу подумати про те, щоб просто використовувати один для позитивного діапазону, а другий для негативного діапазону, хоча, мабуть, буде певне спотворення в перехресній області. (припустимо, ми можемо ігнорувати декілька бітів помилок або, можливо, розмістити 3-й АЦП для вимірювання значення близько 0 вольт).

Ще один варіант, про який я думав, - це використання однієї високої швидкості АЦП та перемикання опорних напруг для отримання більш високої роздільної здатності при меншій швидкості. Крім того, повинен бути спосіб отримати реальну оцінку результату за допомогою одного АЦП з фіксованим посиланням, а потім перемикати арефи вторинного перетворювача, щоб отримати більш точне значення між ними.

Будь-які коментарі та пропозиції вітаються.

Я припускаю, що квадратичний 8-розрядний (або подвійний 12-бітний) чіп дешевший, ніж один 24-розрядний чіп.


2
Так, це можливо в теоретичному відношенні і в 0,01% реальних випадків, коли деталі мають "Effectve кількість бітів", що дорівнює "Кількість даних біт", а решта специфікацій складаються на додаткові 5 порядків точності. Що не відповідає 99,99% деталей.

4
Якщо ви використовуєте одну для позитивних напруг, а іншу для негативних напруг, то ви отримуєте лише 13 біт. Каскад їх вимагає ЦАП і підсилювача. Ви перетворюєте безпосередньо на сигнал, записуєте значення в ЦАП і віднімаєте вихід ЦАП від вхідного сигналу. Потім ви посилюєте сигнал на і подаєте його на другий АЦП. 212
Коннор Вольф

Відповіді:


11

Багато питань у вашому запитанні. Тож давайте візьмемо їх по черзі.

Припустимо, у мене є пара 12-бітних АЦП, я можу уявити, що вони можуть бути каскадно отримані <= 24-бітний вихід. Я можу подумати про те, щоб просто використовувати один для позитивного діапазону, а другий для негативного діапазону, хоча, мабуть, буде певне спотворення в перехресній області. (припустимо, ми можемо ігнорувати декілька бітів помилок або, можливо, розмістити 3-й АЦП для вимірювання значення близько 0 вольт).

Не дуже - ви отримали б 13-розрядну роздільну здатність. Можна описати роботу 12-бітового перетворювача, як вирішити, в якому з 4096 бін (2 ^ 12) входу знаходиться напруга. Два 12-бітових АЦП дають вам 8192 біни або 13-бітну роздільну здатність.

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

Насправді саме так працює перетворювач послідовного наближення . В основному однобітний перетворювач (ака-компаратор) використовується з цифро-аналоговим перетворювачем, який виробляє різну опорну напругу відповідно до алгоритму послідовного наближення для отримання оцифрованого зразка напруги. Зауважте, що перетворювачі SAR є дуже популярними, і більшість АЦП в UC мають тип SAR.

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

Насправді це жахливо схоже на те, як працюють АТС трубопроводів . Однак замість зміни посилання на вторинну АЦП помилка залишку, що залишилася після першої стадії, посилюється та обробляється АЦП наступної стадії.

Будь-які коментарі та пропозиції вітаються. Я припускаю, що квадратичний 8-розрядний (або подвійний 12-бітний) чіп дешевший, ніж один 24-розрядний чіп.

Насправді є причина в тому, що наявність 24-бітового перетворювача не так просто, як розташування в якійсь конфігурації чотирьох 8-бітових перетворювачів. До цього є набагато більше. Я думаю, що ключовим непорозумінням тут є думка, що можна просто «додати» кількість біт. Щоб зрозуміти, чому це неправильно, краще розглядати АЦП як ланцюг, який вирішує, до якого «бін» вхідної напруги належать. Кількість бункерів дорівнює 2 ^ (кількість біт). Отже, 8-бітний перетворювач матиме 256 бункерів (2 ^ 8). 24-бітний перетворювач матиме понад 16 мільйонів бункерів (2 ^ 24). Отже, щоб мати таку ж кількість бункерів, як у 24-бітовому перетворювачі, знадобиться понад 65 тис. 8-бітових перетворювачів (фактично 2 ^ 16).

Для продовження аналогії бункера - припустимо, що ваш АЦП має повну шкалу 1В. Тоді 8-бітний перетворювач "бін" дорівнює 1 В / 256 = ~ 3,9 мВ. У випадку 24-розрядного перетворювача це буде 1V / (2 ^ 24) = ~ 59,6nV. Інтуїтивно зрозуміло, що «вирішити», якщо напруга належить меншому бункеру, важче. Дійсно це відбувається через шум та різні ненормальності ланцюга. Таким чином, не тільки одному знадобиться понад 65 тис. 8-бітових перетворювачів, щоб отримати роздільну здатність 24 біт, але й 8-бітовим перетворювачам потрібно було б мати можливість розміщувати до 24-бітового розміру бін (ваш звичайний 8-бітовий перетворювач був би недостатньо хорошим, як це здатний вирішити ~ 3,9 мВ bin не 59,6nV bin)


Діапазон, з якого працює 8-бітний перетворювач, становить 256 * 59,6nV = 15,26uV. Я ніколи не робив таких низьких і точних опорних напруг :)
Ганс,

14

1212121212 1213

VREF2

Немає такого поняття, як безкоштовний обід.

редагувати
Здається, що виникає непорозуміння щодо надмірного розміщення, і той факт, що є 1-бітні аудіо АЦП, які можуть дати вам 16-бітну роздільну здатність.
Якщо ваш вхід є фіксованим рівнем постійного струму, скажімо, 0,2 В в діапазоні входу 1 В, ваш вихід завжди буде однаковим. Для 1-розрядного АЦП для нашого прикладу це буде нульове значення (рівень менше половини еталонного). Тепер це станеться так, чи вибираєте ви з 1 вибіркою в секунду, або 1000. Отже, усереднення цього не змінює. Чому він працює з аудіо АЦП ?, тому що напруга постійно змінюється (шум), що, за Ейнштейном (відносність, ви знаєте ;-)), те саме, що підтримувати напругу постійною і змінювати еталон. А потімви отримуєте декілька різних показань під час перебігу зразків, які ви можете оцінити в середньому, щоб отримати досить гарне наближення до вашого фактичного рівня.
Шум повинен бути достатньо сильним, щоб перейти поріг (-и) АЦП, і повинен відповідати певним обмеженням, як-от Гауссова розподіл (білий шум). У 1-бітному прикладі це не спрацювало, оскільки рівень шуму занадто низький.


Додаткове читання:
Примітка програми Atmel AVR121: Підвищення роздільної здатності АЦП шляхом перебігу симпатій


Я не впевнений, що я розумію ваше мислення з цього приводу. Безумовно, якщо ви розділите + і - ви зможете пробувати вибірки на 0v до + 4.096v на 12 біт і 0v на -4.096v на 12 біт, що складає всього 24 біти за весь діапазон?
Majenko

1
@MattJenkins, це було б те саме, що і бітовий знак. Подумай над цим. Якщо я пробую 0-10 В з 12 бітами і 0 - (- 10 В) з 12 бітами, мені потрібен лише один біт, щоб сказати, чи сигнал був негативним чи позитивним.
Кортук

Це правда - тому, хоча ви можете взяти вибірку як 24 біти, ви можете отримати точно таку ж роздільну здатність лише з 13 бітами.
Majenko

8V2V=228V1V=23

@MattJenkins, ви можете використати 1 гаряче кодування і взяти 1024 біти замість 10. Фізична реальність полягає в тому, що інженер може робити все, що завгодно, просто скажіть клієнту, що ви вимкнені лише за допомогою 3dB, а не 10 кВт.
Кортук

3

Так, теоретично ви можете робити все, що завгодно, але тільки якщо у вас є якесь абсолютно нереальне обладнання.

На жаль, кілька інших зауважень щодо обмеженої додаткової точності є правильними.

Розглянемо. Виміряйте напругу за допомогою 12-бітового АЦП та скажіть 111111000010 Ви знаєте, що реальна величина лежить десь у діапазоні 1 біт +/- 0,5 біт з будь-якої сторони цього значення.

Якщо ваш АЦП був точним до 24 біт, але він надав лише 12 біт, то він повідомляє, що ваклуї лежать в межах +/- половини трохи 111111000010 000000000000. Якщо це так, ви можете взяти 12-бітний АЦП з +/- 1/2 бітового діапазону, відцентруйте його на 111111000010000000000000 і прочитайте результат. Це дасть вам різницю між фактичним сигналом та значенням aDC, як бажано. QED.

Однак 12-бітний АЦП сам по собі точний приблизно до півбіта. Сума його різних помилок змушує оголосити певний результат, коли реальний результат дорівнює приблизно половині, але різний плюс-мінус.

Поки ти хотів би

111111000010 означає 111111000010 000000000000

це насправді може означати 111111000010 000101101010 або будь-що інше.

Так, якщо ви берете 2-й АЦП і вимірюєте 12 нижніх бітів, і ЗАКАЖИТЕ, що вони відносяться до точної 12-бітової межі, вони насправді відносно вказаного вище помилкового значення. Оскільки це значення по суті є випадковою помилкою, ви додасте вам нову 12 нижню бітну цифру до 12 біт по суті випадкового шуму. Точний + випадковий = новий випадковий.

ПРИКЛАД

Використовуйте два конвеєри, які можуть виміряти діапазон і дати результат у 1 з 10 кроків. Якщо масштабувати до 100 вольт FS, вони дають ge 0 10 20 30 40 50 60 70 80 90

Якщо масштабувати до 10 вольт повного масштабу, вони дають 1 2 3 4 5 6 7 8 9

Ви вирішили використовувати ці два перетворювачі для вимірювання діапазону 100 вольт з точністю 1 вольт.

Перетворювач 1 повертає 70В. Потім ви вимірюєте напругу відносно 70В і отримуєте -3В. Отже, ви робите висновок, що реальна величина, тобто + 70В - 3В = 67В.

ЯКЩО результат 70В ​​насправді може бути будь-яким із 65 66 67 68 69 70 71 72 73 74

Тільки якщо 1-й перетворювач точний на 1 В на 100, навіть якщо він показує 10 В кроків у 100 В, ви можете досягти того, що ви хочете.

Тож реальний результат - 67 В +/- 5 вольт = що-небудь від 62 до 72 В. Тож вам не краще, ніж раніше. Ваш центр перемістився, але він може бути розташований випадковим чином.

Таким чином, ви зможете отримати незначне вдосконалення, оскільки перетворювач, ймовірно, трохи точніший, ніж біти, які він повертає (ви сподіваєтесь), тому ваш другий перетворювач цим скористається.


Система, яка насправді працює, була згадана з одним важливим недоліком. Якщо ви відібрали сигнал N разів і додали + / _ півбіт гауссового шуму, ви поширите сигнал "у всьому можливому діапазоні", і тепер середнє значення буде журналом (N) точнішим, ніж раніше. У цій схемі є риболовлі та кваліфікація, і ви не можете просто отримати довільну кількість бітів, але вона пропонує деяке вдосконалення.


У першому випадку я згадав 12-ти бітний АЦП з 24-бітовою точністю. Ви можете досягти чогось подібного, використовуючи 12-бітний АЦП та зчитуючи його передбачуване значення за допомогою 24-бітового, наприклад, дельта-сигма-перетворювача. Якщо сигнал був досить стабільним, що він залишався в одному і тому ж бітовому діапазоні, ви можете використовувати 2-й АЦП, щоб прочитати 2-й 12 біт wrt цього стабільного сигналу.

Альтернативно - просто прочитайте 24-бітовий сигнал спочатку за допомогою дельти сигми, зафіксуйте в цій точці, а потім послідовно обміняйтесь відносно нього з 2-м АЦП. До тих пір, поки сигнал залишається в межах 2-го АЦП, ви отримаєте набагато швидший результат.


Хммм. Один голос. Один голос проти. З огляду на те, що тут проходять ОК відповіді [tm] :-) Мені було б цікаво дізнатись, хто вважав, що ця відповідь така жахлива, що заслуговує на те, щоб проголосувати, і чому?
Рассел Макмахон

1

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

Він працює, додаючи сигнал до шуму. Хоча шум зменшує роздільну здатність, необхідно змусити дані розділитися на кілька біт. (Я не хлопець, що обробляє сигнали - це я просто розумію.) Ваш шум може бути лише 1 або 2 біта, але він повинен бути там. Якщо ви берете один 12-бітний зразок - у вас є 12 біт. Якщо потім взяти 4 зразки, скласти їх і розділити на два, ви отримаєте 13-бітну пробу. (Кожен додатковий біт вимагає 4 вибірки, завдяки Nyquist.)

Простий спосіб зробити це - додати шум до опорної напруги. Я використовую це для підвищення 12-бітового АЦП в dsPIC33F до 16-бітного для більш високої роздільної здатності. Заздалегідь я встановив асинхронний таймер на високій частоті і використовую DMA для встановлення черги на послідовність номерів PRNG у вихідному захопленні, що дає відносно чисте джерело шуму. Шум виводить зміщення опорної напруги приблизно на 0,1% (роздільник 1k-1Meg.) Шум двосторонній, протікає і джерело. Я використовую DMA dsPIC33F для встановлення черги зразків, тому це можна зробити з невеликим втручанням процесора. Звичайно, максимальна частота вибірки падає приблизно до 1/32 нормальної норми, але це не є проблемою для мого застосування.

Оскільки шум не завжди рівномірно розподілений, я буду калібрувати входи на кожній одиниці, що постачається, хоча різниця, ймовірно, буде лише 1 або 2 LSB.


Як ви знаєте, що шум, який ви додаєте, має правильний спектр (це білий шум)? Як ви вирішите на амплітуду? Якщо ваш шум не дуже хороший, то ви будете мати більше роздільної здатності, але не більше точності.
Федеріко Руссо

@Federico Звичайно - для мене це спроби та помилки. Білий шум можна змоделювати за допомогою PRNG, і лише для 32 зразків він працює досить добре. Якби я був фактичним інженером електроніки, я б знав, як це зробити правильно.
Томас О

Ось стаття на Analog Devices, яка може допомогти пояснити це: analog.com/library/analogdialogue/archives/40-02/adc_noise.html
DarenW

@ThomasO, я використав цю техніку з термісторами, щоб додати 8 біт точності. Хоча не з шумом, ми використовували опалення.
Кортук

@DarenW Це виглядає звично - я думаю, що саме тут я взяв свою ідею.
Томас О

1

За допомогою підсилювача підсумовування можна підсумовувати два виходи ЦАП. Можна використовувати R1 = 100k, R2 = R3 = 100 Ом. Таким чином вихід буде Vout = - (V1 + V2 / 1000). Вам знадобиться подвійне джерело живлення, і якщо ви хочете, щоб він не був інвертованим, вам потрібно поставити інший інвертуючий підсилювач з коефіцієнтом посилення = 1. Отже, скажімо, у вас є 12 бітний ЦАП з 2 виходами та посиланням 4.096V. Тоді (якщо у вас другий інвертуючий підсилювач) один приріст від ЦАП 1 збільшить вихід на 1уВ, а один приріст від ЦАП 2 збільшить вихід на 1мВ. Це загалом не 24 біти. Йдеться про 22 біти. Теоретично ви можете вибрати R1 в 4096 разів більший за R2 і R3 і отримати 24 біти, але кращих результатів ви не отримаєте. У вас буде багато проблем із шумом у мікронапругах, навіть якщо ви вибрали хороший оппам із низьким рівнем шуму.

Оновлення Хоча це питання про ЦАП, тому що я шукав ЦАП. Ось як ви застосовуєте подібний принцип з АЦП. Замість підсумовування потрібно відняти результат ADC1, а потім помножити на 1000 перед вимірюванням ADC2.

Подвійна роздільна здатність АЦП

Виправлення - ADC3 повинен бути на VGnd (Vref / 2), а не Vref, щоб відповідати формулі результату

Замість AZ431 ви можете використовувати будь-яку іншу 2,5В посилання або іншу регульовану посилання з належними пасивами, щоб отримати рівно 4.096В. Чим менше температурний дрейф має еталон, тим кращі результати. Також він повинен бути низьким рівнем шуму. Зауважте, що так, мабуть, недостатньо точно. Буде приємно покласти тримпот 500 Ом на кілька поворотів між R7 та R8 с двірником на опорний вхід і налаштувати його на Vref = 4.096V точно. Також буде потрібен підрізник (2) між R1 і R2 зі склоочисником до позитивного входу U1. Налаштуйте його на 2.048V на VGnd. U1 - це будь-який підсилювач з низьким рівнем шуму. (BTW AZ431 - жахливо для роботи. Я поставив це, тому що у мене був символ).

Для U2, U3 і U4 дуже важливим є нульове зміщення амперних амперів. U2 важливіший, тому що він розмножується на 100. кожен 1 мікровольт потрапляє на 100 мікровольт. Якщо ви користуєтесь OP07, а ви нулюєте його належним чином, а температура змінюється на 10 градусів, тоді ви отримаєте зміщення 13 уВ, що означає вихід 1,3 мВ на виході U4. Це 13 мВ в АЦП, що робить ADC2 майже марним.

Також U3 повинен бути в змозі досягти 6.048V - це VGnd (2.048V) + 2xVinmax (2x2V = 4V). Ось і вся ідея мати Vcc = + 12 В. Коли використовується MAX44252, Vcc може становити 6,5 В. Оскільки MAX44252 є рейковою до залізничної оппамп, негативна подача може бути пропущена, а Vss підсилювача можна підключити до землі. Це справедливо для будь-якого операційного апарата, який може вийти на низький рівень, ніж 48 мВ на його виході.

MAX44252 має зміщення напруги 2-4uV (типовий) та температурний дрейф від 1 до 5 нВ. Це 2,64 долара на digikey в кількості 1, і це квадропамп, тому лише одна фішка зробить цю роботу.

Як це працює? Давайте, наприклад, 10 біт ЦАП. Роздільна здатність 4.096 / 1024 = 4мВ. Вхідний сигнал повинен бути відносно VGnd, що становить половину Vref. ADC1 вимірює вхідну напругу як нормальну. Потім виводить значення через DAC1. Різниця між Vin та DAC1 - це помилка, яку потрібно підсилити, виміряти та додати до результату ADC1. U2 посилює різницю Vin - DAC1 відносно DAC1 з коефіцієнтом посилення 100. U4 посилює цю різницю на 10, а також віднімає DAC1 щодо VGnd. Це робить ADC2 = (Vin - DAC1) * 1000, відносно VGnd. Іншими словами, якщо у вас на Вині 1,2234567V, відносно VGnd. ADC1 буде вимірювати значення 821тому що роздільна здатність 4mV і (2.048 + 1.234567) /0.004 = 820.64175. Таким чином, значення ЦАП буде встановлено на 309, що становить 309 * 0,004 В = 1,236 В. Тепер ADC2 отримає 1,2234567-1,236 = -0,001433 * 1000 = -1,433В щодо VGnd (в ідеалі). Це загальний режим 2.048-1.433 = 0,615 В. 0,615 В / 0,004 = 153,75. Отже значення ADC2 = 154. Простіше обчислити значення в мікровольтах, щоб уникнути використання поплавця. щоб перетворити ADC2 в мВ, ми повинні перемножити значення на 4: VADC1 = 821 * 4 = 3284mV. Для перетворення на УВ нам потрібно помножити на 1000. Або це значення ADC1, помножене на 4000. 821 * 4000 = 3284000. Отже, напруга ADC1 щодо VGnd становить 3284000-2048000 = 1236000uV. ADC2 вже помножено на 1000, тому нам потрібно помножити лише на 4: VADC2 = 154 * 4 = 616. Для отримання напруги відносно VGnd нам потрібно відняти VGnd: 616-2048 = -1432uV. Ми беремо тут VGnd = 2048uV, оскільки у нас є посилення x1000. Тепер ми додаємо VADC1 і VADC2: 1236000 + (-1432) = 1234568uV або 1,2234568V

Звичайно, це просто мрії, тому що, коли ви маєте справу з мікровольтами, виникнуть усілякі жахливі проблеми - шум від підсилювача, шум резисторів, зміна напруги, температурний дрейф, помилка посилення ... Але якщо ви використовуєте гідні деталі, принаймні 1% резисторів і Ви програмно скасуєте залік і відкоригуєте коефіцієнт підсилення, ви можете отримати досить хороший результат. Звичайно, ви не можете розраховувати побачити стабільний вхід до останньої цифри. можливо, ви можете обмежити роздільну здатність до 10uV (розділити результат на 10). Також множення на 4 можна зробити шляхом підсумовування 4 послідовних результатів, щоб мати деяке усереднення.

Майте на увазі, що нічого з цього не перевіряється. Я імітував лише ступінь підсилювача, не враховуючи шум та компенсацію компенсації. Якщо хтось вирішить це побудувати, напишіть результати в коментарях.


Питання задається про AD C. Ви говорите про DA C.
тьмяно втратив віру в SE

Мені шкода. Я шукав ЦАП і знайшов це питання. Я писав, не уважно читаючи. Я компенсую підказку, як застосувати той же принцип до АЦП.
NickSoft

Я усунув свою незаконність, оскільки ваша публікація зараз пов’язана з цим питанням. Але я не думаю, що це рішення може спрацювати на практиці. Боюся, буде занадто багато неточностей.
дим втратив віру у SE

Звичайно, це спрацює. Однак точність залежить від використовуваних деталей. Існують підсилювачі, які мають зміщення 0,1uV і дрейф 1-5nV / degC. Крім того, вони мають нанонапруги 0,1-10 Гц pp шум. У поєднанні з хорошою орієнтацією він міг отримати стабільний вихід до 10 с UV. Але це може працювати з дешевшими деталями, якщо ви хочете отримати додатковий розряд. Наприклад, 10-бітний АЦП має 4,096 В посилання має 4mV роздільну здатність. Я думаю, що за допомогою цієї схеми це можна вдосконалити до роздільної здатності 0,1uV з легкістю (можливо, з кращим посиланням). Це +/- 20000 рахує. Звичайно, для компенсації та посилення знадобиться калібрування програмного забезпечення.
NickSoft

Це вся теорія. Той факт, що ваше зчитування ADC2 залежить від вашого параметра DAC (і зсуву підсилювача, але це навіть не найважливіша частина), що залежить саме від вашого читання ADC1 (і все це має допуски), призведе до того, що ви, безумовно, виграли Ви не зможете навіть гарантувати монотонну роботу вашої системи (навіть якщо ви знаходитесь в межах вашої розрахункової точності).
дим втратив віру в SE

0

log2(a lot)

редагувати: дивіться коментарі щодо виправлень до моєї математики.


Це те, що я думав також, але врахуйте це: 1В вхідний діапазон, вхід 0,2 В, 1-бітний АЦП. Незалежно від того, наскільки високий ваш показник перевибору, ви завжди будете читати 0, середній = 0, а не 0,2.
stevenvh

Таке перенапруження вимагатиме певного «шуму» в сигналі. Як вказував Стівенх. Іноді в самому сигналі достатньо "шуму" на ньому, щоб досягти цього без нічого нового. Інший раз вам потрібно вводити в сигнал якийсь високочастотний шум, але шум буде відфільтрований під час післяобробки, яку ви робите після цього.

Правильно, ну, "залежно від характеру вашого сигналу". Питання не говорить про те, чи читає він температуру від термістора, приклеєного до свинцевої цегли, чи він вибирає вихід змішувача для SDR. Тому він отримав інший варіант. Якщо хто-небудь може надати вказівник на точні математичні властивості, потрібен сигнал для пересистемизації, то я був би дуже зацікавлений, btw. (І, здається, це було б корисним доповненням, а не, вибачте, виправлень, які є дещо менш хвилястими в руці, ніж моє первісне твердження.)
Jay Kominek

log2(alot)2

Моя основна зацікавленість викликає аудіосигнали, тому, хоча 24-бітні перетворювачі досить дорогі і їх не так багато, можливо, каскадні більш широкодоступні перетворювачі будуть працювати. Дякую всім за поглиблене пояснення. Спочатку це звучить можливо, чи не так? :)
errordeveloper
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.