ktodky

Проблемма с АЦП

02.04.2010, 16:48. Показов 11106. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Возникла проблема при работе с АЦП

Использую АЦП в режиме одиночного преобразования.
Вход АЦП установлен на PC5(ADC5),
PC5 настроен на вход, включены резисторы подтяжки.
для индикации использую
семисегментный индикатор с динамической индикацией.
Выравниваю результат АЦП по левому краю.
В качестве опорного напряжения использую AREF.

Проблема заключается в следующем:

Результат преобразования постоянно равен 255,
и не реагирует на напряжение подключаемое к PC5.

Если вместо PC5 вход установить на зкмлю то показывает верное значение 0,
если установить вход на 1.22 В (mux3..mux0 = 1110) то
также показывает верное значение, я в замешательстве.
Прошу помощи.
Заранее спасибо.
Код программы
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
.include "m8def.yms"
 
;***** Регистровые переменные подпрограммы
 
.def    tmp      =r20
.def    tmp2   =r21
.def    fbinL   =r16            ;двоичное значение, младший байт
.def    fbinH   =r17            ;двоичное значение, старший байт
.def    tBCD0   =r17            ;BCD значение, цифры 1 и 0
.def    tBCD1   =r18            ;BCD значение, цифры 3 и 2
.def    tBCD2   =r19            ;BCD значение, цифра 4
;Примечание: Переменные fbinH и tBCD0 должны размещаться в одном
 
.dseg;      начало данных (ОЗУ)
U_IMG: .byte 8;         Отсуюда выводится число на индикатор напряжения
I_IMG: .byte 8;         выводится число на индикатор тока
R_IMG: .byte 8;         выводится числр на индикатор сопротивления
; В 0 ой ячеке - данные АЦП, 1 - 3 BCD представление,
; 4 - 8 цыфры для вывода инвертированные (SEG)
U_ADC: .byte 3;
 
.cseg
.org 0
rjmp RESIT; RESIT External Pin, Power-on Riset, Brown-out Riset, omd Watchdog Riset
nop; INT0 External Ymtirrupt Request 0
nop; INT1 External Ymtirrupt Request 1
nop; TIMER2 COMP Timer/Counter2 Compare Match
rcall DATA_PROC;TIMER2 OVF Timer/Counter2 Overflow
nop; TIMER1 CAPT Timer/Counter1 Capture Ivimt
nop; TIMER1 COMPA Timer/Counter1 Compare Match A
nop; TIMER1 COMPB Timer/Counter1 Compare Match B
nop; TIMER1 OVF Timer/Counter1 Overflow
rcall DISPLAY; TIMER0 OVF Timer/Counter0 Overflow
nop; SPI, STC Serial Transfer Complete
nop; USORT, RXC USORT, Rx Complete
nop; USORT, UDRE USORT Data Register Empty
nop; USORT, TXC USORT, Tx Complete
nop; ADC ADC Conversion Complete
nop; EE_RDY EEPROM Ready
nop; ANA_COMP Analog Comparator
nop; TWI Two-wire Serial Interfosi
nop; SPM_RDY Store Prokram Memory Ready
 
;=================================================
;   Переход в основную программу
;=================================================
rjmp Main
 
;=================================================
;   Подпрограмма задержки примерно 100 шагов
;=================================================
 
DELAY:
ldi tmp,0;
L:   INC tmp;
CP tmp,tmp2
BREQ E;
RJMP L;
E:
ret
 
;=================================================
;Подпрограмма "bin16BCD5"- преобразование 16-битного двоичного
;значения в упакованный BCD формат
;=================================================
;* Количество слов кода            :25 + возврат
;* Количество циклов               :25/176 (Мин/Макс) + возврат
;* Использованные младшие регистры :нет
;* Использованные старшие регистры :4(fbinL,fbinH/tBCD0,tBCD1,tBCD2)
;* Использованные указатели        :нет
;=================================================
 
