реклама на сайте
подробности

 
 
> Переключение между каналами АЦП, ATmega32
B_Sergey_N
сообщение Sep 28 2008, 18:41
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 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 из прерывания?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Николай Иванович...
сообщение Sep 28 2008, 19:02
Сообщение #2


Частый гость
**

Группа: Новичок
Сообщений: 139
Регистрация: 26-09-08
Пользователь №: 40 510



Не забывайте делать задержку после включения ADC битом ADEN на время затухания переходных процессов, задержку после переключения канала, необходимую для разряда Sample-Hold-ёмкости, чтобы избежать взаимовлияния каналов. Если же у Вас выходное сопротивление источника сигнала низкое то по-любому результаты первого после переключения канала АЦП лучше выбросить
Go to the top of the page
 
+Quote Post
singlskv
сообщение Oct 4 2008, 20:38
Сообщение #3


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(Николай Иванович Приходько @ Sep 28 2008, 23:02) *
Не забывайте делать задержку после включения ADC битом ADEN на время затухания переходных процессов,
Странно, а я думал что эта задержка уже включена в первое преобразование.
Цитата
задержку после переключения канала, необходимую для разряда Sample-Hold-ёмкости, чтобы избежать взаимовлияния каналов.
Не подскажите в какой момент времени после переключения канала в ADMUX,
соответствующий пин подключаеться к Sample-Hold ?
Цитата
Если же у Вас выходное сопротивление источника сигнала низкое то по-любому результаты первого после переключения канала АЦП лучше выбросить
А если выходное сопротивление ИСТОЧНИКА очень высокое, то первый результат верный ?


Цитата(domowoj @ Sep 29 2008, 06:09) *
АЦП можно переключать сразу после начала предыдущего преобр.
включится он по окончании предыдущего преобр.
А как Вы определяете начало очередного преобразования ?

Цитата(hainiken @ Oct 5 2008, 00:15) *
по ДШ вроде 125 мкС мин. паузу рекомендуют

125 мкС это требование при переключении только дифференциальных каналов.

2 B_Sergey_N
1.flag используется и в прерывании и в основной проге, исчем по форуму слово volatile
2. задержки по много мс в прерывании не есть хорошо
3. ADMUX |= 0; просто не меняет ничего
Go to the top of the page
 
+Quote Post
Николай Иванович...
сообщение Oct 7 2008, 09:03
Сообщение #4


Частый гость
**

Группа: Новичок
Сообщений: 139
Регистрация: 26-09-08
Пользователь №: 40 510



Цитата(singlskv @ Oct 5 2008, 00:38) *
Странно, а я думал что эта задержка уже включена в первое преобразование.

Нет. Первое холостое преобразование нужно делать, чтобы инициализировать модуль АЦП, поэтому его нужно делать даже в том случае, если питание на модуль АЦП (установкой бита ADEN) подали несколько часов назад. Тем более что время первого преобразования зависит от выбранной частоты тактирования модуля АЦП, и оно может меняться в весьма широких пределах. Тогда как длительность переходных процессов при подаче питания на модуль АЦП фиксирована и не зависит от частоты его тактирования.

Цитата(singlskv @ Oct 5 2008, 00:38) *
Не подскажите в какой момент времени после переключения канала в ADMUX,соответствующий пин подключаеться к Sample-Hold ?

Меня тоже интересует этот вопрос smile.gif Но ответа на него я не нахожу.

Цитата(singlskv @ Oct 5 2008, 00:38) *
А если выходное сопротивление ИСТОЧНИКА очень высокое, то первый результат верный ?

Простите. ОписАлся. Разумеется всё наоборот. smile.gif

Сообщение отредактировал Николай Иванович Приходько - Oct 7 2008, 09:11
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- B_Sergey_N   Переключение между каналами АЦП   Sep 28 2008, 18:41
|- - 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
- - domowoj   Вот на русском, почти даташиит(хотя и не без ошибо...   Oct 7 2008, 14:29
- - Николай Иванович Приходько   Цитата(domowoj @ Oct 7 2008, 18:29) Перво...   Oct 7 2008, 18:35
- - singlskv   Цитата(Николай Иванович Приходько @ Oct 7 200...   Oct 7 2008, 18:46
|- - Николай Иванович Приходько   Цитата(singlskv @ Oct 7 2008, 22:46) для ...   Oct 7 2008, 19:01
|- - singlskv   Цитата(Николай Иванович Приходько @ Oct 7 200...   Oct 7 2008, 19:10
- - domowoj   Цитата(Николай Иванович Приходько @ Oct 8 200...   Oct 8 2008, 03:18


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th June 2025 - 23:45
Рейтинг@Mail.ru


Страница сгенерированна за 0.01579 секунд с 7
ELECTRONIX ©2004-2016