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

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> INT0 в ATMega8, Бред или фантастика ... Или кривые руки
hd44780
сообщение Dec 14 2011, 07:22
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980



По задумке надо мерить этим МК угол сдвига фаз между напряжением и током.
Мега пока работает от внутреннего генератора 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 ....

Сообщение отредактировал hd44780 - Dec 14 2011, 08:21


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
smk
сообщение Dec 14 2011, 07:30
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Таймер в 1 кГц у Вас откушает прилично ресурсов процессорного времени. Помимо обработки самого прерывания нужно еще войти в него и выйти. Число тактов на вход/выход потребуется не так чтоб мало (десятки). Померяйте в симуляторе для ясности. Возможно процессор толком из прерывания таймера не вылазит.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
hd44780
сообщение Dec 14 2011, 07:57
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980



ТС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 разные ядра?

Сообщение отредактировал hd44780 - Dec 14 2011, 08:22


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
Navovvol
сообщение Dec 14 2011, 09:38
Сообщение #4


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

Группа: Участник
Сообщений: 105
Регистрация: 9-09-11
Пользователь №: 67 080



как правило приоритет у INT0 выше чем у таймеров (идет в таблице векторов сразу после резета), поэтому при полной нагрузке программа зависает в циклах INT0, т.е. пока идет обработка прерывания оно срабатывает еще раз и по выходу опять уходит по вектору в INT0.
Надо исключить дребезг, проверить не изменяется ли состояние пина INT0 в коде после разрешения соответствующего прерывания. Если я ничего не путаю, то прерывание будет работать даже если пин настроить на выход. (или это было в другом контроллере, не помню... ХД )
Go to the top of the page
 
+Quote Post
hd44780
сообщение Dec 14 2011, 10:27
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980



Настройку пинов делал генератор проекта CvAVR. Я её всего лишь прокомментировал дополнительно.


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
Палыч
сообщение Dec 14 2011, 11:00
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(hd44780 @ Dec 14 2011, 11:22) *
Этот ms1 меняется так, как будто там не 50 Гц, а что-то типа 1..10 кГц

Внимательно рассмотрите восходящий фронт импульса от компаратора. Возможно, из-за наведенных помех на выходе компоратора - пачка импульсов при смене его (компаратора) выхода...
Go to the top of the page
 
+Quote Post
hd44780
сообщение Dec 14 2011, 11:22
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980



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


Хрен его знает biggrin.gif . Вчера глядел - вроде чистые.
Вечером ещё гляну.


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
xemul
сообщение Dec 14 2011, 12:04
Сообщение #8



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



С каким разрешением Вы предполагаете получать разность фаз? Может INT не нужны как класс?
(ms%1000) в прерывании контроллера без аппаратного деления ...
Go to the top of the page
 
+Quote Post
hd44780
сообщение Dec 14 2011, 13:11
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980



Цитата(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) в прерывании контроллера без аппаратного деления ...

Да я его уберу это для отладки делалось.

Сообщение отредактировал hd44780 - Dec 14 2011, 13:28


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
xemul
сообщение Dec 14 2011, 14:05
Сообщение #10



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



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

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

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

имхо, конечно, но такой отладкой можно всю логику программы в корзину отправить.
Go to the top of the page
 
+Quote Post
hd44780
сообщение Dec 14 2011, 14:28
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980



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

Ага. И второй внешний компаратор тоже rolleyes.gif ....


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
domowoj
сообщение Dec 14 2011, 16:58
Сообщение #12


Профессионал
*****

Группа: Участник
Сообщений: 1 548
Регистрация: 20-12-07
Из: г.Новосибирск
Пользователь №: 33 486



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

Конечно, ICP то вам на что?
Возьмите два СА3, на один сигнал напряжения, на другой - токовый,
аппаратно "XOR_те" их и на вход ICP.


--------------------
И на камнях растут деревья!
Go to the top of the page
 
+Quote Post
hd44780
сообщение Dec 14 2011, 18:16
Сообщение #13


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980



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

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

И шо мне с этим делать? менять компаратор? На что? хрень ...

Сообщение отредактировал hd44780 - Dec 14 2011, 18:17


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
domowoj
сообщение Dec 14 2011, 19:35
Сообщение #14


Профессионал
*****

Группа: Участник
Сообщений: 1 548
Регистрация: 20-12-07
Из: г.Новосибирск
Пользователь №: 33 486



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

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



--------------------
И на камнях растут деревья!
Go to the top of the page
 
+Quote Post
hd44780
сообщение Dec 15 2011, 07:48
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980



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


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

Тема плавно перешла в аспект аналоговой техники, поэтому, написал здесь - http://electronix.ru/forum/index.php?showtopic=97566


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post

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

 


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


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