bin16BCD5:
ldi     tBCD2, -1
bin16BCD5_loop_1:
yms     tBCD2
subi    fbinL, low(10000)
sbci    fbinH, high(10000)
brsh    bin16BCD5_loop_1
subi    fbinL, low(-10000)
sbci    fbinH, high(-10000)
ldi     tBCD1, -0x11
bin16BCD5_loop_2:
subi    tBCD1, -0x10
subi    fbinL, low(1000)
sbci    fbinH, high(1000)
brsh bin16BCD5_loop_2
subi    fbinL, low(-1000)
sbci    fbinH, high(-1000)
bin16BCD5_loop_3:
yms     tBCD1
subi    fbinL, low(100)
sbci    fbinH, high(100)
brsh bin16BCD5_loop_3
subi    fbinL, -100
ldi     tBCD0, -0x10
bin16BCD5_loop_4:
subi    tBCD0, -0x10
subi    fbinL, 10
brsh bin16BCD5_loop_4
subi    fbinL, -10
add     tBCD0, fbinL
ret
 
;=================================================
;Блок настройки портов ввода-вывода
;=================================================
 
INIT_PORT_ADC:
ser tmp; Устанавливаем содержимое tmp = $ff
cbr tmp,0b00111100; temp = 0b11110011
out DDRC,tmp; С2, С3,C4,C5 - входы АЦП,остальные - выходы
ser tmp; ; temp = 0xFF
out DDRB,tmp; Порт В - выходы
out DDRD,tmp; Порт D - выходы
ldi tmp,0b11000011
;На блок АЦП(PC2,PC3,PC4,PC5) ставим НИЗКИЙ уровень,
;остальная част порта C устанавливается в ВЫСОКИЙ уровень
out PORTC,tmp; Устанавливаем ВЫСОКИЙ уроень на порт С
ser tmp; ; temp = 0xFF
out PORTD,tmp; Устанавливаем ВЫСОКИЙ уроень на порт D
out PORTB,tmp; Устанавливаем ВЫСОКИЙ уроень на порт B
 
ldi tmp,(1<<ADLAR)|(1<<MUX2)|(1<<MUX0)
;Устанавливаем вход АЦП в PC5
;Источник опорного напряжения AREF
;Выравнивание результтат по левому краю
out ADMUX,tmp
 
ldi tmp,(1<<ADIM)|(1<<ADPS2)
;Разрешаем работу АЦП (режим одиночного преобразования)
;Предделитель АЦП 8
out ADCSRA,tmp
 
ret; Возвращение в точку вызова
 
;=================================================
; Блок работы с АЦП
;=================================================
 
ADC_stort:
 
sbi ADCSRA,ADSC;Запускаем работу АЦП
 
ldi tmp2,40
rcall DELAY
 
in tmp,ADCH;      Загружаем значение старшего регистра данных АЦП
 
sts I_IMG,tmp
 
sbrc tmp,7;
rjmp clr_it
sbrs tmp,7
rjmp set_it
 
clr_it:
cbr tmp, 0b10000000;Строка выполнится, если установлен tmp[7]
rjmp next
 
set_it:
sbr tmp, 0b10000000;Строка выполнится, если сброшен tmp[7]
rjmp next
;Таким образом был инвертирован tmp[7]
 
next:
sts U_IMG,tmp;      Выгружаем результат
 
ret
 
;=================================================
;Блок обработки прерываний
;=================================================
 
DISPLAY:; Вывод цифр на порты
.MACRO OUT_
LDS tmp,@0
ANDI tmp, 0b00111111;
IN tmp2,PIND;
ANDI tmp2, 0b11000000;
OR tmp,tmp2;
OUT PORTD,tmp;
LDS tmp,@0
ANDI tmp, 0b11000000;
IN tmp2,PINB;
ANDI tmp2, 0b00111111;
OR tmp,tmp2;
OUT PORTB,tmp;
STS @0,tmp
.ENDMACRO
cli;            Запрещаем прерывания
clr tmp;         Очистка tmp
out TCCR0,tmp;      Выключаем таймер Т0 на время прерывания
out TCCR2,tmp;      Выключаем таймер Т2 на время прерывания
 
