Програмування аналогових перетворювачів Bascom-8051

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

а) організація роботи програми перетворення

б) забезпечення інтерфейсу ЦАП або АЦП з процесором

в) вибір форми подання цифрового значення вимірюваного або встановлюваного параметра

г) перетворення з коду АЦП в формат придатний для обчислення і перетворення встановлюваного значення в код завантаження ЦАП

д) оптимальна цифрова калібрування перетворювачів

е) накопичення, усереднення і виведення даних АЦП

ж) введення і підготовка даних ЦАП

з) прискорення прийняття рішень на підставі даних АЦП

Розглянемо ці завдання докладніше в тому ж порядку Почнемо з організації роботи програми – з вибору двигуна Для приведення в дії будь-якої програми, що працює з аналоговими пристроями, завжди потрібен якийсь двигун У ролі двигуна може виступати:

а) зовнішня подія, наприклад, прихід команди з клавіатури або з зовнішнього інтерфейсу на установку нового значення відтвореного параметра (або запит виміряних даних) Зазвичай, таким чином, працюють системи з ЦАП

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

в) команда вимірювального пристрою про готовність даних Найхарактерніший приклад таких систем – пристрої, в основі яких лежить повільний АЦП (інтегруючого типу) Привязка всіх системи до повільного АЦП є кращим рішенням, що дозволяє виключити небажані перехідні процеси і розриви потоку даних Основний недолік подібних систем можливість зупинки програми при перевантаженні або відмову вимірювального пристрою (втім, легко усувний)

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

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

Розглянемо з проблему інтерфейсу Майже завжди АЦП або ЦАП, з якими працює мікроконтролер, є однокристальними пристроями Номенклатура цих пристроїв, надзвичайно широка і завжди, за винятком особливих випадків, може бути обрана модель, яка задовольнить метрологічним вимогам, швидкості, конфігурації входу (виходу) і напрузі харчування Обраний за вказаними критеріями, перетворювач частіше виявляється з послідовним портом В результаті виникають складності досягнення високої швидкодії при зчитуванні (записи) даних Це обумовлено відсутністю більшості у процесорів сімейства 8051 високошвидкісного апаратного послідовного порту, а з іншого боку використання АЦП і ЦАП з паралельним портом також не завжди можливо через дефіциту вільних ліній портів Таким чином, завдання інтерфейсу зводиться до програмного формуванню сигналів управління на висновках перетворювача і переміщенню даних з регістрів процесора в пристрій або навпаки У загальному випадку, створення програми зчитування (з АЦП) і тим більше запису даних (у ЦАП) за допомогою операторів Bascom не представляє великої складності Для цього передбачені оператори SHIFTIN,

SHIFTOUT, SPIIN, SPIOUT Труднощі зявляються, коли пристрій, з яким необхідно взаємодіяти, має число розрядів не кратну восьми (не є цілим числом байт) і не допускає подачу зайвих імпульсів на вході синхронізації Практично таких мікросхем дуже мало Найчастіше мікросхеми, що не допускають подачу зайвих імпульсів, орієнтовані на байтовий обмін, і тому проблем з ними взагалі не виникає Справедливості заради, потрібно сказати, що проблема числа імпульсів синхронізації виникає тільки для мікросхем, що мають двопровідний інтерфейс, або при спробах використання наявні трипровідні (і більше) інтерфейси як двопровідний Використання асемблера для написання підпрограм введення-виведення виправдано тільки в одному випадку, коли ці підпрограми викликається в перериванні, і до них предявляються особливі вимоги по швидкості і кількості використовуваних регістрів В інших випадках це робити не рекомендується, тому бібліотеки Bascom дають оптимальний код і швидкодія (50 – 70% від можливого) Нижче наведено приклад програми, що працює з типовим пристроєм, що має послідовний інтерфейс У тексті програми є всі варіанти організації інтерфейсу за допомогою операторів послідовного виведення SHIFTOUT і SPIOUT

