АЦП ATmega16 - Страница 9 - Форум
Вторник, 27.08.2013, 22:08 Вы вошли как Гость | Группа "Гости"
Eugene's MCU
Главная | | Мой профиль | Выход | RSS

[ Личные сообщения() · Новые сообщения · Участники · Правила форума · Поиск · RSS ]

Страница 9 из 11«127891011»
Форум » Основной раздел » Разработка: программирование, схемотехника. » АЦП ATmega16 (Учебная программа - вольтметр на ATmega16)
АЦП ATmega16
Nafanja

Дата: Пятница, 28.01.2011, 00:16 | Сообщение # 81

Группа: Пользователи
Сообщений: 3
Статус: Offline
Здравствуйте. Нужна помощь. Не могу разобраться с АЦП.
Что бы не плодить тем, решил написать тут.

Что требуется? Нужно управлять 3мя насосами в зависимости от температуры с 3х источников.
Я вижу себе это так - взять 3 термо-резистора и пустить через них 5 В на з ножки АЦП.
В зависимости от сопротивления будет меняться напряжение, а от полученных данных и будет зависеть какой насос включать или выключать. Я только в первые начал изучать Си и микроконтроллеры. Задача вро де бы и не сложная, но у меня пока не получается.

Я себе вижу это так:
Например.

If (АЦП1>АЦП2 и АЦП1 > АЦП3) { выполняется действие 1, но с этим я уже разобрался }
Дальше
If(или лучше while) (АЦП2>АЦП1 и АЦП2>АЦП3) { выполняется действие 2 }
и т.д.
(АЦП1>АЦП2 и АЦП1 > АЦП3) - как правильно записать вот это выражение?
Или для этой задачи лучше использовать аналоговый компаратор?
Заранее благодарен за оказанную помощь.


[ (UA) ]

eugenemcu

Дата: Пятница, 28.01.2011, 11:55 | Сообщение # 82

Группа: Администраторы
Сообщений: 115
Статус: Offline
Здравствуйте.
Я бы использовал готовые датчики "температура-напряжение" типа TMP36 >> http://eugenemcu.ru/load/17-1-0-55.

Quote
(АЦП1>АЦП2 и АЦП1 > АЦП3) - как правильно записать вот это выражение?

Синтаксически такие выражения записываются так:
if ((ADC1 > ADC2)&&(ADC1 > ADC3)) – если ADC1 больше ADC2 и больше ADC3…

Какой закон включения насосов в зависимости от температуры датчиков? По максимальной температуре?


[ (RU) ]

Nafanja

Дата: Суббота, 29.01.2011, 20:01 | Сообщение # 83

Группа: Пользователи
Сообщений: 3
Статус: Offline
if((ADC & (1<<0)) > (ADC & (1<<1))) { // Если АЦП0 больше чем АЦП1 то светодиод мигает

PORTD |= _BV(PD1); // установить 1 на PD1

_delay_ms(50); //ждем 0.25 сек

PORTD &= ~_BV(PD1); // установить "0" на PD1

}
Вот так у меня работает и в программе виртуал студио показывает что все работает. Или может нужно вставить ADMUX ?

Спасибо за ответ. Но мне кажется что это как бы в принципе одно и тоже. С этого температурного датчика TMP36 на АЦП будет идти напряжение и его нужно будет сравнивать, или я не то что понял, поправьте меня пожалуйста.

if ((ADC1 > ADC2)&&(ADC1 > ADC3)) эта функция показывает что не корректна.
А может быть что в разных программах код воспринимается по разному?

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

БАНЯ. Для её обеспечения нужно тепло в парной, отопление, горячая вода.
Баня на дровах, в выхлопной трубе температура близко 400С!! Жалко такое добро пропадает.
Вот мы установили теплообменник, от него вода нагревается и обогревает баню(радиаторы). Когда баня нагревается, переключается насос и подается тепло на воду(помыться). И т.д. ЭКОНОМИЯ! потрясно.
Первое дело это котлы большой мощности, а от них уже все и пляшет. Это мне все нужно скомпанвать. В принципе что и сделали до меня. Но теперь все это хочется удешевить.

Добавлено (29.01.2011, 16:10)
---------------------------------------------
/*******************************************************
D0 - индикатор работы (светодиод)
D1 - насос 1
D2 - насос 2
D3 - насос 3
Задача:
Если (D1 > D2) - включаем первый насос. Если нет, то выключаем его
При этом ждем 5 сек что бы не было гидро удара.

Если (D1 > D3) - Включаем второй насос, Если нет, то выключаем.

Если (D1 < D2) и (D1 < D3) - Включаем третий насос, 1,2 - отключаем
Это условие имеет найвысший приоритет. Выполняется пока истинно.

********************************************************/

#define F_CPU 1000000UL // указываем частоту в герцах

#include <avr/io.h>
#include <util/delay.h>

