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

 
 
> Переключение между каналами АЦП, 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
VladimirYU
сообщение Oct 7 2008, 12:33
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782



Цитата(Николай Иванович Приходько @ Oct 7 2008, 13:03) *
Нет. Первое холостое преобразование нужно делать, чтобы инициализировать модуль АЦП, поэтому его нужно делать даже в том случае, если питание на модуль АЦП (установкой бита ADEN) подали несколько часов назад. Тем более что время первого преобразования зависит от выбранной частоты тактирования модуля АЦП, и оно может меняться в весьма широких пределах. Тогда как длительность переходных процессов при подаче питания на модуль АЦП фиксирована и не зависит от частоты его тактирования.
Меня тоже интересует этот вопрос smile.gif Но ответа на него я не нахожу.


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


А можно ссылочку необходимоть холостого преобразования. Никогда им не пользовался и проблем небыло. Часто о нем слышал ткните пожалуйста (а то фантом какой то получается). Насчет выборки, как раз все расписано. См. DS для меги128 рис 110, 111, 112.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- B_Sergey_N   Переключение между каналами АЦП   Sep 28 2008, 18:41
|- - 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 Текстовая версия Сейчас: 11th August 2025 - 14:03
Рейтинг@Mail.ru


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