‘————————————————- ————- Програма тестування цифрового потенціометра AD8400 -2, -3

‘————————————————- ————- Dim Badr As Byte байтовий адреса

Dim Value As Byte значення записуваного коду

Dim Wtmp As Byte тимчасові дані Pdin Alias ​​P10 підключення ЦАП Pcs Alias ​​P12

Pclk Alias P13

‘———————

Config Spi = Soft , Din = P10 , Dout = P11 , Cs = P12 , Clk = P13 ———————

‘TIMER2 в режимі 16-біт таймера з внутр тактується для синхронізації UART Config Timer2 = Timer, Gate = Internal, Mode = 2

$ Baud = 9600 швидкість 96 кБ

$ Crystal = 12000000 при кварці 12 МГц

‘——————— Set Pcs : Reset Pclk

‘Цикл

Mc:

Input Enter number of DAC , Badr запит адреси ЦАП Input Enter code for DAC , Value запит даних ЦАП Value = Value And & B00000011 маска

Print DAC = Badr Code = Value покажемо

‘———————

‘_ Тимчасова діаграма роботи інтерфейсу _

‘  |                                          |  CS              

   X    X    X    X    X    X    X    X    X 

Data

‘      _    _

_    _    _

_    _    _

    | |  | |  | |  | |  | |  | |  | |  | |     ———————

Clk

‘Gosub Ser_out використовувати підпрограму виведення Wtmp = Makeint (value, Badr) складемо як: молодший + старший другий варіант

Spiout Wtmp, 2 послати два байти: адреса і дані

Goto Mc

‘———————

‘Підпрограма послідовного виведення

Ser_out:

Acc = Badr адреса в акумулятор

Pcs = 0

Pdin = Acc1: Set Pclk: Reset Pclk висунемо старший біт адреси Pdin = Acc0: Set Pclk: Reset Pclk висунемо молодший біт адреси Shiftout Pdin, Pclk, Badr, 1 висунемо 8-бітний адресу

Shiftout Pdin, Pclk, Value, 1 потім дані (старший – перший) Pcs = 1

Return

‘——————————————

Наступна програма демонструє організацію введення та обробки даних 12-розрядного АЦП з послідовним інтерфейсом Для зчитування даних АЦП використовується оператор SHIFTIN Особливість програми полягає в тому, що тактирование роботи програми здійснюється за допомогою таймера, а для виведення обчислюється середнє значення шістнадцяти відліків

‘————————————————- ————- Програма тестування АЦП типу AD7893-3 (Шкала + -25 В)

‘————————————————————–

$ Large модель програми більш 2 кбайт

Dim B_dat As Bit біт Є нові дані Dim Mes As Byte лічильник вимірювань

‘———————

Dim Temp As Integer тимчасові дані

Dim R_bd As Integer 16-розр двійкові дані

‘———————

Dim R_fld As Single регістр даних АЦП

‘———————

B_acnv Alias ​​P10 підключення АЦП

B_aclk Alias P11

B_adat Alias P12

‘————————————————- ————- TIMER0 в режимі 16-біт лічильника

Config Timer0 = Timer , Gate = Internal , Mode = 1 : Start Timer0 ———————

‘TIMER2 в режимі 16-біт таймера з внутр тактується для синхронізації UART Config Timer2 = Timer, Gate = Internal, Mode = 2

$ Baud = 9600 швидкість 96 кБ

$ Crystal = 12000000 при кварці 12 МГц

‘———————

‘Призначення режимів переривань

On Timer0 Timer_0_int Nosave вектор переривання

Enable Interrupts взагалі дозволити переривання Enable Timer0 дозволити переривання таймера 0 ———————————— ——

Set B_acnv : Reset B_aclk

Mes = 16 кількість усереднює відліків

‘—————————————— Mc:

Do

If B_dat = 1 Then зявився біт

Reset B_dat скинути цей біт

R_bd = R_bd + Temp Decr Mes

If Mes = 0 Then

R_fld = R_bd: R_bd = 0 перетворимо в плаваючий формат і очистимо суму