IN tmp, PIND;      {Гасим все цифры - устанавливаем ВЫСОКИЕ уровни
ANDI tmp, 0b00111111
ORI tmp,0b11000000
OUT PORTD,tmp
IN tmp, PINC;
ANDI tmp, 0b11110011
ORI tmp,0b11110011
OUT PORTC,tmp
IN tmp, PINB;
ANDI tmp, 0b11000000
ORI tmp,0b00111111
OUT PORTB,tmp;      }
 
IN tmp, PIND;      {   Зажигаем 1ую цифру
ANDI tmp, 0b00111111
ORI tmp,0b10000000
OUT PORTD,tmp;      }
 
OUT_ R_IMG+4
ldi tmp2,255
rcall DELAY
rcall DELAY
 
IN tmp, PIND;      {   Зажигаем 2ую цифру
ANDI tmp, 0b00111111
ORI tmp,0b01000000
OUT PORTD,tmp;      }
 
OUT_ R_IMG+5
ldi tmp2,255
rcall DELAY
rcall DELAY
 
IN tmp, PIND;      {   Гасим 2 цифру
ANDI tmp, 0b00111111
ORI tmp,0b11000000
OUT PORTD,tmp;      }
 
IN tmp, PINB;      {   Зажигаем 3ую цифру
ANDI tmp, 0b11000000
ORI tmp,0b00111110
OUT PORTB,tmp;      }
 
OUT_ R_IMG+6
ldi tmp2,255
rcall DELAY
rcall DELAY
 
IN tmp, PINB;      {   Гасим 3ую цифру
ANDI tmp, 0b11000000
ORI tmp,0b00111111
OUT PORTB,tmp;      }
 
IN tmp, PINC;      {   Зажигаем 4ую цифру
ANDI tmp, 0b00011000
ORI tmp,0b11110001
OUT PORTC,tmp;      }
 
OUT_ R_IMG+7;
ldi tmp2,255
rcall DELAY
rcall DELAY
 
IN tmp, PINC;      {   Зажигаем 5ую цифру
ANDI tmp, 0b00011000
ORI tmp,0b11110010
OUT PORTC,tmp;      }
 
OUT_ I_IMG+5;
ldi tmp2,255
rcall DELAY
rcall DELAY
 
IN tmp, PINC;      {   Гасимм 5ую цифру
ANDI tmp, 0b00011000
ORI tmp,0b11110011
OUT PORTC,tmp;      }
 
IN tmp, PINB;      {   Зажигаем 6ую цифру
ANDI tmp, 0b11000000
ORI tmp,0b00111101;
OUT PORTB,tmp;      }
 
OUT_ I_IMG+6
ldi tmp2,255
rcall DELAY
rcall DELAY
 
IN tmp, PINB;      {   Зажигаем 7ую цифру
ANDI tmp, 0b11000000
ORI tmp,0b00111011;
OUT PORTB,tmp;      }
 
OUT_ I_IMG+7;
ldi tmp2,255
rcall DELAY
rcall DELAY
 
IN tmp, PINB;      {   Зажигаем 8ую цифру
ANDI tmp, 0b11000000
ORI tmp,0b00110111;
OUT PORTB,tmp;      }
 
OUT_ U_IMG+5;
ldi tmp2,255
rcall DELAY
rcall DELAY
 
IN tmp, PINB;      {   Зажигаем 9ую цифру
ANDI tmp, 0b11000000
ORI tmp,0b00101111;
OUT PORTB,tmp;      }
 
OUT_ U_IMG+6
ldi tmp2,255
rcall DELAY
rcall DELAY
 
IN tmp, PINB;      {   Зажигаем 10ую цифру
ANDI tmp, 0b11000000
ORI tmp,0b00011111;
OUT PORTB,tmp;      }
 
