|
INT0 в ATMega8, Бред или фантастика ... Или кривые руки |
|
|
|
Dec 14 2011, 07:22
|

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

|
По задумке надо мерить этим МК угол сдвига фаз между напряжением и током. Мега пока работает от внутреннего генератора 8МГц. В будущем, м.б. припаяю кварц на 16МГц. Индикация пока на LCD HD44780, это отладка, в конечном устройстве измеренные частота и угол сдвига фаз должны передаваться в другой МК. Входной каскад схемы обеспечивает обычные 50Гц синусоиды напряжения и тока, поднятые на 2.5в. Обе синусоиды родом из розетки, токовая синусоида снимается с токового транса с шунтом. Типовая схема короче. Плюс стандартная защита от перенапряжения, чтобы все синусоиды всегда лежали в диапазоне 0..+5в. Сигнал по напряжению подан на вход внутреннего компаратора меги, сигнал по току на внешний компаратор К554СА3 с типовой обвязкой. Минусовые входы обоих компараторов на средней точке +2.5в. Выход компаратора подключен к INT0 контроллера. Канал напряжения работает нормально - частота (по прерыванию компаратора) меряется вполне адекватно, слегка гуляет, но, думается, это из-за нестабильностей основного генератора. С внешним компаратором дело гораздо хуже  . Сам по себе он работает - на осциллографе вижу чёткие прямоугольные импульсы 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 кГц  Я сперва нагрузил в этот INT0 полный алгоритм, так проц вообще почти завис .... Когда я снимаю нагрузку с ТТ, на выходе компаратора ноль, но число продолжает расти. Только с немного меньшей скоростью (на глаз). Кто-нибудь знает что это за фигня такая? С внешними прерываниями я раньше работал всего один раз, делал связку ATMega32+PDIUSBD12D (USB контроллер). PDI-шка висела на INT0. Девайс ожил почти сразу и работал без проблем  ... Только там, помнится прерывание было по лог. 1 на входе, а тут по переднему фронту (0->1). Ради эксперимента завёл тот же токовый сигнал на внутренний компаратор - работает как часы... Спасибо. PS. Опять у меня кнопка CODEBOX не фурычит  ....
Сообщение отредактировал hd44780 - Dec 14 2011, 08:21
--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса. (с) Мария Эдуарда
|
|
|
|
|
Dec 14 2011, 07:57
|

Профессионал
    
Группа: Свой
Сообщений: 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
--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса. (с) Мария Эдуарда
|
|
|
|
|
Dec 14 2011, 11:22
|

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

|
Цитата(Палыч @ Dec 14 2011, 14:00)  Возможно, из-за наведенных помех на выходе компоратора - пачка импульсов при смене его (компаратора) выхода... Хрен его знает  . Вчера глядел - вроде чистые. Вечером ещё гляну.
--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса. (с) Мария Эдуарда
|
|
|
|
|
Dec 14 2011, 13:11
|

Профессионал
    
Группа: Свой
Сообщений: 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  . Как тут от INT0 отказаться? зафуговать проверку пина в прерывание TC2? Мож в чём ошибся.. Цитата(xemul @ Dec 14 2011, 15:04)  (ms%1000) в прерывании контроллера без аппаратного деления ... Да я его уберу это для отладки делалось.
Сообщение отредактировал hd44780 - Dec 14 2011, 13:28
--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса. (с) Мария Эдуарда
|
|
|
|
|
Dec 14 2011, 14:05
|
    
Группа: Свой
Сообщений: 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 вылезать не будете. И на % времени не останется.  Самый простой вариант - формировать импульс разности фаз снаружи (один элемент XOR) и измерять его длительность. Цитата Да я его уберу это для отладки делалось. имхо, конечно, но такой отладкой можно всю логику программы в корзину отправить.
|
|
|
|
|
Dec 14 2011, 16:58
|

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

|
Цитата(xemul @ Dec 14 2011, 19:04)  С каким разрешением Вы предполагаете получать разность фаз? Может INT не нужны как класс? Конечно, ICP то вам на что? Возьмите два СА3, на один сигнал напряжения, на другой - токовый, аппаратно "XOR_те" их и на вход ICP.
--------------------
И на камнях растут деревья!
|
|
|
|
|
Dec 14 2011, 19:35
|

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

|
Цитата(hd44780 @ Dec 15 2011, 01:16)  И шо мне с этим делать? менять компаратор? На что? хрень ... Ввести гистерезис, СА3 без него практически применить трудно. Его преимущество - очень высокая чувствительность, а оно вам надо?
--------------------
И на камнях растут деревья!
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|