R_fld = R_fld * 00000763 перетворимо свідчення в вольти

Print R_fld: Mes = 16 вивести свідчення і восст лічильник

End If End If Loop

‘—————————————— Обробка переривання таймера 0

Timer_0_int:

Th0 = & HD8: Tl0 = & HFD Ffffh-10000 = D8fdh – період прерів 10 мс

Set B_dat Return

‘—————————————— Запустити перетворення і вважати дані Convert :

Reset B_acnv: Reset B_acnv: Set B_acnv сформувати імпульс

‘До зчитування потрібно витримати 6 мкс реально виходить більше

‘———————

‘_ Тимчасова діаграма роботи інтерфейсу   

‘  |                                        |   CS

                                            _

   X    X    X    X    X    X    X    X    X_ Data            

  |  |_|  |_|  |_|  |_|  |_|  |_|  |_|  |     ———————

Clk

Shiftin B_adat, B_aclk, Temp, 1 підходить режим 1

Return

‘———————————————-

При програмуванні аналогових перетворювачів завжди доводиться вибирати розмірність відтворюваних або виміряних даних Краще і зрозуміліше, коли дані представлені в загальноприйнятих одиницях, і при цьому всі числові значення, що приймаються вимірюваним (або відтвореним) параметром в процесі роботи, відповідають використовуваному пристрою відображення Мається на увазі, що, наприклад, не можна будувати вимірювальну систему, в якій на 35-розрядний індикатор повинно виводиться число 10000 Гц або 20 000 кОм Зрозуміло, форма представлення чисел в програмі має бути такий, щоб зазначені числа виводилися як 1000 кГц і 0200 МОм Зручніше за все, коли числа в програмі представлені у форматі з плаваючою точкою Це дозволяє працювати з широким діапазоном значень без втрати точності і виробляти будь-які обчислення Мікросхеми ЦАП і АЦП приймають і видають значення, подані у вигляді цілого двійкового коду числа молодших розрядів Bascom надає прекрасні можливості перетворення числа у форматі з плаваючою точкою в код завантаження ЦАП (в ціле двійкове число) і, відповідно, вихідного коду АЦП в число у форматі з плаваючою точкою, що показано в попередніх прикладах і подальшої програмі При перетворенні двополярного числа потрібно подбає, щоб джерелом (або приймачем) двійкових даних була знакова змінна типу Integer або Long, і щоб старший (знаковий) біт був заповнений, як це зроблено в наступному демонстраційній програмі (тестування AD7711A) за допомогою оператора ROTATE Якщо перетвориться однополярної двійкове число, то його розташування в регістрі двійкових даних має тільки те значення, що повинно відповідати розрядами ЦАП або АЦП

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

Нижче представлений ще приклад програми, яка працює з АЦП У ній здійснюється тестування 24 – розрядного АЦП, повязаного з процесором через послідовний інтерфейс АЦП перед початком роботи инициализируется і проводиться його самокалібрування (калібрування нуля і калібрування шкали) У даній програмі АЦП є джерелом сигналу синхронізації для всієї програми Встановивши при ініціалізації АЦП час вимірювання (Інтегрування, тому що АЦП інтегруючого типу) рівне 20 мс і подавши сигнал готовності даних АЦП на вхід переривання, ми будемо кожні 20 мс отримувати новий відлік Внаслідок того, що виведення і візуальне сприйняття даних з такою швидкістю неможливо, застосоване усереднення даних шістнадцяти відліків Тепер, кожні 320 мс (3 рази на секунду) ми будемо отримувати результат У програмі зчитування даних АЦП застосовано багато асемблерних вставок для підвищення швидкості роботи і кращого контролю ресурсів, що використовуються в перериванні У програмі передбачена калібрування АЦП, інформація про яку буде представлена ​​нижче

‘————————————————- ————- Програма тестування 24-розр АЦП AD7711A (+ -25 В)

‘————————————————————–

$ Large модель програми більш 2 кбайт