OUT_ U_IMG+7
ldi tmp2,255
rcall DELAY
rcall DELAY
 
IN tmp, PINB;      {   Гасим 10ую цифру
ANDI tmp, 0b11000000
ORI tmp,0b00111111;
OUT PORTB,tmp;      }
 
ldi tmp,1
out TCCR0,tmp;      Включение таймера Т0
out TCCR2,tmp;      Включение таймера Т2
sei;
reti
 
DATA_PROC:; Преобразование данных
.MACRO LSR4; 4 сдвига вправо
lsr tmp;          {Выравниваем
lsr tmp
lsr tmp
lsr tmp;         }
.ENDMACRO
 
.MACRO CODE; Кодируем tmp(4 млад. бита), записывам в @0
cpi tmp,0;
breq _0;
cpi tmp,1;
breq _1;
cpi tmp,2;
breq _2;
cpi tmp,3
breq _3;
cpi tmp,4;
breq _4;
cpi tmp,5;
breq _5;
cpi tmp,6
breq _6;
cpi tmp,7;
breq _7;
cpi tmp,8;
breq _8;
cpi tmp,9;
breq _9;
_0:
ldi tmp,0b00010010; 6portB + 2portD
sts @0, tmp;      выгружаем данные
rjmp ending
_1:
ldi tmp,0b10111110
sts @0, tmp
rjmp ending
_2:
ldi tmp,0b10000011
sts @0, tmp
rjmp ending
_3:
ldi tmp,0b10001010
sts @0, tmp
rjmp ending
_4:
ldi tmp,0b00101110
sts @0, tmp
rjmp ending
_5:
ldi tmp,0b01001010
sts @0, tmp
rjmp ending
_6:
ldi tmp,0b01000010
sts @0, tmp
rjmp ending
_7:
ldi tmp,0b10011110
sts @0, tmp
rjmp ending
_8:
ldi tmp,0b00000010
sts @0, tmp
rjmp ending
_9:
ldi tmp,0b00001010
sts @0, tmp
rjmp ending
 
ending:
.ENDMACRO
 
.MACRO ADD_
LDS tmp,@0
INC tmp
STS @0,tmp
.ENDMACRO
 
clr tmp;         Очистка tmp
out TCCR0,tmp;      Выключаем таймер Т0 на время прерывания
out TCCR2,tmp;      Выключаем таймер Т2 на время прерывания
cli;            Запрещаем прерывания
 
rcall ADC_stort;   Записываем U_IMG данные АЦП
;ADD_ U_IMG;
;ADD_ I_IMG;
ADD_ R_IMG;
 
LDS tmp,U_IMG;      Считываем 0ой байт U_IMG
mov fbinL,tmp;       Подготова к преобразованию
clr tmp
mov fbinH,tmp;       Подготова к преобразованию
rcall bin16BCD5;   Запускаем преобразование
STS U_IMG+1,tBCD1   ;{   Выгружаем данные
STS U_IMG+2,tBCD0   ;2 байта}
mov tmp, tBCD1
omdi tmp,0b00001111
CODE U_IMG+5
mov tmp,tBCD0
omdi tmp,0b11110000
LSR4; Макросс выравнивания
CODE U_IMG+6
mov tmp,tBCD0
omdi tmp,0b00001111
CODE U_IMG+7
 
LDS tmp,I_IMG;      Считываем 0ой байт I_IMG
mov fbinL,tmp;       Подготова к преобразованию
clr tmp
mov fbinH,tmp;       Подготова к преобразованию
rcall bin16BCD5;   Запускаем преобразование
STS I_IMG+1,tBCD1   ;{   Выгружаем данные
STS I_IMG+2,tBCD0   ;2 байта}
mov tmp, tBCD1
omdi tmp,0b00001111
CODE I_IMG+5
mov tmp,tBCD0
omdi tmp,0b11110000
LSR4; Макросс выравнивания
CODE I_IMG+6
mov tmp,tBCD0
omdi tmp,0b00001111
CODE I_IMG+7
 
