Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: INT0 в ATMega8
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
hd44780
По задумке надо мерить этим МК угол сдвига фаз между напряжением и током.
Мега пока работает от внутреннего генератора 8МГц. В будущем, м.б. припаяю кварц на 16МГц. Индикация пока на LCD HD44780, это отладка, в конечном устройстве измеренные частота и угол сдвига фаз должны передаваться в другой МК.

Входной каскад схемы обеспечивает обычные 50Гц синусоиды напряжения и тока, поднятые на 2.5в. Обе синусоиды родом из розетки, токовая синусоида снимается с токового транса с шунтом. Типовая схема короче. Плюс стандартная защита от перенапряжения, чтобы все синусоиды всегда лежали в диапазоне 0..+5в.
Сигнал по напряжению подан на вход внутреннего компаратора меги, сигнал по току на внешний компаратор К554СА3 с типовой обвязкой. Минусовые входы обоих компараторов на средней точке +2.5в. Выход компаратора подключен к INT0 контроллера.
Канал напряжения работает нормально - частота (по прерыванию компаратора) меряется вполне адекватно, слегка гуляет, но, думается, это из-за нестабильностей основного генератора.

С внешним компаратором дело гораздо хуже sad.gif . Сам по себе он работает - на осциллографе вижу чёткие прямоугольные импульсы 50 Гц.

В прошивке написал:

CODE

volatile dword ms1;
// External Interrupt 0 service routine
// Rising edge (0->1) - начало положительной полуволны тока
interrupt [EXT_INT0] void ext_int0_isr(void)
{
ms1++;
} // ext_int0_isr

...........
//////////////
// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=Out Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=0 State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x08;

// Инициализация INT0
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Rising Edge
// INT1: Off
GICR|=0x40; // INT0 enable
MCUCR=0x03; // ISC01..00 = 11 - rising edge INT0
GIFR=0x40; // сброс INT0


В главном цикле переменная ms1 просто печатается на дисплей.

Кроме INT0 есть ещё прерывание TC0 с частотой 1 кГц - считает миллисекунды и секунды. Там работает нормально.
Казалось бы, я должен на дисплее увидеть число, увеличивающееся на 50 каждую секунду, но там творится что-то ужасное. Этот ms1 меняется так, как будто там не 50 Гц, а что-то типа 1..10 кГц blink.gif
Я сперва нагрузил в этот INT0 полный алгоритм, так проц вообще почти завис ....

Когда я снимаю нагрузку с ТТ, на выходе компаратора ноль, но число продолжает расти. Только с немного меньшей скоростью (на глаз).
Кто-нибудь знает что это за фигня такая?

С внешними прерываниями я раньше работал всего один раз, делал связку ATMega32+PDIUSBD12D (USB контроллер). PDI-шка висела на INT0. Девайс ожил почти сразу и работал без проблем rolleyes.gif ...
Только там, помнится прерывание было по лог. 1 на входе, а тут по переднему фронту (0->1).

Ради эксперимента завёл тот же токовый сигнал на внутренний компаратор - работает как часы...
Спасибо.

PS. Опять у меня кнопка CODEBOX не фурычит angry.gif ....
smk
Таймер в 1 кГц у Вас откушает прилично ресурсов процессорного времени. Помимо обработки самого прерывания нужно еще войти в него и выйти. Число тактов на вход/выход потребуется не так чтоб мало (десятки). Померяйте в симуляторе для ясности. Возможно процессор толком из прерывания таймера не вылазит.
hd44780
ТС0 сейчас такой:

CODE

// Timer 0 overflow interrupt service routine
// Ft = 1kHz, 1 ms
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Reinitialize Timer 0 value
TCNT0=0x83;
// Place your code here
ms ++;
if ((ms%1000)==0)
{
sec ++;
LED1=~LED1;
} // if
} // timer0_ovf_isr


Могу легко сократить до

CODE

TCNT0=0x83;
// Place your code here
ms ++;


Секунды и светодиод там просто для диагностики.
Но что-то сомневаюсь, что это что-то даст. Если бы он не успевал их выполнять, он бы начал бы тормозить (я такое уже видел). Но он не тормозит ....