Dim B_dat As Bit біт Є нові дані Dim Mes As Byte лічильник вимірювань

Dim R_ch As Byte введений символ

‘———————

Dim Temp As Long тимчасові дані

Dim R_bd As Long 32-розр двійкові дані

‘———————

Dim R_fld As Single регістр даних АЦП

Dim R_zero As Single константа зміщення нуля

Dim R_scal As Single константа калібрування масштабу

‘————————————————————–

‘TIMER0 в режимі 16-біт лічильника

Config Timer0 = Timer , Gate = Internal , Mode = 1 : Start Timer0 ———————

‘TIMER2 в режимі 16-біт таймера з внутр тактується для синхронізації UART Config Timer2 = Timer, Gate = Internal, Mode = 2

$ Baud = 9600 швидкість 96 кБ

$ Crystal = 12000000 при кварці 12 МГц

‘———————

On Int0 Int0_int Nosave вектор INT0

Enable Interrupts взагалі дозволити переривання

‘——————————————

Gosub Str_adc самокалібрування і установка режиму АЦП

Mes = 16 кількість усереднює відліків

R_zero = 0 немає зміщення нуля R_scal = 1 масштаб ідеальний Print – MONITOR FOR ADC AD7711A – Print Calb zero – Z @ Uinp = 0 V Print Calb scale – S @ Uinp = + 2 V&quot

Enable Int0 дозволити зовнішнє переривання 0 ——————————————

Mc: Do

If B_dat = 1 Then зявився біт

Reset B_dat скинути цей біт

Rotate R_bd, Left, 4 свідчення ще потрібно помножити на 16

‘Таким чином, сума 16-ти відліків повністю розташуватися в 32-бітних регістрі

R_fld = R_bd: R_bd = 0 перетворимо в плаваючий формат і очистимо суму

R_fld = R_fld * 000000000116415322 перетворимо свідчення в вольти

R_ch = Inkey

If R_ch <> 0 Then якщо натиснута кнопка – перевірити

Gosub Makeclb при необхідності калібрувати

End If

Gosub Calbr врахувати калібрування

Print R_fld вивести свідчення

End If Loop

‘——————————————

‘Обробка переривання таймера 0

Int0_int:

$asm

Push Psw Push Acc

$end Asm

Psw3 = 1: Psw4 = 1 виберемо третій банк – він не використовується Bascom Gosub Rd_adc

$asm

djnz {Mes}, Int0_1 обробка лічильника вимірювань

Setb {B_dat} якщо Mes = 0, є нові дані АЦП

mov {Mes}, # 16 відновити лічильник

Int0_1:

Pop Acc Pop Psw

$end Asm Return

‘———————————————- УТИЛІТИ СІГМА -ДЕЛЬТА АЦП ТИПУ AD7711A

‘———————————————- Регістри AD7711

‘Формат регістра керування

‘——— MD2 0 норм 0 самокаліб | ——– MD1 0 змін 0 в Вибраний | | ——- MD0 0 1 каналі

‘           ¦¦¦—— G2 0   0    0    0    1    1    1    1

‘           ¦¦¦¦—– G1 0=1 0=2  1=4  1=8  0=16 0=32 1=64 1=128

‘           ¦¦¦¦¦—- G0 0   1    0    1    0    1    0    1

‘           ¦¦¦¦¦¦— CH 0-AIN1, 1-AIN2

‘| | | | | | | – PD 0-робота, 1-останов

‘| | | | | | | | ——— WL Вихід: 0-16 біт, 1-24 біта

‘| | | | | | | | | ——– IO Вих струм RTD 0-викл, 1-вкл

‘| | | | | | | | | | ——- BO Вих струм BO 0-викл, 1-вкл

‘| | | | | | | | | | | —— B / U Вхід: 0-двохполярний, 1-однополярного

‘           ¦¦¦¦¦¦¦¦¦¦¦¦————- FS11=0¬

‘| | | | | | | | | | | | | ———— FS10 | при кварці 5 МГц:

‘| | | | | | | | | | | | | | ———– FS9 | 50 Гц FS = 135 (0С3h)

‘| | | | | | | | | | | | | | | ———- FS8 | (fкв/512)

‘           ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦——— FS7   ¦- FS = ———————-

‘| | | | | | | | | | | | | | | | | ——– FS6 | частота першого полюса

‘           ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦——- FS5   ¦

‘| | | | | | | | | | | | | | | | | | | —— FS4 | – FS – код першого полюса

‘| | | | | | | | | | | | | | | | | | | | —– FS3 | від 19 до 2000

‘           ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦—- FS2   ¦

‘           ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦— FS1   ¦

‘           ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦– FS0 —

‘C_M2B equ 00000000b старший байт робочого режиму:

‘C_M1B equ 10000000b середній байт 50 Гц, G = 1, + -25 В

‘C_M0B equ 11000011b молодший байт CH1, 24 біта, ток викл

‘———

‘C_С2B equ 00100000b старший байт самокалібрування:

‘C_С1B equ 10000000b середній байт 50 Гц, G = 1, + -25 В

‘C_С0B equ 11000011b молодший байт CH1, 24 біта, ток викл

‘———————————————-

‘Визначення констант

Dim C_m2b As Const &ampB00000000

Dim C_m1b As Const &ampB10000000

Dim C_m0b As Const &ampB11000011

Dim C_c2b As Const &ampB00100000

Dim C_c1b As Const &ampB10000000

Dim C_c0b As Const &ampB11000011

‘———————————————-

‘ПРИЗНАЧЕННЯ ПОРТОВ, підключених до АЦП

B_aa0 Alias ​​P10 ПОРТ ВИБОРУ РЕГІСТРУ АЦП: 0-упоряд 1-даних

B_atfs Alias ​​P35 ПОРТ ДОЗВОЛУ ЗАПИСИ АЦП

B_arfs Alias ​​P13 ПОРТ ДОЗВОЛУ ЗЧИТУВАННЯ АЦП

B_aclk Alias ​​P11 ПОРТ тактовий сигнал ДЛЯ ДАНИХ АЦП

B_adat Alias ​​P12 ДАНІ АЦП

B_ardy Alias ​​P14 ГОТОВНІСТЬ ДАНИХ АЦП

‘———————————————- ЗАПИС 8 БІТ У АЦП ІЗ АКУМУЛЯТОРА

Wrb_adc:

$asm

Wrb_adc1:

$end Asm

Mov   R0 , #8

Rlc A дані в SDATA Mov {B_adat}, C

Setb {B_aclk} заклацнути – SCLK в 1

Clr {B_aclk} SCLK в 0 Djnz R0, Wrb_adc1

Return

‘———————————————- ЧИТАННЯ 8 БІТ ІЗ АЦП В АККУМУЛЯТОР

Rdb_adc:

$asm

Rdb_adc1:

Mov   R0 , #8

Setb {b_aclk} заклацнути – SCLK в 1 Mov c, {B_adat}

Clr {B_aclk} SCLK в 0 Rlc A дані в Acc

$end Asm

Djnz  R0 , Rdb_adc1

Return

‘———————————————- Початкова підготовка АЦП до роботи:

‘Самокалібрування – установка режиму

‘——— Str_adc:

Reset B_aclk: Reset B_aa0: Reset B_atfs SCLK = 0, A0 = 0, дозволимо запис

Acc = C_c2b: Gosub Wrb_adc призначити самокалібрування АЦП

Acc = C_c1b : Gosub Wrb_adc Acc = C_c0b : Gosub Wrb_adc

Set B_atfs: Wait 2 заборонимо запис і чекати 2 сек

Reset B_atfs дозволити запис

Acc = C_m2b: Gosub Wrb_adc призначити нормальний режим АЦП

Acc = C_m1b : Gosub Wrb_adc Acc = C_m0b : Gosub Wrb_adc

Set B_atfs: Set B_adat заборонимо запис підготуватися до прийому даних