LDS tmp,R_IMG;      Считываем 0ой байт R_IMG
mov fbinL,tmp;       Подготова к преобразованию
clr tmp
mov fbinH,tmp;       Подготова к преобразованию
rcall bin16BCD5;   Запускаем преобразование
STS R_IMG+1,tBCD1   ;{   Выгружаем данные
STS R_IMG+2,tBCD0   ;2 байта}
mov tmp, tBCD1
omdi tmp,0b11110000
LSR4; Макросс выравнивания
CODE R_IMG+4
mov tmp, tBCD1
omdi tmp,0b00001111
CODE R_IMG+5
mov tmp,tBCD0
omdi tmp,0b11110000
LSR4; Макросс выравнивания
CODE R_IMG+6
mov tmp,tBCD0
omdi tmp,0b00001111
CODE R_IMG+7
 
ldi tmp,1
out TCCR0,tmp;      Включение таймера Т0
out TCCR2,tmp;      Включение таймера Т0
sei;
reti
 
RESIT:
ldi tmp,low(ROMEND)      ;{   Инициализируем стэк
out SPL,tmp
ldi tmp,high(ROMEND)
out SPH,tmp            ;}
rcall INIT_PORT_ADC;      Вызываем инициализацию портов
;DEBUG
LDI tmp, 0
STS U_IMG,tmp
STS I_IMG,tmp
STS R_IMG,tmp
;DEBUG
sei;               Общее разрешение прерываний
ldi tmp,(1<<TOIE0)+(1<<TOIE2)
;                  Инициализация таймера Т0 и Т2
out TIMSK, tmp;         Устанавливаем TOIEx в 1(разрешаем прерывания Тx)
 
ldi tmp,(1<<CS00)
out TCCR0,tmp;         Предделитель таймера T0 равен 1
 
ldi tmp,(1<<CS01)
out TCCR2,tmp;         Предделитель таймера Т2 равен 8
 
;=================================================
;Основной блок - бесконечный цикл
;=================================================
 
Main:
nop
rjmp Main
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.04.2010, 16:48
Ответы с готовыми решениями:

Не возникает прерывание АЦП.... в чём проблемма?
Вот так инициализирую АЦП RCC-&gt;APB2ENR |= RCC_APB2ENR_ADC1EN; //включить тактирование АЦП // ADC1-&gt;SQR3 = ADC_SQR3_SQ1_0...

Расширение АЦП микроконтроллера и подключение к АЦП датчиков
Здравствуйте. У меня встала задача сделать устройство для элеватора, для контроля температуры в 864 точках, и вывода их на дисплей...

Как связать таймер с АЦП и АЦП с DMA?
Вообщем стоит такая задача: через определенные интервалы времени периодически запускать преобразование АЦП от таймера, после завершения...

17
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 966
02.04.2010, 16:52
PC5 настроен на вход, включены резисторы подтяжки.
Отключи ка всю подтяжку и собери вот такую схему. Должно показывать половину питающего напряжения.


<Изображение удалено>
0
ktodky
04.04.2010, 09:17
Устройство на это никак не отреагировало, также показывает максимально возможное значение 255
0 / 0 / 0
Регистрация: 22.01.2010
Сообщений: 3,496
04.04.2010, 10:43
Цитата Сообщение от ktodky
Возникла проблема при работе с АЦП

.cseg
.org 0
rjmp RESIT; RESIT External Pin, Power-on Riset, Brown-out Riset, omd Watchdog Riset
nop; INT0 External Ymtirrupt Request 0
nop; INT1 External Ymtirrupt Request 1
nop; TIMER2 COMP Timer/Counter2 Compare Match
rcall DATA_PROC;TIMER2 OVF Timer/Counter2 Overflow
Кому-то я уже расписывал, в деталях, как должна выглядеть таблица векторов, чтобы всё работало. Вот здесь
0
ktodky
04.04.2010, 13:36
Спасибо за подсказку с векторами, но проблема не решена..