int main(void) { // начало основной программы

ADEN; // использованеие АЦП

DDRD = 0xff; // все выводы порта D сконфигурировать как выходы

while(1) {

PORTD |= _BV(PD0); // установить "1" (высокий уровень) на выводе PD0,
_delay_ms(100); // ждем 1 сек.
PORTD &= ~_BV(PD0); // установить "0" (низкий уровень) на выводе PD0,
// подключить светодиод как индикатор работы системы

while ((ADMUX & (1<<1)) < (ADMUX & (1<<2)) && (ADMUX & (1<<1)) < (ADMUX & (1<<3))) {

PORTD |= _BV(PD1); // установить "1" (первый насос работает) на выводе PD1,
_delay_ms(500); // ждем 5 сек.
PORTD &= ~_BV(PD2); // установить "0" (низкий уровень) на выводе PD2,
PORTD &= ~_BV(PD3); // установить "0" (низкий уровень) на выводе PD3,
}

if ((ADMUX & (1<<1)) > (ADMUX & (1<<2))) {

PORTD |= _BV(PD1); // установить "1" (первый насос работает) на выводе PD1,
// Если нет, то выключить D1
_delay_ms(500); // ждем 5 сек.
PORTD &= ~_BV(PD1); // установить "0" (низкий уровень) на выводе PD1,
}

if ((ADMUX & (1<<1)) > (ADMUX & (1<<3))) {

PORTD |= _BV(PD2); // установить "1" (первый насос работает) на выводе PD2,
// Если нет, то выключить D2
_delay_ms(500); // ждем 5 сек.
PORTD &= ~_BV(PD2); // установить "0" (низкий уровень) на выводе PD2,
}

} // закрывающая скобка while

} // закрывающая скобка основной программы

Теперь скажите пожалуйста, если я ставлю так:

if ((ADMUX & (1<<1)) > (ADMUX & (1<<3))) {

PORTD |= _BV(PD2); // установить "1" (первый насос работает) на выводе PD2,
}
else { // Если нет, то выключить D2
_delay_ms(500); // ждем 5 сек.
PORTD &= ~_BV(PD2); // установить "0" (низкий уровень) на выводе PD2,
};

то когда проверяю в avr studio , ничего не происходит. ошибок не выдает, но результата нет. Если в место if поставить while , то работает, проверка идет, но мне так нельзя иначе будет выполнятся только одно действие, а мне нужно что бы бывало например 2 насоса работали одновременно.
Правильно ли я выражаю ножки АЦП? - нужно ADMUX или ADC

Добавлено (29.01.2011, 20:01)
---------------------------------------------
Ура!!!!
ДОПЁР!!!
Вычитал что лучше не делать паузы в прерываниях. Убрал Все заработало. Понял что правильно ADC


[ (UA) ]

eugenemcu

Дата: Воскресенье, 30.01.2011, 21:06 | Сообщение # 84

Группа: Администраторы
Сообщений: 115
Статус: Offline
Не очень понял некоторые Ваши мысли, но сам подход радует, сразу видно желание разобраться в сути присходящего.
Дело в том, что ADMUX это всего лишь регистр для выбора текущего канала АЦП. После выбора канала необходимо запустить преобразование и дождаться его завершения либо по флагу, либо по прерыванию. После чего результат измерения - два байта кода напряжения можно будет считать с регистров ADCL и ADCH.
Далее нужно выбирать канал следующего датчика ...

Кажется разумным такой общий алгоритм работы:
1. Выбор канала датчика 1, запуск измерения, присвоение результата измерения переменной TEMP1.
2. Выбор канала датчика 2, запуск измерения, присвоение результата измерения переменной TEMP2.
2. Выбор канала датчика 3, запуск измерения, присвоение результата измерения переменной TEMP3.
4. Поиск максимума по TEMP1, TEMP2 и TEMP3 и включение соответствующего управляющего выхода (если я верно понял алгоритм).
5. Пауза произвольной длительности.
6. Переход на п. 1.

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

Code
ADCSRA|= (1<<ADEN);
ADCSRA|= (1<<ADEN)|(1<<ADPS0)|(1<<ADPS2);       // Разрешить ADC, однократный режим, 125 kHz.
ADMUX |= (1<<REFS0)|(1<<REFS1);                 // Внутренний ИОН.    

Выбор нужного канала АЦП осуществляется так:
Code
ADMUX=(ADMUX&0xF0)|Chanal;                   // Выбрать канал датчика температуры.
где Chanal - номер канала. В вашем случае например 0, 1, и 2.

Запускать процесс измерения на выбранном канале в режиме однократных выборок нужно так:

Code
ADCSRA|= (1<<ADSC);                     // Запустить измерение.

Ожидать завершения измерения можно по флагу:

Code
while (!(ADCSRA&(1<<ADIF))) {}          // Ждать завершения измерения.