Return

‘———————————————- Програма зчитування даних з АЦП Виробляється первинна обробка даних – вони складаються з регістром суми з урахуванням знака Rd_adc:

B_adat = 1: B_aclk = 0 підготувати порти

B_aa0 = 1: B_arfs = 0 дозволити читання АЦП

‘———

Mov  R1 , #{Temp + 3} Mov  @R1 , #0

Dec R1

Gosub Rdb_adc

Mov @ r1, A запамятаємо старший байт

Dec R1

Gosub Rdb_adc

Mov @ r1, A запамятаємо середній байт

Dec R1

Gosub Rdb_adc

Mov @ r1, A запамятаємо молодший байт

‘———

B_arfs = 1 заборонити читання АЦП

‘Підсумовування показань

$asm

Rd_adc1:

$end Asm Return

Mov R0, # {R_bd} сума дані

Mov R1, # {Temp} лічені дані

Mov R2, # 4 чотири байти

Clr C

Mov A, @ R1 цикл підсумовування

Addc A , @R0

Mov @R0 , A Inc R0

Inc R1

Djnz R2 , Rd_adc1

‘———

‘Калібрування показань

Calbr:

R_fld = R_fld – R_zero скорегувати зміщення

R_fld = R_fld * R_scal поправити масштаб

Return

‘———

‘Провести калібрування

Makeclb:

If R_ch = & H5B Then якщо введений Z – калібрувати нуль

R_zero = R_fld показання – константа зміщення

End If

If R_ch = & H53 Then якщо введений S – калібрувати масштаб

R_fld = R_fld – R_zeroучтем поправку нуля і з нею

R_scal = 2 / R_fld обчислимо константу масштабу

End If R_ch = 0

Return

‘——————————-

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

‘————————————————- ————- Монітор тестування синтезу AD9850 в режимі з

‘Послідовної завантаженням даних Кварц = 60 МГц

‘————————————————- ————- Dim N_dat As Bit біт Є нові дані

N_inp Alias ​​Scon0 біт Є введення (RI) ———————

Dim Temp As Byte тимчасові дані

‘———————

Dim R_bd As Long 32-розр двійковий код завантаження

‘———————

Dim R_frq As Single регістр значення частоти

Dim R_fld As Single регістр коду завантаження

‘——————— Підключення синтезатора

B_data Alias P15 : B_clk Alias P13 : B_fqud Alias P14 : B_res Alias P17 ———————

‘TIMER2 в режимі 16-біт таймера з внутр тактується для синхронізації UART Config Timer2 = Timer, Gate = Internal, Mode = 2

$ Baud = 9600 швидкість 96 кБ

$ Crystal = 12000000 при кварці 12 МГц

‘———————

‘Підготувати лінії управління до роботи

Reset B_data : Reset B_clk : Reset B_fqud : Reset B_res ———————

‘Головний цикл

Mc: Do

If N_dat = 1 Then є нові дані

N_dat = 0 насправді це біт RI

Gosub Sload_9850 завантаження нових даних

End If

If N_inp = 1 Then щось прийнято

N_inp = 0 очистимо без аналізу

Input Enter value of frequency [kHz] f = , R_frq введення частоти

Print R_frq друкувати введене значення

‘Щоб отримати код завантаження помножимо на число: R_fld = R_frq * 71582788 2 ^ 32 / Fclk = 4294967296/60000 kHz R_bd = R_fld перет в ціле 32-розр число

Printhex Hex R_bd друк в hex форматі

Set N_dat є дані на висновок в синтезатор

End If Loop

‘——————————————

‘Підпрограми завантаження даних в синтезатор

Sload_9850:

Set B_fqud: Reset B_fqud скинути інтерфейс

Set B_clk: Reset B_clk заклацнути код послідовного режиму

Set B_fqud: Reset B_fqud дозволити послідовний режим висунути дані з R_bd в режимі 3 (мол спочатку, _ / \ _) Shiftout B_data, B_clk, R_bd, 3

