Форум программистов, компьютерный форум, киберфорум
Электроника для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.61/41: Рейтинг темы: голосов - 41, средняя оценка - 4.61
Oxydi
0 / 0 / 0
Регистрация: 04.05.2010
Сообщений: 115
1

АЦП несколько каналов

25.09.2010, 16:26. Просмотров 7485. Ответов 12
Метки нет (Все метки)

Нужно замерять сигналы с трех выводов АЦП МК, как это сделать грамотно?
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.09.2010, 16:26
Ответы с готовыми решениями:

Использование нескольких каналов АЦП
Всем привет. Пишу небольшую прогу для ATmega8, и возник вопрос как считывать данные сразу с двух...

Большое количество АЦП каналов
Здравствуйте! Подскажите микроконтроллеры с количеством АЦП 50 или больше каналов. И есть ли...

Проект платы аналогового реобаса на несколько каналов.
Доброго времени суток, форумчане, DiHAlt. Задумал тут сделать на базе аналогового реобаса...

Свитчер звуковых каналов
Так исторически сложилось, что в компутере у меня присутствуют 2 звуковые карты, в комнате 2...

12
Dirspywok
0 / 0 / 0
Регистрация: 01.05.2010
Сообщений: 833
25.09.2010, 16:35 2
Какие сигналы, как часто замерять, с какой точностью?
0
okotimiv
1 / 1 / 0
Регистрация: 30.08.2010
Сообщений: 3,382
25.09.2010, 16:44 3
Есть несколько разных способов, все они более или менее грамотны. Выбор конкретной реализации зависит от задачи и от МК.
0
Midvid
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 966
25.09.2010, 17:15 4
В чем конкретно сложность? Активируешь нужный канал и читаешь. Потом второй точно также и третий.
0
Oxydi
0 / 0 / 0
Регистрация: 04.05.2010
Сообщений: 115
25.09.2010, 17:59 5
Цитата Сообщение от Dirspywok
Какие сигналы, как часто замерять, с какой точностью?
Напряжение 0 - 5 В :) Большая точность пока не интересует.
Цитата Сообщение от Midvyd
В чем конкретно сложность? Активируешь нужный канал и читаешь. Потом второй точно также и третий.
Сложности нет. Т.е. замерил сигнал с нулевого канала, затем поменял ADMUX, замерил с первого и т.д.?
0
Dirspywok
0 / 0 / 0
Регистрация: 01.05.2010
Сообщений: 833
25.09.2010, 18:19 6
Напряжение 0 - 5 В :) Большая точность пока не интересует.
Ну тогда пассивный RC фильтр Герц на 50 на каждый канал, и просто по порядку считывать, не часто, раз в 5-10мС.
0
Midvid
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 966
25.09.2010, 18:43 7
Цитата Сообщение от Oxydi
Сложности нет. Т.е. замерил сигнал с нулевого канала, затем поменял ADMUX, замерил с первого и т.д.?
Да всё верно
0
okotimiv
1 / 1 / 0
Регистрация: 30.08.2010
Сообщений: 3,382
25.09.2010, 19:12 8
Это если процессор типа Меги. Если иксмега, например, то задача решается по другому - там псевдомногоканальный АЦП.

Для меги при измерениях лучше использовать специальный режим сна, будут меньше помехи.
0
Гарнист
0 / 0 / 0
Регистрация: 22.01.2010
Сообщений: 3,496
26.09.2010, 01:26 9
Цитата Сообщение от Midvyd
Цитата Сообщение от Oxydi
Сложности нет. Т.е. замерил сигнал с нулевого канала, затем поменял ADMUX, замерил с первого и т.д.?
Да всё верно
Только надо вкурить даташит к конкретному процу и ерраты. Может оказаться, что после баловства с admux первое измерение будет фуфловым. Его результат надо проигнорировать и сделать ещё одно измерение.
0
Oxydi
0 / 0 / 0
Регистрация: 04.05.2010
Сообщений: 115
10.10.2010, 18:38 10
В общем сделал так: первое преобразование стартует после инициализации. Каналы 0,1,2. В прерывании забирается значение с АЦП, меняется канал и преобразование повторяется.
Код
unsykned char AdcBuf[3] = {0,0,0};
unsykned char AdcIndex = 0;