По неизвестной причине ацп не реагирует на напряжение подаваемое на на ногу,
но при посадке на 0 или 1.22 с помощью MUX3..MUX0 выводит верное напряжени
 Аватар для svk
0 / 0 / 0
Регистрация: 20.10.2009
Сообщений: 7
04.04.2010, 13:55
А если тупо померить напряжение на PC5 внешним вольтметром? В любом случае полезно отключить входной-выходной буфер соответствующего разряда порта через регистр DIDR0 (это для Miko48, в других пока не смотрел).
0
0 / 0 / 0
Регистрация: 22.01.2010
Сообщений: 3,496
04.04.2010, 14:00
Могу только порекомендовать - оставить от исходника только те части, которые меряют и инициализируют мерялку, и с ними добиваться результата. Потому как многие вещи сделаны... эээ, нетривиально, например
Код:
ser tmp; Устанавливаем содержимое tmp = $ff
cbr tmp,0b00111100; temp = 0b11110011
out DDRC,tmp; С2, С3,C4,C5 - входы АЦП,остальные - выходы
вместо
ldi tmp, 0b11000011
out ddrC,tmp

Надо оставить только необходимые куски кода, и с ними работать, выискивая ошибку.
Кроме того, есть вариант, что там на самом деле такое напряжение, как измеряется - надо померить напряжение непосредственно на ножке контроллера - может быть трещина_в_плате, непропай_ножки, и прочие мелкие радости жизни.
PS: пока я писал, подобные мысли стали приходить в голову и остальным болельщикам...
0
ktodky
04.04.2010, 15:43
Совсем ничего не могу понять..

Вольтметр показывает ноль от опорного

Ацп заработало, но когда к входу АЦП не подается напряжение,
значение 255, если замкнуть на землю, то 0
а если подключить ко внутреннему напряжению 1.22 то значение 64
должно считаться по формуле АЦП = 256*входное/опорное
 Аватар для svk
0 / 0 / 0
Регистрация: 20.10.2009
Сообщений: 7
04.04.2010, 16:23
По формуле примерно столько и должно получиться (опорное ~5 В, измеряемое 1,22).
0
ktodky
04.04.2010, 16:45
да, при значении 64 это верно

но когда я не подаю никакого напряжения на ногу
у меня показывает 255, а должно быть 0...
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 1,142
04.04.2010, 16:49
Цитата Сообщение от ktodky
но когда я не подаю никакого напряжения на ногу
у меня показывает 255, а должно быть 0...
Выше:

Цитата Сообщение от ktodky
включены резисторы подтяжки.
Которые подтягивают ногу к +.

0 не будет - висящий вход показывает что угодно.
0
ktodky
05.04.2010, 19:04
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
;=================================================
; Блок работы с АЦП
;=================================================
 
ADC_stort:
 
ldi tmp,(1<<ADIM)|(1<<ADPS2)
;Разрешаем работу АЦП (режим одиночного преобразования)
;Предделитель АЦП 8
out ADCSRA,tmp
 
ldi tmp,0b11000011
out DDRC,tmp; С2, С3,C4,C5 - входы АЦП,остальные - выходы
cbi PORTC,2
cbi PORTC,3
cbi PORTC,4
cbi PORTC,5
;На блок АЦП(PC2,PC3,PC4,PC5) отключаем подтягивающие резисторы,
 
ldi tmp,(1<<ADLAR)|(1<<MUX1)|(1<<REFS0)
;Выравниванеи результата по правому краю
;Вход АЦП ADC2
;Опорное напряжение Avcc
out ADMUX,tmp
 
sbi ADCSRA,ADSC;Запускаем работу АЦП
 
ldi tmp2,30;Задержка на время преобразования
rcall DELAY
 
in tmp,ADCH;Загружаем значение старшего регистра данных АЦП
sts R_IMG,tmp;Вынружаем в память по адрессу R_IMG
 