‘Висунути останній байт з режимом і фазою

Temp = 0 : Shiftout B_data , B_clk , Temp , 3

Set B_fqud: Reset B_fqud виконувати завантажені дані

Return

‘——————————————

Майже завжди точність аналогових перетворювачів недостатня для рішення вимірювальної завдання У даному випадку мова йде вимірювання або відтворення абсолютного значення напруги, струму або чого-небудь ще Типова точність аналогових перетворювачів складає одиниці або, в кращому випадку, долі відсотка – результат неідеальності технології їх виробництва З іншого боку, стабільність метрологічних характеристик цих же перетворювачі на два-три порядки (десяткових) перевершує їх параметричну точність Таким чином, вирівнюючи масштаб перетворення із зовнішнім еталоном, можна досягти підвищення їх точності до значень стабільності (тимчасової, температурної), нелінійності і шумів Така операція називається калібруванням, в результаті якої встановлюється коефіцієнт перетворення АЦП або ЦАП Калібрування може проводитися в аналоговому вигляді, наприклад, підстроюванням напруги опорного джерела, але нас цікавитиме тільки цифрове калібрування Її переваги очевидні По-перше, аналогова частина схеми не ускладнюється По-друге, калібрування може проводитися без доступу всередину калібрується обєкта, і з віддаленим обєктом теж Саме чудове, що калібрування виробляється в тому стані пристрою, в якому він і працює Є можливість знизити і випадкові складові операції калібрування У підсумку, підвищується точність вимірювального перетворювача, причому навіть більшою мірою, ніж при аналогової калібрування Результати цифрового калібрування, що представляють собою цифрові коефіцієнти зазвичай розміщуються в незалежній памяті, щоб їх можна було відтворити при повторному включенні харчування калібрується пристрою Не зупиняючись на методах організації зберігання даних калібрування (це окреме питання), розглянемо методи калібрування

Практично всі методи цифрового калібрування можна звести всього до двох видів:

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

б) калібрування зсуву (корекція адитивної складової похибки перетворювача)

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

Калібрування зміщення вимірювального тракту враховується шляхом вирахування з поточних показань,

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

показаннями при подачі на вхід напруги, рівного еталонного значення У програмі монітора АЦП

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

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

Як вказувалося вище, швидкість вимірювання АЦП зазвичай набагато перевершує можливості пристроїв передачі та відображення даних Так відбувається тому, що кінцевим приймачем інформації є людина, для якої межею комфортного сприйняття вважається частота зміни даних в межах до 3 – 5 Гц Цю обставину можна використати з максимальною користю, наприклад, організувати усереднення надлишкових відліків АЦП В результаті, досягається підвищення точності і роздільної здатності за рахунок додаткового придушення шумів і перешкод Особливо актуальна ця міра для багаторозрядних АЦП (більше 14 – 16 розрядів), молодші розряди яких не завжди можуть бути реалізовані в одінічном циклі перетворення Усереднення може проводитися простим підсумовуванням декількох відліків, так і за допомогою алгоритмів цифрової фільтрації Відмінність фільтрації від усереднення в тому, що при усередненні потік даних візуально проріджується (дані надходять рідше), а при фільтрації швидкість видачі даних може залишається колишньою, проте, кожен вихідний відлік цифрового фільтра буде нести якусь частину попередніх відліків Для

спостерігача процесу фільтрації також важливий проміжок входження в стаціонарний режим фільтрації після її включення, тобто поки необхідний обсяг оброблюваних даних ще не накопичений, на виході програми не повинно бути збійних свідчень Це можливо, якщо при включенні режиму фільтрації скинути параметр фільтрації, що має значення, аналогічне постійної часу звичайного фільтра, а потім плавно збільшувати його (відповідно і ступінь фільтрації до заданої) Нижче представлений фрагмент програми, що містить найпростішу підпрограму цифрової фільтрації У представленому прикладі передбачена реалізація плавного входження в процес фільтрації Представлена ​​програма аналогічна фільтру першого порядку Для підвищення порядку фільтра досить включити в процес обробки дві-три (або більше) аналогічні програми, що працюють послідовно і з різними коефіцієнтами, які і встановлять характер (модель) фільтра

‘————————————————- ———————– Програма обробки за формулою фільтра першого порядку

‘Викликається кожного разу в циклі вимірювання

‘————————————————- ———————– Dim B_stan As Bit біт стабільність

Dim Uav As Single вихідне значення Dim R_an As Single параметр фільтрації Dim Uc As Single поточні показання Dim Tmp As Single тимчасові дані

Dim N_m As Const 09 параметр зменшення

Dim N_f As Const 03 остаточне значення R_an

R_an = 1 початкове значення параметра фільтрації

B_stan = 0 скинути при включенні фільтрації

‘Uav = Uav (1-1 / N) + Uc / N – КЛАСИЧНА ФОРМУЛА ФИЛЬТРА

‘Uav = Uav (1-n) + Uc * n – СПРОЩЕНА ФОРМУЛА

‘ЗАБЕЗПЕЧУЄ СКОРОЧЕННЯ ЧАСУ ОБЧИСЛЕНЬ (ВИКЛЮЧАЄТЬСЯ РОЗПОДІЛ І ОДНЕ ДІЯ) І практично не відрізняються від класичного варіанту При спостереженні за індикаторами

‘ЗНАЧЕННЯ КОНСТАНТИ фільтрації, яка при включенні режиму ФИЛЬТРА

‘ОДНО 1, ПОТІМ З кожного вимірювального такт ЗМЕНШУЄТЬСЯ

‘В 111 РАЗИ (1/N_m) до мінімального значення (N_f) ЗНАЧЕННЯ N_m І N_f

‘ПОДОБІРАЮТСЯ ЕКСПЕРИМЕНТАЛЬНО, ЩОБ ЗАБЕЗПЕЧИТИ КОМФОРТНЕ ЧАС

‘ВСТАНОВЛЕННЯ, І ДОСТАТНЯ придушення шумів Comp_av:

If B_stan = 1 Then встановився стаціонарний режим

Goto C_av2 тепер досягли остаточного значення

End If

R_an = R_an * N_m змінимо значення параметра фільтрації

If R_an < N_f Then 'тепер досягли остаточного значення?

Set B_stan так – поставимо біт стабільності

End If

C_av2:

Return

Tmp = 1 – R_an віднімемо константу фільтрації з одиниці Uav = Uav * Tmp візьмемо із суми відповідну частину Tmp = Uc * R_an візьмемо частину показань АЦП

Uav = Uav + Tmp складемо з сумою

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

Легкість програмування Bascom провокує застосування неоптимальних схем обробки даних (в першу чергу за критерієм продуктивності) Щоб успішно боротися з цим «злом», рекомендується в максимальній ступеня застосовувати обробку даних на низькому рівні (безпосередньо в кодах завантаження ЦАП або з вихідним кодом АЦП) Це, звичайно, складніше для програміста, але дає істотний виграш, тому що

цілі двійкові числа швидше обробляються і займають менше місця в памяті На низькому рівні рекомендується виконувати наступні операції:

а) аналізувати перевантаження АЦП і здійснювати вибір меж вимірювання, якщо це потрібно Це дає можливість гранично швидко реагувати на зміни вхідного сигналу, віддаючи на «вищий рівень» дані, дійсно придатні для отримання кінцевого результату

б) коригувати зміщення АЦП і ЦАП, відповідно зберігаючи поправки змішання у вигляді цілих

двійкових чисел

в) здійснювати первинне усереднення даних АЦП і при необхідності перетворювати в двохполярний вигляд

г) записувати в масив або здійснювати сортування, наприклад за величиною

д) обчислювати в переривання

Джерело: МЛКуліш, ДОВІДНИК З ПРОГРАМУВАННЯ BASCOM-8051, Краснодар 2001

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*