Да и в главном проце, Mega16 @ 8 MHz, такой же 1 кГц таймер опрашивает 3 канала АЦП (в режиме опроса), обсчитывает результаты и не глючит при этом....
Или у M8 и M16 разные ядра?
Navovvol
как правило приоритет у INT0 выше чем у таймеров (идет в таблице векторов сразу после резета), поэтому при полной нагрузке программа зависает в циклах INT0, т.е. пока идет обработка прерывания оно срабатывает еще раз и по выходу опять уходит по вектору в INT0.
Надо исключить дребезг, проверить не изменяется ли состояние пина INT0 в коде после разрешения соответствующего прерывания. Если я ничего не путаю, то прерывание будет работать даже если пин настроить на выход. (или это было в другом контроллере, не помню... ХД )
hd44780
Настройку пинов делал генератор проекта CvAVR. Я её всего лишь прокомментировал дополнительно.
Палыч
Цитата(hd44780 @ Dec 14 2011, 11:22) *
Этот ms1 меняется так, как будто там не 50 Гц, а что-то типа 1..10 кГц

Внимательно рассмотрите восходящий фронт импульса от компаратора. Возможно, из-за наведенных помех на выходе компоратора - пачка импульсов при смене его (компаратора) выхода...
hd44780
Цитата(Палыч @ Dec 14 2011, 14:00) *
Возможно, из-за наведенных помех на выходе компоратора - пачка импульсов при смене его (компаратора) выхода...


Хрен его знает biggrin.gif . Вчера глядел - вроде чистые.
Вечером ещё гляну.
xemul
С каким разрешением Вы предполагаете получать разность фаз? Может INT не нужны как класс?
(ms%1000) в прерывании контроллера без аппаратного деления ...
hd44780
Цитата(xemul @ Dec 14 2011, 15:04) *
С каким разрешением Вы предполагаете получать разность фаз? Может INT не нужны как класс?

Хотел где-то пол градуса.
Для этого там ещё TC2 будет, считающий 10 мкс единицы. Бумажку с расчётами дома забыл ....
Туманно помнится, там вроде мин частота отсчётов д.б. около 20 кГц, чтобы дать такую точность ...

Планировал так делать:
1. Приходит полож. полуволна напряжения - INT внутреннего компаратора включает INT0, TC2.
2. Приходит полож. полуволна тока - INT0 вырубает себя, TC2, фиксирует интервал в этих 10 мкс единицах. И суммирует эти интервалы.
3. По получении 25 периодов (0.5 сек) я считаю средний интервал и пересчитываю его в градусы. Пересчёт такой:
// Рассчитать среднее время
frequency=locMdata.totalTimeSize;
frequency/=locMdata.count;

// Пересчёт времени в угол
temp=frequency*360.0;
temp/=2000.0;

Эти формулы непроверены, могут быть ошибки.
Я ещё до этого этапа не добрался из-за этих диких глюков с INT0 angry.gif .
Как тут от INT0 отказаться? зафуговать проверку пина в прерывание TC2?

Мож в чём ошибся..

Цитата(xemul @ Dec 14 2011, 15:04) *
(ms%1000) в прерывании контроллера без аппаратного деления ...

Да я его уберу это для отладки делалось.
xemul
Цитата(hd44780 @ Dec 14 2011, 17:11) *
Хотел где-то пол градуса.
Для этого там ещё TC2 будет, считающий 10 мкс единицы. Бумажку с расчётами дома забыл ....
Туманно помнится, там вроде мин частота отсчётов д.б. около 20 кГц, чтобы дать такую точность ...

При 50 Гц углу 0.5 градуса соответствует интервал 0.5/360/50 = 27.8 мкс.
Цитата
Как тут от INT0 отказаться? зафуговать проверку пина в прерывание TC2?

Не, с таким разрешением, если в лоб, из прерывания TC2 вылезать не будете. И на % времени не останется.sm.gif
Самый простой вариант - формировать импульс разности фаз снаружи (один элемент XOR) и измерять его длительность.
Цитата
Да я его уберу это для отладки делалось.

имхо, конечно, но такой отладкой можно всю логику программы в корзину отправить.
hd44780
Цитата(xemul @ Dec 14 2011, 17:05) *
Самый простой вариант - формировать импульс разности фаз снаружи (один элемент XOR) и измерять его длительность.

Ага. И второй внешний компаратор тоже rolleyes.gif ....
domowoj
Цитата(xemul @ Dec 14 2011, 19:04) *
С каким разрешением Вы предполагаете получать разность фаз? Может INT не нужны как класс?

Конечно, ICP то вам на что?
Возьмите два СА3, на один сигнал напряжения, на другой - токовый,
аппаратно "XOR_те" их и на вход ICP.
hd44780
Гадский папа ©....
Компаратор то есть. Потыкал осциллом в него ... Когда на ТТ нет нагрузки, на плюсовом входе его появляется средняя точка через резистор защиты 8 кил. На выходе компаратора "осциллографируется" дикий мусор. Осцилл пытается частоту по ходу мерить ... Показывает 100 Гц, хотя там бред откровенный.
Закоротил пинцетом плюсовой вход на минусовой, на выходе нарисовался ноль и счётчик мгновенно остановился.

Хоть XORь его, хоть на INT вешай - какой хрен разница ....

И шо мне с этим делать? менять компаратор? На что? хрень ...
domowoj
Цитата(hd44780 @ Dec 15 2011, 01:16) *
И шо мне с этим делать? менять компаратор? На что? хрень ...

Ввести гистерезис, СА3 без него практически применить трудно.
Его преимущество - очень высокая чувствительность,
а оно вам надо?

hd44780
Цитата(domowoj @ Dec 14 2011, 22:35) *
а оно вам надо?


Да может и не надо .... Мне надо просто получить нормальный импульс в начале положительной полуволны тока.

Тема плавно перешла в аспект аналоговой техники, поэтому, написал здесь - http://electronix.ru/forum/index.php?showtopic=97566
_Pasha
Цитата(hd44780 @ Dec 14 2011, 22:16) *
Гадский папа ©....
Компаратор то есть. Потыкал осциллом в него ... Когда на ТТ нет нагрузки, на плюсовом входе его появляется средняя точка через резистор защиты 8 кил.

Многовато. Вообще, кусок схемы от ТТ до компаратора не помешал бы. Но проще гистерезис ввести и не мучаться.
hd44780
Цитата(_Pasha @ Dec 15 2011, 12:10) *
кусок схемы от ТТ до компаратора не помешал бы.

Ловите.
Минусовые входы компараторов - точка А, сигнал с Т1 - внутренний компаратор меги, сигнал с R7 на СА3.

Цитата(_Pasha @ Dec 15 2011, 12:10) *
проще гистерезис ввести и не мучаться.


Набросайте плиз. Что, куда ....

Вот нашёл - рис 2. Что-то такое?
ae_
Цитата(hd44780 @ Dec 15 2011, 20:22) *
Ловите.

Так у Вас DA1.1 включён не компаратором, а повторителем, КУ=1 (выход соединён с инвертирующим входом)
На выходе DA1.1 будет напряжение почти равное напряжению на движке R3 и не зависящее от тока нагрузки
Вторичная обмотка Т2 подключена к ВЫХОДУ DA1.1, а не ко входу
Напряжение на левом выводе R7 равно сумме напряжения на движке R3(DC) и сигналу с вторичной обмотки Т2(AC)
Напряжение на нижнем выводе R6 примерно равно напряжению на движке R3 и не зависит от тока нагрузки.
xemul
Цитата(ae_ @ Dec 15 2011, 16:07) *
Так у Вас DA1.1 включён не компаратором, а повторителем

Это смещение измеряемых сигналов на пол-шкалы АЦП.
hd44780
DA1.1 - средняя точка.
Компараторы я ещё там не нарисовал ....
ae_
Цитата(hd44780 @ Dec 15 2011, 21:21) *
DA1.1 - средняя точка.
Компараторы я ещё там не нарисовал ....

Вы же ответили на:
Цитата(_Pasha @ Dec 15 2011, 12:10) - "кусок схемы от ТТ до компаратора не помешал бы."
HD44780 - "Ловите."
Я отметил, что это - не компаратор.
И действительно, Вы его ещё не нарисовали. Просим.
hd44780
Цитата(ae_ @ Dec 15 2011, 14:35) *
Просим.