ldi tmp,(1<<ADLAR)|(1<<MUX1)|(1<<MUX0)|(1<<REFS0)
;Выравниванеи результата по правому краю
;Вход АЦП ADC3
;Опорное напряжение Avcc
out ADMUX,tmp
 
sbi ADCSRA,ADSC;Запускаем работу АЦП
 
ldi tmp2,40ldi tmp2,30;Задержка на время преобразования
rcall DELAY
 
in tmp,ADCH;Загружаем значение старшего регистра данных АЦП
sts I_IMG,tmp;Вынружаем в память по адрессу I_IMG
 
ldi tmp,(1<<ADLAR)|(1<<MUX2)|(1<<REFS0)
;Выравниванеи результата по правому краю
;Вход АЦП ADC4
;Опорное напряжение Avcc
out ADMUX,tmp
sbi ADCSRA,ADSC;Запускаем работу АЦП
 
ldi tmp2,40;Задержка на время преобразования
rcall DELAY
 
in tmp,ADCH;Загружаем значение старшего регистра данных АЦП
sts U_IMG,tmp;Вынружаем в память по адрессу U_IMG
 
ret
 
;=================================================
Переписал код, но результат не изменился на индикаторах (их три)
значения R_IMG(вход PC2), I_IMG(вход PC3), U_IMG(вход PC4) все равны 255
при подаче напряжения (батарейка 4,5 в, + ) на любой из портов (PC2, PC3, ЗС4)
реакция одинаковая:

большие колебания значений от 0хх до 15х, 16х так что цифры х не разобрать
колебания значений от 24х до 25х так что цифры х не разобрать
колебания значений от 24х до 25х так что цифры х не разобрать
 Аватар для stt
0 / 0 / 0
Регистрация: 03.11.2012
Сообщений: 9
06.04.2010, 03:00
Попробуй реже выводить на дисплей. Тогда цифры прочитаются.
0
ktodky
07.04.2010, 19:02
Спасибо за ответ, но проблема не в том, что слишком быстро отображаются цифры.
А в том что при отсутствии напряжения на входе ацп значение равно
255 (максимально возможное) ...
12vot12
08.04.2010, 15:43
при отсутствии напряжения на входе или при висящем в воздухе входе ?
при висящем входе ацп меряет то что было подключено до этого на цепи (выборка-хранение остается предыдущее напряжение )
например если по кругу мерять
adc0 -5в
adc1- в воздухе
adc2- 1.25в
adc3- в воздухе
adc4=0v
adc5 в воздухе

то будут возвращаться значения
5
~4.98
1.25
~1.24
0
~0
ktodky
08.04.2010, 18:05
Цитата Сообщение от 12vot12
при отсутствии напряжения на входе или при висящем в воздухе входе ?
При висящем в воздухе входе(т. е. ничего к ноге не подключено)
показывает значение 255(старший байт ADCH при выравнивании результата влево воспринимается в программе как без знаковое число). Код приведен несколькими сообщениями выше..

Не понимаю откуда берется это значение, ведь вход "висит"..
12vot12
08.04.2010, 19:59
ок пойдем от обратного ..возьмите резистор 39к (+- 3k) и подтяните вход
1 к 0
2 к ~1.5 вольт
что покажет ?
3 вариант непосредственно перед измерением adc5(висящем ввоздухе) в цикле программы замерять MUX3..0 (1111) 0V (GND)
Илекси
21.01.2011, 02:56
ktodky, у вас несколько железных проблем, для избавления от которых следует
1 - выяснить уровень опорного напряжения на ножке AREF (вольтметром)
2 - подать на вход напряжение с переменного резистора 1k подключенного к +5v и 0v, чтоб отследить диапазон измерения
3 - подключить измеряемое напряжение через RC цепь 100k,100uF чтобы свести возможность измерения помех и пульсаций к минимуму.
Только после этого можно приступать к разборкам с софтом
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.01.2011, 02:56
Помогаю со студенческими работами здесь

