АЦП, аналогово-цифровий перетворювач – пристрій, що перетворює вхідний сигнал в дискретний код (цифровий сигнал). Як правило, АЦП – електронний пристрій, що перетворює напругу в двійковий код.
Розрядність АЦП характеризується кількістю дискретних значень, які перетворювач може видати на виході, вимірюється в бітах. Наприклад, АЦП, здатний видавати 256 дискретних значень (0…255), має розрядність 8 біт, оскільки: 28=256.
Розрядність може бути також визначена в величинах вхідного сигналу і виражена, наприклад, в вольтах. Розрядність за напругою дорівнює напрузі, що відповідає максимальному вихідному коду, який ділиться на кількість вихідних значень.
Мікроконтролер ADuC481 як і інші пристрої компанії ADI має високоточний АЦП і програмований ЦАП.
АЦП керується за допомогою регістрів спеціальних функцій ADCCON1..ADCCON3. Молодших 8 біт результату перетворення зберігаються в регістрі ADCDATAL, старших 4 біти – в молодшій тетраді регістру ADCDATAH. В старшу тетраду контролер записує номер поточного каналу.
Значення регістру ADCCON1 керує режимом запуску та роботи АЦП. Його адреса – 0xEF, початкове значення – 0x40, побітова адресація не підтримується.
Таблиця 6.1 – Біти регістру ADCCON1
Біт | Назва | Призначення |
7 | MD1 | Ввімкнення АЦП. Якщо біт встановлений – АЦП ввімкнено |
6 | EXT_REF | Біт встановлений – АЦП працює від зовнішнього джерела опорної напруги, Біт скинений – АЦП працює від внутрішнього джерела опорної напруги. |
5 | CK1 | Визначають подільник тактової частоти в частоту АЦП. Частота АЦП не може перевищувати 8.38MHz CK1 CK0 Подільник 0 0 32 0 1 4 1 0 8 1 1 2 |
4 | CK0 | |
3 | AQ1 | Визначають кількість періодів АЦП, що витрачаються на захоплення сигналу пристроєм вибірки та зберігання (апертурний час). Для високоомних джерел сигналу значення мають збільшуватися. AQ1 AQ0 Кількість періодів 0 0 1 0 1 2 1 0 3 1 1 4 |
2 | AQ0 | |
1 | T2C | Встановлений біт дозволяє запуск АЦП при переповненні таймера 2 |
0 | EXC | Встановлений біт дозволяє запуск АЦП при низькому рівні на ліній CONVST |
Молодша тетрада регістру ADCCON2 визначає обраний канал перетворення, старша керує запуском АЦП. Адреса регістру – 0xD8, початкове значення – 0x00, побітова адресація підтримується.
Таблиця 6.2 – Біти регістру ADCCON2
Біт | Назва | Призначення |
7 | ADCI | Переривання АЦП. Встановлюється контролером вкінці єдиного АЦП перетворення або вкінці блоку перетворень в режимі DMA |
6 | DMA | Вмикає режим DMA |
5 | CCONV | Запускає режим послідовних перетворень. Після закінчення кожного перетворення розпочинається нове, доти, доки не користувач не скине біт DMA. |
4 | SCONV | Запускає одне перетворення. Після його завершення біт автоматично скидається |
3 | CS3 | Визначає активний канал АЦП CS3 CS2 CS1 CS0 Канал 0 0 0 0 ADC0 .......................................................... 0 1 1 1 ADC7 1 0 0 0 Датчик температури (не менше 1мкс для захоплення) 1 0 0 1 DAC0 (ЦАП 0) 1 0 1 0 DAC1 (ЦАП 1) 1 0 1 1 AGND (аналоговий спільний) 1 1 0 0 VREF (опорна напруга) |
2 | CS2 | |
1 | CS1 | |
0 | CS0 |
Регістр ADCCON3 керує процедурою калібрування і не розглядається в даній лабораторній рободі.
Перед тим, як запускати аналогово-цифрове перетворення слід ввімкнути АЦП – записати в регістр ADCCON1 байт ініціалізації. Наприклад ввімкнемо АЦП з такими параметрами:
Опора – внутрішня (EXT_REF=0)
Подільник – 2 (CK1=1 CK0=1) (fADC=fCLK/2=5.5299МГц)
Апертура – 4 періоди (AQ1=1 AQ0=1)
Запуск від спрацювання таймера 2 та зовнішнього сигналу заборонені (T2C=0 EXC=0). Таким чином байт ініціалізації рівний 101111002=18810=BC16. Записуємо його в регістр ADCCON1.
Далі, щоб провести одиничне вимірювання, потрібно записати в ADCCON2 номер каналу і біти запуску. Так для запуску одиничного перетворення з 7 каналу в ADCCON2 слід записати байт 0x17.
Після запуску дані будуть готові через 17-20 тактів АЦП (в залежності від апертурного часу, встановленого бітами AQ1-AQ0). Якщо подільник частоти АЦП рівний двом (біти CK1=1 CK0=1), то це складе 34-40 тактів мікроконтролера. Взнати точний час завершення аналогово-цифрового перетворення можна опитуючи біт ADCI – вкінці циклу перетворення контролер встановить його.
Результат перетворення знаходитиметься в регістрах ADCDATAH:ADCDATAL.
Приклад програми для лабораторної роботи №6
Під час руху джойстика запалюється точка на матриці світлодіодів.
ADCCON1 DATA 0EFH ;ADC CONTROL
ADCCON2 DATA 0D8H ;ADC CONTROL
ADCDATAL DATA 0D9H ;ADC DATA LOW BYTE
ADCDATAH DATA 0DAH ;ADC DATA HIGH BYTE
ADCI BIT 0DFH ;ADCCON2.7 - ADC INTURRUPT FLAG
SCONV BIT 0DCH ;ADCCON2.4 - SINGLE CONVERSION ENABLE
;DACCON DATA 0FDH;DAC CONTROL REGISTER
;CFG841 DATA 0AFH;GENERAL FLASH/PWM CONTROL REGISTER
dat EQU R0
adr EQU R1
Temp1 EQU R2
Temp2 EQU R3
dat1 EQU R4
Segm EQU 0x02
CSEG
ORG 0x0000
jmp begin
ORG 0x0033
begin:
mov p1, 0xFF
mov ADCCON1, #0ECh
call off
mov TCON, #11111111b
mov TMOD, #11001100b
beg1:
call diagonal
jmp beg1
vboky:
vbik1:
call rezult1
cjne R5, #00000000b, vbik2
cjne R7, #00001110b, vboky
mov dat1, #00010000b
jmp vbokend
vbik2:
call rezult1
cjne R5, #01001001b, vbik3
cjne R7, #00001001b, vboky
mov dat1, #00001000b
jmp vbokend
vbik3:
call rezult1
cjne R5, #00001000b, vbik4
cjne R7, #00000111b, vboky
mov dat1, #00000100b
jmp vbokend
vbik4:
call rezult1
cjne R5, #10010010b, vbik5
cjne R7, #00000100b, vboky
mov dat1, #00000010b
jmp vbokend
vbik5:
call rezult1
cjne R5, #00000000b, vbik1
cjne R7, #00000000b, vboky
mov dat1, #00000001b
jmp vbokend
vbokend:
Ret
diagonal:
; JB p3.2, diagonal
; call vboky
run:
kavalok1:
call rezult2
cjne R5, #00000000b, kavalok2
cjne R6, #00000000b, run
call vboky
call lampa1
kavalok2:
call rezult2
cjne R5, #01001001b, kavalok3
cjne R6, #00000010b, run
call vboky
call lampa2
kavalok3:
call rezult2
cjne R5, #10010010b, kavalok4
cjne R6, #00000100b, run
call vboky
call lampa3
kavalok4:
call rezult2
cjne R5, #00001000b, kavalok5
cjne R6, #00000111b, run
call vboky
call lampa4
kavalok5:
call rezult2
cjne R5, #01001001b, kavalok6
cjne R6, #00001001b, run
call vboky
call lampa5
kavalok6:
call rezult2
cjne R5, #01110111b, kavalok7
cjne R6, #00001010b, run
call vboky
call lampa6
kavalok7:
call rezult2
cjne R5, #00000000b, kavalok1
cjne R6, #00001110b, run
call vboky
call lampa7
jmp run
Ret
rezult1:
mov ADCCON2, #6h
clr ADCI
setb SCONV
jnb ADCI,$
mov b, adcdatal
mov a, adcdatah
clr acc.7
clr acc.6
clr acc.5
clr acc.4
mov Tl0, b
mov TH0, a
mov R5, TL0
mov R7, Th0
Ret
rezult2:
mov ADCCON2, #7h
clr ADCI
setb SCONV
jnb ADCI,$
mov b, adcdatal
mov a, adcdatah
clr acc.7
clr acc.6
clr acc.5
clr acc.4
mov Tl1, b
mov TH1, a
mov R5, TL1
mov R6, Th1
Ret
lampa7:
mov dat, #10111111b
mov adr, #00000101b
call strob
; mov dat, #00000100b
mov adr,#00000110b
call strob1
Ret
lampa6:
mov dat, #11011111b
mov adr, #00000101b
call strob
; mov dat, #00000100b
mov adr,#00000110b
call strob1
Ret
lampa5:
mov dat, #11101111b
mov adr, #00000101b
call strob
; mov dat, #00000100b
mov adr,#00000110b
call strob1
Ret
lampa4:
mov dat, #11110111b
mov adr, #00000101b
call strob
; mov dat, #00000100b
mov adr,#00000110b
call strob1
Ret
lampa3:
mov dat, #11111011b
mov adr, #00000101b
call strob
; mov dat, #00000100b
mov adr,#00000110b
call strob1
Ret
lampa2:
mov dat, #11111101b
mov adr, #00000101b
call strob
; mov dat, #00000100b
mov adr,#00000110b
call strob1
Ret
lampa1:
mov dat, #11111110b
mov adr, #00000101b
call strob
; mov dat, #00000100b
mov adr,#00000110b
call strob1
Ret
off:
mov dat,#11111111b
mov adr,#00000101b
call strob
; mov dat,#00000000b
mov adr,#00000110b
call strob1
Ret
strob:
setb P3.6
mov P0,dat
mov P2,adr
mov P2,#0x00
Ret
strob1:
setb P3.6
mov P0,dat1
mov P2,adr
mov P2,#0x00
Ret
Delay:
mov Temp1, #0xFF
loop:
dec Temp1
mov Temp2, #0xFF
djnz Temp2, $
cjne Temp1, #0x00, loop
Ret
Ldelay:
call delay
call delay
call delay
call delay
call delay
call delay
call delay
call delay
call delay
call delay
RET
END