|
Переключение между каналами АЦП, ATmega32 |
|
|
|
Sep 28 2008, 18:41
|

Участник

Группа: Новичок
Сообщений: 17
Регистрация: 28-07-08
Из: г. Санкт-Петербург
Пользователь №: 39 246

|
Всем привет. Как можно переключаться между каналами АЦП? К примеру, мне необходимо: сделать преобразование, прочитать один канал (Vbg), затем опять сделать преобразование и прочитать канал ADC0. Выкладываю код, переключения между каналами не происходит. Код #include <util/delay.h> #include <avr/io.h> #include <avr/interrupt.h>
#define F_CPU 16000000
int i, flag, t; void main(void) { DDRA |= (1 << 1)|(1 << 2)|(1 << 6)|(1 << 7); // Инициализация светодиодов
ADCSRA |= (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); // Установка частоты преобразования 125KHz
ADCSRA |= (1 << ADEN); // Вкл. АЦП
ADCSRA |= (1 << ADIE); // Разрешение прерывания от компаратора sei();
for(;;) { flag = 1; ADMUX |= (1 << 1)|(1 << 2)|(1 << 3)|(1 << 4); // Выбор входного канала АЦП - Vbg ADCSRA |= (1 << ADSC); // Запуск преобразования
flag = 0; ADMUX |= 0; // Выбор входного канала АЦП - ADC0 ADCSRA |= (1 << ADSC); // Запуск преобразования }
}
//********************************************************************************//
ISR(ADC_vect) { if (flag == 1) { i = ADCL; // Чтение младших 8 битов первыми i += (int)ADCH << 8; // Чтение старших 2 битов, умножение их на 256 и сложение с мл. б. if (i < 255) { // Питание контроллера падает _delay_ms(200);
PORTA |= (1 << 6); _delay_ms(200); PORTA &= ~(1 << 6); } }
if (flag == 0) { t = ADCL; // Чтение младших 8 битов первыми t += (int)ADCH << 8; // Чтение старших 2 битов, умножение их на 256 и сложение с мл. б. if (t < 830) { _delay_ms(200);
PORTA |= (1 << 1); _delay_ms(200); PORTA &= ~(1 << 1); } else { _delay_ms(200);
PORTA |= (1 << 2); _delay_ms(200); PORTA &= ~(1 << 2); }
}
} Не знаю, необходим ли reti из прерывания?
|
|
|
|
|
 |
Ответов
|
Oct 7 2008, 18:35
|
Частый гость
 
Группа: Новичок
Сообщений: 139
Регистрация: 26-09-08
Пользователь №: 40 510

|
Цитата(domowoj @ Oct 7 2008, 18:29)  Первое преобразование на один такт больше. Не на один, а на 12. Курите датушит. A normal conversion takes 13 ADC clock cycles. The first conversion after the ADC is switched on (ADEN in ADCSRA is set) takes 25 ADC clock cycles in order to initialize the analog circuitry.Цитата(singlskv @ Oct 7 2008, 22:22)  для худшего случая, те fADC=200Кгц, 200кГц - это не худший случай, а номинальный. Худший - это Fadc=1МГц и большое выходное сопротивление источника сигнала
|
|
|
|
|
Oct 7 2008, 18:46
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(Николай Иванович Приходько @ Oct 7 2008, 22:35)  200кГц - это не худший случай, а номинальный. Худший - это Fadc=1МГц и большое выходное сопротивление источника сигнала для 200кГц 10бит номинально для 1МГц 8бит, так что примерно один фиг, доп. 12 тактов fADC хватит в любом варианте... А большое выходное сопротивление источника сигнала..., дык даташит его однозначно регламенирует: The ADC is optimized for analog signals with an output impedance of approximately 10 kΩ or less.Так что если у Вас больше, это Ваши сложности...
|
|
|
|
|
Oct 7 2008, 19:01
|
Частый гость
 
Группа: Новичок
Сообщений: 139
Регистрация: 26-09-08
Пользователь №: 40 510

|
Цитата(singlskv @ Oct 7 2008, 22:46)  для 200кГц 10бит номинально для 1МГц 8бит, так что примерно один фиг, доп. 12 тактов fADC хватит в любом варианте... 12 тактов при Fadc=1МГц длятся по времени в 5 раз меньше чем при Fadc=200кГц. А Вы говорите "один фиг". А если брать в расчёт нижнюю границу "нормы" 50 кГц... 200кГц, то и в 20 раз
Сообщение отредактировал Николай Иванович Приходько - Oct 7 2008, 19:04
|
|
|
|
Сообщений в этой теме
B_Sergey_N Переключение между каналами АЦП Sep 28 2008, 18:41 Николай Иванович Приходько Не забывайте делать задержку после включения ADC б... Sep 28 2008, 19:02 singlskv Цитата(Николай Иванович Приходько @ Sep 28 20... Oct 4 2008, 20:38  Николай Иванович Приходько Цитата(singlskv @ Oct 5 2008, 00:38) Стра... Oct 7 2008, 09:03   VladimirYU Цитата(Николай Иванович Приходько @ Oct 7 200... Oct 7 2008, 12:33   singlskv Цитата(Николай Иванович Приходько @ Oct 7 200... Oct 7 2008, 18:22 smac Цитата(B_Sergey_N @ Sep 28 2008, 22:41) .... Sep 28 2008, 21:23 SysRq 0) F_CPU следует определить в makefile, или до вкл... Sep 28 2008, 22:36 domowoj Я не силен в СИ, но после каждого ночала преобразо... Sep 29 2008, 02:09 VladimirYU Цитата(B_Sergey_N @ Sep 28 2008, 22:41) В... Sep 29 2008, 09:47 hainiken по ДШ вроде 125 мкС мин. паузу рекомендуют, а напр... Oct 4 2008, 20:15 domowoj УВХ начинает работать вместе с АЦП, на то оно и УВ... Oct 5 2008, 14:22 singlskv Цитата(domowoj @ Oct 5 2008, 18:22) УВХ н... Oct 5 2008, 15:47 domowoj На конденцаторе хранения УВХ напряж.запоминается в... Oct 5 2008, 16:21 singlskv Цитата(domowoj @ Oct 5 2008, 20:21) На ко... Oct 5 2008, 16:43 B_Sergey_N Большое спасибо всем за ответы!!! Особ... Oct 5 2008, 17:31 rudy_b Что-то я не понимаю, вы про какой проц говорите? Е... Oct 5 2008, 18:23 singlskv Цитата(rudy_b @ Oct 5 2008, 22:23) Что-то... Oct 5 2008, 18:34 domowoj Вывод!
Делай все как надо - и не будет никаких... Oct 6 2008, 00:34    singlskv Цитата(Николай Иванович Приходько @ Oct 7 200... Oct 7 2008, 19:10  domowoj Цитата(Николай Иванович Приходько @ Oct 8 200... Oct 8 2008, 03:18
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|