ARV: мысли вслух

Флейм в чистом виде - все что угодно...
Но - в рамках закона :)
Ответить
Мудрый кот
Сообщения: 1759
Зарегистрирован: Пт июн 01, 2018 07:28:45

Сообщение parovoZZ »

Запускал я АЦП от таймера на Attiny. Не помню, чтобы упирался во что-то магическое, не описанное в даташите. Надо будет покопаться в исходниках - посмотреть инициализацию. Самому даже интересно стало.
Реклама
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

ARV,
TOV1 is automatically cleared when the Timer/Counter1 Overflow Interrupt Vector is executed
Вы включили прерывание. Компилятор всегда делает заглушку с RETI емнип в векторах, даже не объявленных в коде. В любом случае переход по вектору происходит, и железо сбрасывает TOV1.
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

NStorm писал(а):Вы включили прерывание.
пора в управдомы :((( действительно, ничего удивительного. вот что значит заниматься раз в неделю по 30 минут после трудового дня...

Добавлено after 2 minutes 45 seconds:
самое-то смешное, что на самом деле обработчик прерывания по переполнению таймера есть в коде, просто я его не включал флагом этим самым для целей отладки. и ведь после того, как "АЦП заработал" у меня перестала работать индикация, потому что обработчик прерывания её портил - и ни на что не натолкнуло это меня! точно - в управдомы!

Добавлено after 8 minutes 30 seconds:
параллельно и с кнопками беда... тоже наверняка будет что-то позорно-элементраное, но пока не могу понять, в чем беда.

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

Код: Выделить всё

event_t get_event(void){

	uint8_t btn = buttons;

	static event_t prev = EVENT_EMPTY;
	static uint16_t cnt;
	event_t tmp;

	if(btn == 0){
		// ничего не нажато
		if(prev != EVENT_EMPTY){
			// уточняем, сколько времени прошло с предыдущего нажатия
			if((get_ticks() - cnt) > RESET_MODE_TIME){
				// если больше заданного - возвращаем событие сброса режима
				prev = EVENT_EMPTY;
				return EVENT_RESET_MODE;
			}
		}
		// возвращаем предыдущее событие
		tmp = prev;
		prev = EVENT_EMPTY;
		return tmp;
	} else {
		// что-то нажато, разбираем кнопки по событиям
		switch(btn){
		case BTN_PLUS:	tmp = EVENT_UP; break;
		case BTN_MINUS:	tmp = EVENT_DN; break;
		case BTN_ENTER: tmp = EVENT_ENTER; break;
		case BTN_PLUS | BTN_MINUS:	tmp = EVENT_UPDN; break;
		}
	}
	// проверка долгое/короткое нажатие
	if(tmp == prev){
		// нажато то же самое, что и в прошлый раз
		if((get_ticks() - cnt) > LONG_PRESS_TIME){
			// если время удержания больше заданного, ставим флаг долгого события
			tmp |= EV_LONG;
			return tmp;
		}
	} else {
		// нажато что-то другое, чем в прошлый раз
		cnt = get_ticks(); // фиксируем момент нажатия
		prev = tmp; // запоминаем, что нажали
	}
	return EVENT_EMPTY;
}
buttons (это отдельная volatile-переменная uint8_t) в прерывании таймера каждые 63 мс устанавливается по состоянию пинов на порте, get_ticks() - функция, аналогичная millis() в ардуине, выдает значение счетчика, который тикает с какой-то частотой (не принципиально), остальное должно быть понятно по коду и комментам.

так вот: нажимаю кнопку - ШИМ зашкаливает на максимальное заполнение. отпускаю - возвращается к тому, что было надо (АЦП отрабатывает регулирование). какая связь между кнопками и работой регулятора - не могу понять.

регулятор сейчас такой, примитивный:

Код: Выделить всё

ISR(ADC_vect, ISR_NOBLOCK){
	bool low_power;
	static bool batt_chk;
	static uint8_t ocr;
    int16_t delta;

	// TODO управление флагом нужно только при отладке
	TIFR1 = _BV(TOV1);//TIMSK1 = _BV(TOIE1);

    	// когда измеряем напряжение преобразователя
	delta = (UADC - ADC);
	// реализуем что-то типа пропорционального регулятора

	// TODO это как-то влияет?
	//if(delta <= 0) TCCR1C = _BV(FOC1A);

	low_power = delta > OCRMAX;

	if(low_power){
		// ограничиваем по верхнему значению скважности
		ocr = OCRMAX;
		TCCR1A = TIMER_OC_CLEAR(1A) | _BV(WGM10);
	} else if(delta < OCRMIN) {
		// ноль на выходе PWM создаем "вручную"
		TCCR1A = 0;
		PORTB &= ~PWM_PIN;
		ocr = OCRMIN;
	} else {
		// в остальных случаях "регулируем"
		ocr = delta/2;
		TCCR1A = TIMER_OC_CLEAR(1A) | _BV(WGM10);
	}
	OCR1AL = ocr;
}
UADC - константа, определяющая заданное выходное напряжение, которое ШИМ формирует (step-up).
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

Прерывания PCINTx, INTx отключены? Если у вектора АЦП убрать ISR_NOBLOCK эффект сохраняется? Временно если попробовать убрать low_power проверку - уйдет эффект? Т.е. прыгает скважность как будто low_power становится true?
Реклама
Эиком - электронные компоненты и радиодетали
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

в порядке лирического отступления нарисовалась мысль, что применение SMD в любительской практике сопровождается колоссальными расходами... вроде кажется, что все просто, ан нет: без паяльной станции с феном уже не очень-то и попаяешь, точнее, не распаяешь запаянное, если у него больше 3 ног... да и двумя ножками перепайка SMD-дросселя серии SPRH одним-единственным паяльником малой мощности (т.е. тем же, что и для 0805) превращается в проблему...
Изображение

Добавлено after 2 minutes 25 seconds:
NStorm писал(а):Прерывания PCINTx, INTx отключены?
да
NStorm писал(а):убрать ISR_NOBLOCK
ничего не меняется
NStorm писал(а):убрать low_power проверку - уйдет эффект?
не проверял, но убирать нельзя, начнет скакать ШИМ из-за переполнения
NStorm писал(а):как будто low_power становится true?
ну типа того. проблема-то в том, что это проявляется лишь при нажатии любой кнопки! ищу связь...

Добавлено after 10 minutes 36 seconds:
а вот еще интересный вопрос, практическое (т.е. экспериментальное) решение которого оставляю на будущее: имеет ли смысл применение "разрядного" транзистора в этой схеме?
Изображение
управление на затвор с выхода AVR, т.е. 5В, не более.
посмотрел на осциллографе - задний фронт не такой уж и крутой, на глазок - больше сотни микросекунд... ощущение такое, что не работает этот разрядный транзистор VT16 (IRLML6402).
Вложения
й1.PNG
(9.89 КБ) 537 скачиваний
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Мудрый кот
Сообщения: 1759
Зарегистрирован: Пт июн 01, 2018 07:28:45

Сообщение parovoZZ »

[uquote="NStorm",url="/forum/viewtopic.php?p=4034276#p4034276"]ARV,
TOV1 is automatically cleared when the Timer/Counter1 Overflow Interrupt Vector is executed
Вы включили прерывание. Компилятор всегда делает заглушку с RETI емнип в векторах, даже не объявленных в коде. В любом случае переход по вектору происходит, и железо сбрасывает TOV1.[/uquote]
Если разрешено прерывание, а обработчика нет, то GCC прерывание направит на RESET.

Добавлено after 3 minutes 17 seconds:
посмотрел на осциллографе - задний фронт не такой уж и крутой,
В какой точке?
Реклама
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

Да, перепутал. Не RESET, а прыжок на 0ой адрес. Типа программный сброс.

ARV, для дома с алишки фен за 1800р сейчас можно купить отдельный. И за столько же примерно паяльник нормальный.

Добавлено after 2 minutes 47 seconds:
[uquote="ARV",url="/forum/viewtopic.php?p=4034321#p4034321"]не проверял, но убирать нельзя, начнет скакать ШИМ из-за переполнения
...
ну типа того. проблема-то в том, что это проявляется лишь при нажатии любой кнопки! ищу связь...[/uquote]
Я пытаюсь локализовать проблему помочь. Всегда подобными кусками легче определить источник. Можно добавить в тот кусок if (low_power) ... загорание какого-нибудь светика, чисто для отладки. И погладеть, будет ли он гореть, пока нажата кнопка. Чтобы понять, что вход именно тут идет.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

parovoZZ писал(а):В какой точке?
на затворе VT12, 1-я нога транзистора
NStorm писал(а):Можно добавить в тот кусок if (low_power) ... загорание какого-нибудь светика, чисто для отладки.
да я ж вроде и не первый год замужем... светик припаять - та еще проблема, фотки платы вы видели. связь явно с функцией get_event() - если её не вызывать, то и проблем нет. но почему эта функция влияет на ШИМ - пока загадка.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Мудрый кот
Сообщения: 1759
Зарегистрирован: Пт июн 01, 2018 07:28:45

Сообщение parovoZZ »

Параллельно R15 поставить Шоттки. Транзистор убрать.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

мне казалось, открытый канал MOSFET получше диода будет... в других схемах ставят биполярник pnp, я подумал - MOSFET получше. я не прав?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 39197
Зарегистрирован: Сб сен 13, 2014 16:27:32
Откуда: СпиртоГонск созвездия Омега

Сообщение musor »

[uquote="ARV",url="/forum/viewtopic.php?p=4034321#p4034321"]а вот еще интересный вопрос, практическое (т.е. экспериментальное) решение которого оставляю на будущее: имеет ли смысл применение "разрядного" транзистора в этой схеме?
Изображение
управление на затвор с выхода AVR, т.е. 5В, не более.
посмотрел на осциллографе - задний фронт не такой уж и крутой, на глазок - больше сотни микросекунд... ощущение такое, что не работает этот разрядный транзистор VT16 (IRLML6402).[/uquote]
в таком включени точно не будет работать схема неверная...
ARV писал(а):без паяльной станции с феном уже не очень-то и попаяешь, точнее, не распаяешь запаянное, если у него больше 3 ног... да и двумя ножками перепайка SMD-дросселя серии SPRH одним-единственным паяльником малой мощности (т.е. тем же, что и для 0805) превращается в проблему...
а зачем паять ЭТО smd тупой паялой
ты еще попробуй BGA им перепаять а потом выдай опус тем кто их придумал там паялом к ножкам ваще никахнедобраца...
но ИК станция и паялна печь обе проблемы в принеципе решает
ZМудрость(Опыт и выдержка) приходит с годами.
Все Ваши беды и проблемы, от недостатка знаний.
Умный и у дурака научится, а дураку и ..
Алберт Ейнштейн не поможет и ВВП не спасет.и МЧС опаздает
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

musor писал(а):в таком включени точно не будет работать
я рассуждал так:
1. подается на затвор VT12 высокий уровень. это соответствует высокому уровню и на p-канальном VT16, т.е. он закрыт, т.е. никак не влияет ни на что.
2. высокий уровень снимается, подается ноль. поскольку затвор VT12 заряжен до +5В, а затвор VT16 соединен с общим, это условие отпирания VT16. сопротивление канала p-MOSFET-а минимально (миллиОмы), и затвор VT12 предельно быстро разряжается через этот канал, а вход МК не перегружен втекающим током.
3. затвор VT16 имеет значительно меньшую ёмкость, чем затвор VT12, поскольку VT12 гораздо высоковольтнее и мощнее, поэтому заряд-разряд затвора этого маломощного транзистора МК не угрожает

где я ошибся?

Добавлено after 3 minutes 31 second:
musor писал(а):но ИК станция и паялна печь обе проблемы в принеципе решает
так я об этом и писал:
ARV писал(а):сопровождается колоссальными расходами
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Мудрый кот
Сообщения: 1759
Зарегистрирован: Пт июн 01, 2018 07:28:45

Сообщение parovoZZ »

подается ноль.
Не будет такого при большой величине втекающего тока. В даташите приведены графики.
У Atmel есть модели МК с усиленным нижним драйвером. Но ноги не все и AtMega вроде такими не обладает.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Я вот не пойму: вы не прочли мои пояснения? Наличие р-канальника и препятствует возникновению большого втекающего тока! Ну, должно препятствовать по плану...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Мудрый кот
Сообщения: 1759
Зарегистрирован: Пт июн 01, 2018 07:28:45

Сообщение parovoZZ »

Нарыл исходники для какой-то тиньки (441 или 44А)
Инициализация АЦП

Код: Выделить всё

void ADC_Init(void)
{
	DIDR0 = (1<<ADC1D) | (1<<ADC2D) | (0<<ADC3D);				// Отключаем триггер Шмитта от сигнальной ноги
	
	ADMUXB = (0<<REFS2) | (0<<REFS1) | (1<<REFS0) | (0<<GSEL1) | (1<<GSEL0);	// Внутренний ИОН 1.1в, усиление = 100

	ADCSRB = (1<<ADLAR) | (1<<ADTS1) | (1<<ADTS0);				// Работаем только со старшими 8-ю битами, запуск от таймера T0

	ADCSRA = (1<<ADEN) | (1<<ADIE) | (1<<ADATE) | (0<<ADPS2) | (1<<ADPS1) | (1<<ADPS0); // Прескалер = 8
}
АЦП запускает Т0:

Код: Выделить всё

TIMSK0 = Bit(TOIE0);
T0_Mode_CTC;
Первый запуск АЦП - вручную.
Обработчик переполнения Т0 пустой:

Код: Выделить всё

	//... Прерывание при переполнении таймера 0
ISR(TIMER0_OVF_vect)
{

}
В прерывании от АЦП тупо читаем регистр с данными.

Код: Выделить всё

ISR(ADC_vect)
{
ADC_Get_Data();

}
15кГц частота дискретизации как с куста и без лишнего шаманства.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Никогда не любил аналоговую технику... Потому что не понимаю её в принципе. Ну и плюс всякие пробелы в знаниях, например, ТАУ со всеми этими полюсами АЧХ/ФЧХ и передаточными функциями... С горем пополам эмитерный повторитель и ключевой режим освоил, и всё...

Но чтобы неоновую лампочку не суметь зажечь правильно - этого я от себя не ожидал... Даже тут аналоговая суть процессов подставила мне ножку... Одно расстройство от этого аналога... Цифра куда лучше!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Размышления мои продолжаются... Пытаюсь осмыслить наиболее простое решение для задачи использования одного вывода МК для двух функций: управления реле и индикации режима работы реле. Казалось бы, в чем проблема? Но, как обычно, захотелось мне индицировать 2 варианта отключенного состояние реле: обычное отключение и аварийное, то есть когда реле отключено просто так, светодиод не светится, а когда по аварии - светодиод мигает. при включенном состоянии реле светодиод, естественно, горит непрерывно.
Реле сейчас рассматриваю обычное, электромагнитное, управление MOSFET-ключом. Но в перспективе возможно применение и оптореле симисторного типа (или просто симистор с оптроном MOC).
Попутно думаю: а возможно ли на тот же пин МК навесить и третью функцию - контроль нормально разомкнутого контакта датчика аварии? То есть возможно ли одним пином контролировать замыкание датчика (на общий), управлять ключом реле и мигать светодиодом, если датчик замкнут? Ну и впридачу, чтобы схема была попроще...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Мудрый кот
Сообщения: 1759
Зарегистрирован: Пт июн 01, 2018 07:28:45

Сообщение parovoZZ »

Было бы не плохо ещё и тактовый сигнал завести на этот пин. Да и вообще, предлагаю подумать над однопиновым микроконтроллером. Это ж какая экономия?
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

parovoZZ, идеи хорошие, но на перспективу. А сейчас по озвученным идеям есть идеи? ;)

Добавлено after 4 minutes 7 seconds:
Мои собственные мысли пока вертятся вокруг того факта, что электромагнитное реле - штука весьма инерционная, и поэтому снятие управляющего сигнала с ключа на 10-100 микросекунд никак не скажутся на его (реле) контактах. В то же время 100 мкс для МК - это приличное время, можно что-нибудь успеть... только вот что именно успевать, пока не придумал.
Туго стал соображать последнее время...

Добавлено after 8 hours 44 minutes 9 seconds:
Передумал я извращаться. Пооптимизировал общий алгоритм, подумал над схемой, и пришел к выводу, что отдельный пин на светодиод будет куда разумнее всего этого... И проще во всех отношениях, включая программу.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
As
Модератор
Аватара пользователя
Сообщения: 46216
Зарегистрирован: Пт янв 23, 2009 19:20:05

Сообщение As »

Ребята! Давайте не засирать эту тему - я её иногда читаю, почти как детектив: ничего не понятно - но всё равно интересно! :)))
Ответить

Вернуться в «МЯЯЯУ!»