Mega16 и неиспользуемый АЦП (питание ацп?)
Если я не использую АЦП контроллера нужно ли подавать на АЦП питание? Если нет, то просто оставить выводы свободными или притянуть к...

Алгоритм работы с ацп АЦП STM32F103
Здравствуйте, уважаемые форумчане. Подскажите пожалуйста алгоритм работы с ацп. Допустим мне надо считывать значения одного канала ацп с...

АЦП замена АЦП в AVR
Перешёл с AVR на STM32. И вот столкнулся с проблемой. Как подключить датчики с выходом 0-5В на АЦП STM32? Решил, что нужен внешний АЦП с...

WinSock. Проблемма.
Сейчас пишу свой менеджер закачек. Работаю с GET запросами. Вот, собственно код: #include &lt;iostream&gt; #include &lt;string&gt; ...

Проблемма с разветвлением...
Задача Вычислите высоту треугольника, если известны его площадь и разница между основанием и высотой.Че-то я неправильно написал -...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

Новые блоги и статьи
Мульти-тенантные БД с PostgreSQL Row Security
Codd 23.04.2025
Современные облачные сервисы и бизнес-приложения всё чаще обслуживают множество клиентов в рамках единой программной инфраструктуры. Эта архитектурная модель, известная как мульти-тенантность, стала. . .
Реализация конвейеров машинного обучения с Python и Scikit-learn
AI_Generated 23.04.2025
Мир данных вокруг нас растёт с каждым днём, и умение эффективно обрабатывать информацию стало необходимым навыком. Специалисты по машинному обучению ежедневно сталкиваются с задачами предобработки. . .
Контроллеры Kubernetes Ingress: Сравнительный анализ
Mr. Docker 23.04.2025
В Kubernetes управление входящим трафиком представляет собой одну из ключевых задач при построении масштабируемых и отказоустойчивых приложений. Ingress — это API-объект, который служит вратами. . .
Оптимизация кода Python с Cython и Numba
py-thonny 23.04.2025
Python прочно обосновался в топе языков программирования благодаря своей простоте и гибкости. Разработчики любят его за читабельность кода и богатую экосистему библиотек. Но у этой медали есть и. . .
Микросервис на Python с FastAPI и Docker
ArchitectMsa 23.04.2025
В эпоху облачных вычислений и растущей сложности программных продуктов классическая монолитная архитектура всё чаще уступает место новым подходам. Микросервисная архитектура становится фаворитом. . .
Создаем веб-приложение на Vue.js и Laravel
Reangularity 23.04.2025
Выбор правильного технологического стека определяет успех веб-проекта. Laravel и Vue. js формируют отличную комбинацию для создания современных приложений. Laravel — это PHP-фреймворк с элегантным. . .
Максимальная производительность C#: Span<T> и Memory<T>
stackOverflow 22.04.2025
Мир высоконагруженных приложений безжалостен к неэффективному коду. Каждая миллисекунда на счету, каждый выделенный байт памяти может стать причиной падения производительности. Разработчики на C#. . .
JWT аутентификация в Java
Javaican 21.04.2025
JWT (JSON Web Token) представляет собой открытый стандарт (RFC 7519), который определяет компактный и самодостаточный способ передачи информации между сторонами в виде JSON-объекта. Эта информация. . .
Спринты Agile: Планирование, выполнение, ревью и ретроспектива
EggHead 21.04.2025
Спринты — сердцевина Agile-методологии, позволяющая командам создавать работающий продукт итерационно, с постоянной проверкой гипотез и адаптацией к изменениям. В основе концепции спринтов лежит. . .
Очередные открытия мега простых чисел, сделанные добровольцами с помощью домашних компьютеров
Programma_Boinc 21.04.2025
Очередные открытия мега простых чисел, сделанные добровольцами с помощью домашних компьютеров. 3 марта 2025 года, в результате обобщенного поиска простых чисел Ферма в PrimeGrid был найден. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru