Страница 1 из 5
Софтстарт для усилителя
Добавлено: Вт мар 24, 2020 13:08:27
Johnson1496
Добрый день, уважаемые коты и котята.
Прошу помощи, так как сильно хромаю в пользовании микроконтроллерами в народном хозяйстве. Суть проблемы:
- имеется усилитель на прямонакальных лампах по нынешним временам стоящих не по-детски, поэтому нужно некое устройство на Тинни13 (много их у меня), которое:
1. При подаче питания на устройство на всех выходах устанавливается 0;
2. При подаче на один из входов 1 от механического включателя (желательна защита от дребезга):
- подает на один из входов/выходов 1;
- через 5 сек появляется 1 на втором выходе;
- через 30 сек появляется 1 на третьем выходе;
- через 30 сек. Появляется 1 на четвертом выходе;
при этом 1 с остальных выходах не снимаются
3. При снятии 1 с входа/выхода (выкл):
- на четвертом выходе 1 сменяется на 0;
- через 30 сек появляется 0 на третьем выходе;
- через 30 сек появляется 0 на втором выходе.
Программу хотелось бы на ассемблере или С с пояснениями для даунов
Re: Софтстарт для усилителч
Добавлено: Вт мар 24, 2020 13:18:24
Core-X
1% из 99% что Ваша хотелка будет реализована в данном разделе форума.
P.S. с AVR-ами не дружу

Re: Софтстарт для усилителч
Добавлено: Вт мар 24, 2020 13:34:36
NStorm
Код: Выделить всё
#define F_CPU 1200000
#include <avr/io.h>
#include <util/delay.h>
#include <stdint.h>
uint8_t i;
void delay_s(uint8_t s) {
while (s) {
s--;
_delay_ms(1000);
}
}
int main() {
DDRB = (1 << PB1) | (1 << PB2) | (1 << PB3) | (1 << PB4);
while(1) {
if (PINB & (1 << PB0))
i++;
else
i = 0;
if (i >= 250) {
PORTB |= 1 << PB1;
delay_s(5);
PORTB |= 1 << PB2;
delay_s(30);
PORTB |= 1 << PB3;
delay_s(30);
PORTB |= 1 << PB4;
while (PINB & (1 << PB0));
PORTB &= ~(1 << PB4);
delay_s(30);
PORTB &= ~(1 << PB3);
delay_s(30);
PORTB &= ~(1 << PB2);
}
}
}
Re: Софтстарт для усилителч
Добавлено: Вт мар 24, 2020 14:06:31
Johnson1496
Спасибо откликнувшимся! На выходных постараюсь отмакетировать
Re: Софтстарт для усилителя
Добавлено: Ср мар 25, 2020 06:25:39
akl
Как вариант. На ассемблере.

Re: Софтстарт для усилителя
Добавлено: Ср мар 25, 2020 08:26:18
pyzhman
[uquote="Johnson1496",url="/forum/viewtopic.php?p=3817693#p3817693"]...сильно хромаю в пользовании микроконтроллерами...[/uquote]
Фьюзы оставить заводские.
Re: Софтстарт для усилителя
Добавлено: Ср мар 25, 2020 20:07:43
Johnson1496
akl,
Спасибо президенту, этот вариант проверю точно в ближайшее время.
Re: Софтстарт для усилителя
Добавлено: Ср мар 25, 2020 20:41:12
Ivanoff-iv
а как поступать, если выключил раньше окончания процесса включения?
Re: Софтстарт для усилителя
Добавлено: Ср мар 25, 2020 21:15:40
Jack_A
Софтстарт - это я понимаю, а выключение тоже ступенчато - это не излишне ? Или не ?
Re: Софтстарт для усилителя
Добавлено: Ср мар 25, 2020 21:57:20
Самсусамыч
[uquote="Johnson1496",url="/forum/viewtopic.php?p=3817693#p3817693"]поэтому нужно некое устройство на Тинни13 (много их у меня), которое:[/uquote]
Фьюзы прошивать не нужно, если МК новые (тактируется на заводских установках).
Прошивка:
Tiny13.hex
Схема:
1.png
Re: Софтстарт для усилителя
Добавлено: Чт мар 26, 2020 01:56:09
Demiurg
[uquote="Самсусамыч",url="/forum/viewtopic.php?p=3818459#p3818459"]...[/uquote]
Исходники выложить постеснялись?
Re: Софтстарт для усилителя
Добавлено: Чт мар 26, 2020 09:05:28
Самсусамыч
Я пишу на АВ (Algorithm Builder). На форуме единицы кто понимает данный язык программирования.

Если ТС пожелает размещу и исходник.
Re: Софтстарт для усилителя
Добавлено: Чт мар 26, 2020 11:03:07
Demiurg
ТС, в последнем пункте что происходит с первым выходом?
Re: Софтстарт для усилителя
Добавлено: Чт мар 26, 2020 11:19:27
NStorm
Прокомментирую свой прошлый код. Реализовывал его тупо дословно со слов ТС.
Спойлер
Код: Выделить всё
#define F_CPU 1200000 // Поясним прошивке, что частота МК 1.2МГц (настройки по умолчанию)
#include <avr/io.h>
#include <util/delay.h>
#include <stdint.h>
uint8_t i; // Переменная для счетчкика
void delay_s(uint8_t s) { // Функция задержки на s секунд. Циклично по 1000 мс будет считать, т.к. функция задержки в мс имеет свои ограничения
while (s) {
s--;
_delay_ms(1000);
}
}
int main() {
DDRB = (1 << PB1) | (1 << PB2) | (1 << PB3) | (1 << PB4); // Переведем порты PB1-4 в режим выхода
while(1) { // Начинаем бесконечный цикл
// Антидребезг
if (PINB & (1 << PB0)) // Если на входе PB0 лог. 1, то увеличиваем значение i на 1.
i++;
else // иначе сбрасываем i до 0.
i = 0;
// Если антидребезг выше натикал 250 (это будет порядка 1-3 мс, достаточно чтобы исключить дребезг), то начинаем цикл "включения"
if (i >= 250) {
PORTB |= 1 << PB1; // Переводим порт PB1 в лог1.
delay_s(5); // Ждем 5 с
PORTB |= 1 << PB2; // Переводим порт PB2 в лог1.
delay_s(30); // Ждем 30 с
PORTB |= 1 << PB3; // Переводим порт PB3 в лог1.
delay_s(30); // Ждем 30 с
PORTB |= 1 << PB4; // Переводим порт PB4 в лог1.
while (PINB & (1 << PB0)); // Ждем тут бесконечно пока на входе PB0 лог1
// Если дошли сюда, значит на входе PB0 появилась лог0, т.е. начинаем выключение.
PORTB &= ~(1 << PB4); // Переводим порт PB4 в лог0.
delay_s(30); // Ждем 30 с
PORTB &= ~(1 << PB3); // Переводим порт PB3 в лог0.
delay_s(30); // Ждем 30 с
PORTB &= ~(1 << PB2); // Переводим порт PB2 в лог0.
}
}
}
Никаких ситуаций, кроме "в лоб" описанной ТС не предусмотрено. Если включить и пока идет включение выключить - включение продолжится до конца и только потом пойдет выключение.
Готовый HEX:
Спойлер
:1000000009C016C015C014C013C012C011C010C062
:100010000FC00EC011241FBECFE9CDBF20E0A0E667
:10002000B0E001C01D92A136B207E1F710D033C095
:10003000E7CF882359F081502FE739EA93E0215028
:1000400030409040E1F700C00000F3CF08958EE10A
:1000500087BBB09B06C0809160008F5F809360007B
:1000600002C010926000809160008A3F90F3C19AB4
:1000700085E0DFDFC29A8EE1DCDFC39A8EE1D9DF53
:10008000C49AB099FECFC4988EE1D3DFC3988EE1B5
:0A009000D0DFC298DECFF894FFCF56
:00000001FF
Re: Софтстарт для усилителя
Добавлено: Чт мар 26, 2020 12:13:30
Demiurg
Re: Софтстарт для усилителя
Добавлено: Чт мар 26, 2020 13:23:32
Самсусамыч
[uquote="NStorm",url="/forum/viewtopic.php?p=3818632#p3818632"]Прокомментирую свой прошлый код. Реализовывал его тупо дословно со слов ТС.[/uquote]
У Вас в алгоритме четыре вывода для управления. У ТС заявлено три. Значит один лишний. ИМХО, в данном алгоритме реализовывать алгоритм антидребезга контактов смысла нет.

Дребезг контактов при данном алгоритме ни на что не влияет.
Re: Софтстарт для усилителя
Добавлено: Чт мар 26, 2020 13:35:32
Demiurg
В начальном сообщение чётко прописано. Значит пусть автор чётко выскажется. Ждём его.
Re: Софтстарт для усилителя
Добавлено: Чт мар 26, 2020 13:58:53
Самсусамыч
Значит пусть автор чётко выскажется
О чём?

Re: Софтстарт для усилителя
Добавлено: Чт мар 26, 2020 14:05:15
Demiurg
[uquote="Johnson1496",url="/forum/viewtopic.php?p=3817693#p3817693"]1. При подаче питания на устройство на всех выходах устанавливается 0;
2. При подаче на один из входов 1 от механического включателя (желательна защита от дребезга):
- подает на один из входов/выходов 1;
- через 5 сек появляется 1 на втором выходе;
- через 30 сек появляется 1 на третьем выходе;
- через 30 сек. Появляется 1 на четвертом выходе;
при этом 1 с остальных выходах не снимаются
3. При снятии 1 с входа/выхода (выкл):
- на четвертом выходе 1 сменяется на 0;
- через 30 сек появляется 0 на третьем выходе;
- через 30 сек появляется 0 на втором выходе.[/uquote]
[uquote="Самсусамыч",url="/forum/viewtopic.php?p=3818682#p3818682"]
Значит пусть автор чётко выскажется
О чём?

[/uquote]
Все-таки один вход-выход под сомнением. Вот и ждем уточнения. Пусть автор четко выскажется. Входов - столько-то, выходов - столько-то. Тогда не будет непоняток.
Re: Софтстарт для усилителя
Добавлено: Чт мар 26, 2020 14:16:31
Самсусамыч
[uquote="Demiurg",url="/forum/viewtopic.php?p=3818683#p3818683"]Все-таки один вход-выход под сомнением.[/uquote]
На мой взгляд всё очевидно:
Здесь указано на какой уровень реагировать.
2. При подаче на один из входов 1 от механического включателя (желательна защита от дребезга):
А это последовательность алгоритма при появлении на входе лог 1
Коианда:
- подает на один из входов/выходов 1; - это вход для "механического включателя"
Действие:
- через 5 сек появляется 1 на втором выходе; - (Первый выход)
- через 30 сек появляется 1 на третьем выходе; - (Второй выход)
- через 30 сек. Появляется 1 на четвертом выходе; - (Третий выход)
и тд.