#pragma vector = ADC_vect
__interrupt void ADC_ISR(void)
{

ADMUX &= ~((AdcIndex)<<MUX0);                      // Выключаем предыдущий канал АЦП
AdcBuf[AdcIndex] = ADC;                            // Забираем значение АЦП

if (++AdcIndex >= 3)  {  AdcIndex = 0;   }

ADMUX |= ((AdcIndex) << MUX0);                     // Включаем следующий канал АЦП

ADCSRA |= (1<<ADSC);                               // Стартуем преобразование
}
0
xroymom
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 727
10.10.2010, 18:50 11
А зачем
ADMUX &= ~((AdcIndex)<<MUX0); // Выключаем предыдущий канал АЦП
...
ADMUX |= ((AdcIndex) << MUX0); // Включаем следующий канал АЦП

Почему бы не написать
#defyme ADMUXval ((1<<ADIM)|...)
ADMUX=ADMUXval|(AdcIndex<<MUX0);
0
Oxydi
0 / 0 / 0
Регистрация: 04.05.2010
Сообщений: 115
10.10.2010, 18:59 12
Цитата Сообщение от xroymom
А зачем
ADMUX &= ~((AdcIndex)<<MUX0); // Выключаем предыдущий канал АЦП
...
ADMUX |= ((AdcIndex) << MUX0); // Включаем следующий канал АЦП

Почему бы не написать
#defyme ADMUXval ((1<<ADIM)|...)
ADMUX=ADMUXval|(AdcIndex<<MUX0);
Это частности :) Мне так было удобнее.
0
o9d
0 / 0 / 0
Регистрация: 10.08.2010
Сообщений: 1,264
10.10.2010, 19:16 13
Код
#ymstude <avr/io.h>
#ymstude <util/delay.h>

#ymstude "uart.h"

//---------------------------------------------------------------------------
//
//      System objects
//
UART::CUart MyUart;

//============================================================
int main()
{
unsykned char H0,L0;

MyUart.init(); // инициализация UART

PORTC=0;

ADCSR=(1<<ADIM) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);

while(1)
{
//Канал 1
ADMUX=(1<<REFS0)|(1<<REFS1);      //выбираем

MyUart.sendByte(0xFF); //Начало посылки, два байта FF уникальный символ
MyUart.sendByte(0xFE);

ADCSR |= (1<<ADSC);
while((ADCSR&(1<<ADSC))!=0);

L0=ADCL;
H0=ADCH;

//Канал 2
ADMUX=(1<<REFS0)|(1<<REFS1)|(1<<MUX0);

MyUart.sendByte(H0);      //отправить данные канала 1
MyUart.sendByte(L0);

ADCSR |= (1<<ADSC);
while((ADCSR&(1<<ADSC))!=0);
L0=ADCL;
H0=ADCH;

//канал 3
ADMUX=(1<<REFS0)|(1<<REFS1)|(1<<MUX1);

MyUart.sendByte(H0);   //отправить данные канала 2
MyUart.sendByte(L0);

ADCSR |= (1<<ADSC);
while((ADCSR&(1<<ADSC))!=0);
L0=ADCL;
H0=ADCH;

//канал 4
ADMUX=(1<<REFS0)|(1<<REFS1)|(1<<MUX1)|(1<<MUX0);

MyUart.sendByte(H0);    //отправить данные канала 3
MyUart.sendByte(L0);

ADCSR |= (1<<ADSC);
while((ADCSR&(1<<ADSC))!=0);
L0=ADCL;
H0=ADCH;

MyUart.sendByte(H0);   //отправить данные канала 4
MyUart.sendByte(L0);
}
}//end main
//============================================================
Это код рабочего курсака, 4-ре канала. Работает как часы.
0xFFFE - метка начала посылки. Также у меня на входе стоит делитель 1:2.
0
10.10.2010, 19:16
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.10.2010, 19:16

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Распределитель импульсов на 35 каналов
Помогите спроектировать распределитель импульсов на 35 каналов

Просмотр платных каналов со спутниковых рессиверов!
Здравствуйте, у меня вопрос - как смотреть платные каналы - на рессивере (спутниковом) кроме...

на каких элементах делать коммутацию каналов
день добрый, снова у меня детский вопрос ... у монитора есть несколько сигнальных входов. я бы...

"Farblichtmusik 2012". Светомузыка (цветомузыка) 6 каналов.
&quot;Farblichtmusik 2012&quot;. Светомузыка (цветомузыка) 6 каналов. 120 ярких светодиодов (20х6). ...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.