Пожалуйста.
ILYAUL
К155ТЛ2 , если есть возможность добавить корпус перед INT0, но наверно придётся учитывать задержку прохождения или ставить быстрый очена 74HCTXXX
ae_
Цитата(hd44780 @ Dec 15 2011, 22:31) *
Пожалуйста.

Можно добавить гистерезис, как советовали выше:
Нажмите для просмотра прикрепленного файла
domowoj
Гистерезис будет работать если буферезировать сигнал "напряжение" с помощью второй оставшейся ЛМ358.
hd44780
Да, спасибо.

Я вчера так и сделал. Резистор 1М помог.
А зачем верхний на 1 кил? и без него вроде работает...

Цитата(domowoj @ Dec 16 2011, 08:53) *
Гистерезис будет работать если буферезировать сигнал "напряжение" с помощью второй оставшейся ЛМ358.


Через повторитель что-ли?
Сергей Борщ
QUOTE (hd44780 @ Dec 16 2011, 08:58) *
А зачем верхний на 1 кил? и без него вроде работает...
Мягко говоря - потому что обратная связь должна оказывать воздействие на вход компаратора, а не пытаться сдвинуть источник сигнала.
hd44780
Спасибо. Добавлю резистор.
Мне его не жалко, просто интересно. Не люблю тупо повторять схемы, не поняв, хоть примерно, как оно работает ...
domowoj
Цитата(hd44780 @ Dec 16 2011, 13:58) *
Через повторитель что-ли?

конечно, вы проследите, как пройдет сигнал по резисторам гистерезиса,
он зависит от положения движка R2
hd44780
1 кил припаял. Повторитель пока не делал.
Но есть проблема - без нагрузки ТТ на выходе наблюдаются некие выбросы примерно раз в секунду. sad.gif
domowoj
А без нагрузки его разве можно использовать,
идеал для ТТ - КЗ
hd44780
Не, шунт и пр. там есть.
Я имел в виду, что ток в его первичке отсутствует. I1=0; Uш=0в.

А выбросы на выходе компаратора.
ILYAUL
Посмотрите рекомендции на стр. 53-55 .
hd44780
Заменил 1М в обр. связи на резистор порядка 800 кил (спаял последовательно 2 резистора) - работает нормально.
На мелкие нагрузки типа зарядок для мобил (4-5 ВА) он не реагирует, но это мелочи...
На паяльник 25 W уже реагирует.
hd44780
Очередная хрень вылезла ... Ставящая под угрозу всю эту идею со 2-м контроллером.

Нагрузка отключена. На выходе ТТ полный ноль.
При подключении компаратора в точке R7-VD3-VD4 вижу "лишние" 0.02в. Из-за чего основной контроллер показывает какой-то "левый" ток порядка 105-110 мА.
Пытался поставить перед компаратором повторитель на ОУ - безрезультатно. "Левый" ток понизился до 60-65 мА.
pavel-pervomaysk
Компаратор попробуй сменить на LM311, буфер DA1.2 в схемен не нужен.
hd44780
Спасибо, попробую. Когда найду его ...
pavel-pervomaysk
Транзисторы советские не отличаются хорошим открыванием.
ae_
Цитата(hd44780 @ Dec 19 2011, 19:31) *
Нагрузка отключена. На выходе ТТ полный ноль.
При подключении компаратора в точке R7-VD3-VD4 вижу "лишние" 0.02в.

20мВ относительно точки "А" ? Т.е. прямо на R7 появляется 20мВ при подключении компаратора и пропадает при его отключении?
Это вполне может быть из-за R14, но DA1.2 должен устранять эту зависимость.
DA1.2 обязательно нужен, без него так и должно быть.
hd44780
Цитата(ae_ @ Dec 20 2011, 08:41) *
20мВ относительно точки "А" ? Т.е. прямо на R7 появляется 20мВ при подключении компаратора и пропадает при его отключении?

Да. Так. Смотрел мультиметром-осциллографом UT-81B. Он до 3-х знаков показывает. Не знаю, действительно ли он такой точный, но его показания вполне соотносятся с тем, что показывает контроллер. По крайней мере, "прирост" напряжения на входе они показывают идентичный практически ...
Только мерял относительно земли схемы. Относительно А не смотрел - отшибло biggrin.gif .

Буфер перед компаратором пока убирать не буду, потом гляну.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.