Подробнее о работе АЦП в ATmega скачайте книгу Евстифеев А. В. "Микроконтроллеры AVR семейств Tiny и Mega" и читайте, начиная со страницы 130.

Отлаживать такую программу без просмотра результатов измерений АЦП очень непросто. Поэтому нужно организовать вывод выходного кода АЦП, хотя бы через UART, для контроля по COM-порту ПК и начать с измерения напряжения по одному из каналов на движке переменного резистора, подключенного к питанию.
То есть я бы рекомендовал Вам пока что ограничится решением более простой локальной задачи - измерением произвольного напряжения. Короче говоря, двигаться от простого к сложному.


[ (RU) ]

Nafanja

Дата: Понедельник, 31.01.2011, 14:53 | Сообщение # 85

Группа: Пользователи
Сообщений: 3
Статус: Offline
ОГО! Огромное спасибо за такой разжеванный ответ.
А я уже думал что почти все сделал В AVR студио вроде бы как бы работало... Не все так просто оказывается.
Будем учить и разбираться.



[ (UA) ]

vladics

Дата: Вторник, 19.04.2011, 04:02 | Сообщение # 86

Группа: Пользователи
Сообщений: 3
Статус: Offline
Здравствуйте.
Прошу помощи знающих людей в измерительной технике. Создаю некий измеритель, который должен мерить параметры ВИП постоянного напряжения, такие как:
1. Напряжение ИП;
2. Коэффициент пульсаций, путем измерения микровольт переменного напряжения и вольт постоянного, ну и в последствии деление первого на второе;
3. Коэффициент стабилизации, измерять собираюсь путем измерения значений напряжения на входе и выходе, запоминать их, затем происходит переключение ключа(авто или кнопкой) с делителем, находящимся до ИП, снова измерение значений, ну и не хитрые арифметические операции: дельта входа/вход без делителя делим на дельта выхода/выход без делителя.
Все, это и должен измерять мой прибор.
По совету начал разбираться в МК серии Atmega8. Создал небольшую схемку, не знаю еще как реализовать просадку напряжения 220, подаваемое на ИП, как это будет отслеживать МК, прошу посмотреть, дать советы. Слева внизу моей схемы взята отсюда: http://madelectronics.ru/gadget/302/10.43.htm Но думаю еще как-нибудь вытащить переменное напряжение из постоянного.

princ.rar(9Kb)

[ (RU) ]

eugenemcu

Дата: Вторник, 19.04.2011, 09:56 | Сообщение # 87

Группа: Администраторы
Сообщений: 115
Статус: Offline
Здравствуйте.
Думается проще всего завести измеряемое напряжение через точный резистивный делитель на вход АЦП. Какое-то время записывать выборки и потом обрабатывать, выделять постоянную составляющую, переменную, интегралом от сих до сих и т. п… в общем придётся учить вышку
А зачем Вам такая машинка, если не секрет?



[ (RU) ]

vladics

Дата: Вторник, 19.04.2011, 13:54 | Сообщение # 88

Группа: Пользователи
Сообщений: 3
Статус: Offline
Это мой проект по учебе=)
Решил реализовать систему так:
на 13 ноге снимается вых. напряжение ИП.
на 12 ноге (выпрямитель переменную составляющую выпрямляет и дает амплитудное значение, ну и инвертор после надо поставить), но думаю надо перед ОР1 поставить RC цепь, чтобы выделить переменную и убрать постоянную.
на 11 ноге меряю вход. напряжение к ИП, может поставить трансф. или диодный мост? Мне также нужно имитировать просадку напряжения, т.е. к ИП должен через свой измеритель подать, к примеру, 190-200В, замерить вых. напряжение(убедиться в падении вых. напряж., в общем посчитать в итоге коэф. стабил.).
Предполагаю, что на экране сделаю 2 режима, в одном пульсации и вых. напряжение, во втором стабилизация(ну и можно тоже вых. напряжение), не ограничен.



[ (RU) ]

eugenemcu

Дата: Вторник, 19.04.2011, 14:02 | Сообщение # 89

Группа: Администраторы
Сообщений: 115
Статус: Offline
Я бы так не заморачивался. Оцифровал бы конечное напряжение, дальше математически выделил в нём все составляющие, в том числе 100-герцовые пульсации это не должно составить особого труда. Хотя сам конкретно такую задачу не решал и с ЦОС мало знаком.


[ (RU) ]

vladics

Дата: Вторник, 19.04.2011, 17:54 | Сообщение # 90

Группа: Пользователи
Сообщений: 3
Статус: Offline
Не выйдет, 1024 уровня слишком мало для измерения десятков вольт и единиц милливольт. Поправил немного схемку.
3722496.rar(11Kb)

[ (RU) ]

Форум » Основной раздел » Разработка: программирование, схемотехника. » АЦП ATmega16 (Учебная программа - вольтметр на ATmega16)
Страница 9 из 11«127891011»
Поиск: