Ладно попробую начать сам .Я так понимаю что основная проблемма это отсутствие у меги вывода модуля захата ICP1, остальные пины вроде как соответствуют пинам ардуины мини. Как можно реализовать эту функцию в меге??? Хочу сказать сразу что в програмировании я не сильно силен, но стремление огромное)
Обратитесь напрямую к dimax Это он посоветовал использовать данный способ расчёта. Он должен знать.
nevkon, да, 12 тыщ в минуту и в секунду совсем разные величины, я тоже не обратил на это внимание. Получается 12000/60 =200 оборотов в секунду, и *12 = 2400Гц Значит можно другой скетч использовать, т.к. для частот до 1-2 кГц есть ещё способ с быстрым измерением (время измерения от начала первого импульса до начала второго). И там не нужно 2 таймера. Достаточного одного.
ISR (TIMER1_OVF_vect) { //прерывание для счёта по переполнению uint
17
int_tic++; //считать переполнения через 65536 тактов
18
if(int_tic > (F_CPU/65536)) {tic=0; int_tic=0;} //если на входе пусто более секунды
19
} //то обнулить счётчики
20
21
voidloop(){
22
Serial.println((float)F_CPU/tic);
23
}
Здесь переменная tic -это количество тактов процессора, совершённых за 1 период входного сигнала. Если tic * (1/F_CPU) то будет время периода в секундах. Если F_CPU/tic -будет частота в герцах.
dimax, использую ваш совет и всё работает почти отлично. сигнал хороший на всём диапозоне. Но есть одно НО. В одном месте, примерно на 1200 об\мин. происходит "провал".Датчик у меня выдаёт 12 импульсов на 1 оборот.
На ютубе в комментариях сказали что "таймер был рядом с предельным значением (65535)" и посоветовали: "Попробуйте просто заменить TCNT1 на ICR1"
После замены ситуация улучшилась, но до конца не пропала. Провалы продолжаются. С разными импульсами на 1 оборот на разных оборотах. Например на 8 импульсов на 1800, 6 импульсов на 2400, 18импульсов 800оборотов. Тоесть всё привязано ко времени между импульсами.
sany_sch, мне импульсы на оборот ни о чём не говорят. Какое значение tic в момент глюка, и какое значение бывает перед и после глюка.(когда нормально просчиталось).? Подозреваю, что это помехи, наводимые на МК, не рассматривали такой вариант?
sany_sch, мне импульсы на оборот ни о чём не говорят. Какое значение tic в момент глюка, и какое значение бывает перед и после глюка.(когда нормально просчиталось).? Подозреваю, что это помехи, наводимые на МК, не рассматривали такой вариант?
tic - точно сказать сейчас не готов. чтото около 66666 Подумаю, как можно это определить.
Насчёт помех, я сомневаюсь. так как подобное происходит на разных станках, с разными ардуинками, с разными двигателями в разных концах разных стран. Единственное что это всё объединяет один скетч и одинаковый tic во время сбоя.
sany_sch, кстати про то, что бы поменять TCNT1 на ICR1 -это правильно, а то TCNT1 счёлкает и после входа в перерывание, и может случиться переполнение в ненужный момент.
sany_sch, кстати про то, что бы поменять TCNT1 на ICR1 -это правильно, а то TCNT1 счёлкает и после входа в перерывание, и может случиться переполнение в ненужный момент.
Спасибо. Скажите, dimax, у меня ещё в скетче, отслеживается переход сети через 0, для регулировки симистора таким образом:
delayMicroseconds(10); // задержка 10 микросекунд (для 60Hz = 8.33)
7
digitalWrite(AC_LOAD, LOW); // выключаем сигнал на симистор.
8
}
Теперь даже не знаю как правильно сформулировать вопрос.
Не может оказаться так, что в тот момент когда частота счётчика оборотов приближается к tic=65535, то сбой происходит не именно в подсчёте оборотов, а в отслеживании 0 или в открытии симистора. Это даже скорее будет давать подобные "провалы" и рывки.
sany_sch, не вижу взаимосвязи tic и приведёненого фрагмента. Глючить может всё что угодно, для начала нужно всё убрать кроме изначального измерителя длины импульса. Выводить tic , будет ли глюк? Какое значение tic будет во время глюка? У моего скетча есть одно слабое место - случай, если прерывание ICP и OVF сработают одновременно, тогда первым выполнится ICP и выдаст значение tic на 65535 меньше чем нужно. Вероятность что всё это произойдёт крайне низка. Поэтому я и спрашиваю точное значение tic, если младшие два байта "глючного" значения будут пустые -значит есть вероятность, что не успел прибавиться счётчик переполнения OVF, и нужно будет в прерывании ICP проверять флаг TOV1, и менять дальнейший алгоритм. Если не пустые -то проблема к таймерам и их прерываниям точно не имеет отношения.
sany_sch, не вижу взаимосвязи tic и приведёненого фрагмента. Глючить может всё что угодно, для начала нужно всё убрать кроме изначального измерителя длины импульса. Выводить tic , будет ли глюк? Какое значение tic будет во время глюка? У моего скетча есть одно слабое место - случай, если прерывание ICP и OVF сработают одновременно, тогда первым выполнится ICP и выдаст значение tic на 65535 меньше чем нужно. Вероятность что всё это произойдёт крайне низка. Поэтому я и спрашиваю точное значение tic, если младшие два байта "глючного" значения будут пустые -значит есть вероятность, что не успел прибавиться счётчик переполнения OVF, и нужно будет в прерывании ICP проверять флаг TOV1, и менять дальнейший алгоритм. Если не пустые -то проблема к таймерам и их прерываниям точно не имеет отношения.
Вывел значения ТИК на график. Посмотрите, если не сложно. 1,5 минуты. Как узнать в цифрах не знаю. Не подскажете?
В видео говорю "тик уменьшается." имел в виду увеличивается.
sany_sch, мне импульсы на оборот ни о чём не говорят. Какое значение tic в момент глюка, и какое значение бывает перед и после глюка.(когда нормально просчиталось).? Подозреваю, что это помехи, наводимые на МК, не рассматривали такой вариант?
Вот, нашел, может так понятней. Хоть цифры видно. Тик увеличивается вдвое. На некоторые симистор не успевает отреагировать, а некоторые "отрабатывает" и получается резкий уход графика вниз. Посмотрите, сбой почти всегда начинается с чуть больше 65000 и уходит вверх. Т иолько один раз в другом месте и вниз. Но это похоже на случайность.
Да, это похоже на глюк одновременного прихода прерывания захвата и прерывания переполнения. Красивого решения к сожалению не существует. Приделал костыль, попробуйте:
Да, это похоже на глюк одновременного прихода прерывания захвата и прерывания переполнения. Красивого решения к сожалению не существует. Приделал костыль, попробуйте:
встречал в сети такие движки, но в руках не держал. Это не обычный движок. а как бы 2 в одном. Но вот как его подключить я не знаю. По моему где то на чипмейкере такие обсуждались.
Регулятор доведён до конца и есть уже в двух вариантах. Но и всё же меня не до конца устраивает.
Постараюсь пояснить. На пине Д2 идёт прерывание - отслеживаем переход сети через ноль. В момент перехода выполняется команда "time = micros();" и всё. А далее в основном цыкле мы просто проверяем пора или не пора открывать симистор "if(tims >= (time + dimtime))"
И всё происходит хорошо в регуляторе без экрана. Но у нас есть экран и мы выводим на него информацию 2 раза в секунду. И в это время происходят какие то задержки и симистор открывается не правильно.
В общем нужно задать таймер на открытие симистора прямо в прерывании. чтоб экран нам не мешал.
И всё происходит хорошо в регуляторе без экрана. Но у нас есть экран и мы выводим на него информацию 2 раза в секунду. И в это время происходят какие то задержки и симистор открывается не правильно.
В общем нужно задать таймер на открытие симистора прямо в прерывании. чтоб экран нам не мешал.
Скоро буду собирать подобное устройство, уже вагончик прочитал - все слабовато. В общем для себя решил использовать 2 контроллера. Один рулит, другой управляет и показывает. Даром, что устройство не серийное и ценник не сверх меры. Пока обдумываю вариант с быстрым обменом данных 2 или 4 байта. Поделиться нечем, кроме как идеей.
зы. Прошу не писать про покупку готового регулятора - это не спортивно и не интересно получить сразу железку которая будет работать при первом же включении.
Очень даже согласен и более чем солидарен: не важен результат - важен сам процесс. Хотя если логически умозаключить, то - основной физической силой, движущей весь процесс, как раз и является сам результат.
Всем привет , тема еще живая ? Тоже долбаюсь с регулятором для мотора от стиралки на семисторе . Прочитал всю тему , нет ни где алгоритма работы . Я по входу ICP измеряю длинну импульса от HIGH до LOW. Потом в прерывании по зеро заряжаю таймер для открытия симистора , под нагрузкой работает нормально , без , плавает .
Всем привет , тема еще живая ? Тоже долбаюсь с регулятором для мотора от стиралки на семисторе . Прочитал всю тему , нет ни где алгоритма работы . Я по входу ICP измеряю длинну импульса от HIGH до LOW. Потом в прерывании по зеро заряжаю таймер для открытия симистора , под нагрузкой работает нормально , без , плавает .
Использую мегу16 , отладка JTAGICE в студии . Сигнал от тахо идет на ICP(PD6) , ZERO на INT0(PD2) , выход на симистор PB3 . В прерывании захвата измеряю длинну импульса , в прерывании по зеро заряжаю таймер 0 на открытие симистора , все числа 8 бит .
Как готовое устройство мне не интересно , я бы купил его да и все . Просто хочу разобраться с пид регулированием , нахождение ошибки и тд. , интересен сам алгоритм , последовательность так сказать . Сама формула и какие измерения времени в нее вставлять , и регулятор не понятно то ли ПИД то ли просто ПД . Разобравшись с этим можно применять к другим моторам , инверторным например , их от стиралок тоже много , он и компактней и тише и мощнее .
Кто-нибудь сможет внести ясность? Если управлять коллекторным двигателем со щетками от стиральной машины, при выпрямлении тока после диодного нужно ставить высоковольтный электролит или нет? И на что повлияет его установка, кроме как повышения действующего значения напряжения?
Кто-нибудь сможет внести ясность? Если управлять коллекторным двигателем со щетками от стиральной машины, при выпрямлении тока после диодного нужно ставить высоковольтный электролит или нет? И на что повлияет его установка, кроме как повышения действующего значения напряжения?
Тебе нужно официально разрешение его не ставить, потому, что тебе лень его заказать, а дома нет? ;))
Сорян, у меня печать в стирке, официального разрешения дать не могу. Но на словах - разрешаю, если ШИМ у тебя выше 500Гц. (вот тока не надо спрашивать: "поче-мууу?" Ответ: "поче-кря".)
(Ппц, какие остроумные вопросы пошли! Я ху..ю, без баяна!)
он будет эффективен при нагрузке до 300 Ватт. на обмотку двигателя будет будет поступать действующее напряжение около 300 В. Мосфет нужен вольт на 800. и это только теория, на практике все это может недолго проработать...
На обмотке действующее напряжение 60-70 вольт. Оно растет при приложении нагрузки на двигатель. Мне просто вот интересно в чем заключается эффективность электролита, сама физика процесса.
схему рисуйте, иначе разговор бессмысленно продолжать. В импульсных источниках питания принято называть действующим максимальное амплитудное напряжение.
без емкости на малых оборотах сильно упадет момент на валу двигателя.
Получается если ваш двигатель и источник питания с хорошим запасом для существующей нагрузки и вы нашли оптимальную частоту шим, при этом нет высокого нагрева элементов, искрений на щетках, то вполне вероятно, что электролит не нужен...
Ладно попробую начать сам .Я так понимаю что основная проблемма это отсутствие у меги вывода модуля захата ICP1, остальные пины вроде как соответствуют пинам ардуины мини. Как можно реализовать эту функцию в меге??? Хочу сказать сразу что в програмировании я не сильно силен, но стремление огромное)
Обратитесь напрямую к dimax Это он посоветовал использовать данный способ расчёта. Он должен знать.
К сожелению не могу найти как отправить личное сообщение(
К сожелению не могу найти как отправить личное сообщение(
здесь нет лички, пишите прямо здесь
В общем после продолжительного гугла понял что у меги есть ICP только на 4-м тайтере.Попробую изменить
Zeyzey, судя по схеме и с пятого тоже выведен.
Вот нашел https://docs.google.com/spreadsheets/d/16MIFE4ITEisEDUBh3H4A7WZga1Sm1Pm-igS3r0A58L8/pub?gid=0#
Только здесь приводится разница с UNO. Так вот там есть строка Functions not available on Mega.
Трудность думаю вся в переделке єтого кода заключается в нескольких участках кода.
1
pinMode(AC_LOAD, OUTPUT);
// назначаем выходом
2
040
3
attachInterrupt(0, zero_crosss_int, RISING);
// прерывание по пину 2
А также здесь
01
pinMode (8, INPUT);
// вход сигнала ICP( №8 only для atmega328)
02
//настройка 16 бит таймера-счётчика 1
03
TCCR1B = 0; TCCR1A = 0; TCNT1 = 0;
04
TIMSK1 = (1 << ICIE1) | (1 << TOIE1);
//создавать прерывание от сигнала на пине ICP1
05
TCCR1B = (1 << ICNC1) | (1 << ICES1) | (1 << CS10);
//div 1
06
07
08
}
09
10
11
ISR (TIMER1_CAPT_vect) {
//прерывание захвата сигнала на входе ICP1
12
13
tic = ((uint32_t)int_tic << 16) | ICR1 ;
//подсчёт тиков
14
15
ICR1 = 0; int_tic = 0; TCNT1 = 0;
16
17
sp = sp + 1 ;
// для подсчёта оборотов в минуту.
18
19
holl = holl + 1;
20
21
}
// после каждого срабатывания датчика холл+1
22
23
24
25
26
27
ISR (TIMER1_OVF_vect) {
//прерывание для счёта по переполнению uint
28
29
int_tic++;
//считать переполнения через 65536 тактов
30
31
if
(int_tic > t) {
32
33
tic = 0;
//если на входе пусто более минимального времени то обнулить счётчики
34
35
int_tic = 0;
36
37
}
38
39
if
(int_tic > 500) {
40
41
dimming = 130;
// если стоим 2 секунды, то сбрасываем напряжение.
42
43
}
44
45
}
46
47
48
49
// the interrupt function must take no parameters and return nothing
50
51
void
zero_crosss_int()
// function to be fired at the zero crossing to dim the light
52
53
{
54
55
time = micros();
56
57
58
59
}
nevkon, да, 12 тыщ в минуту и в секунду совсем разные величины, я тоже не обратил на это внимание. Получается 12000/60 =200 оборотов в секунду, и *12 = 2400Гц Значит можно другой скетч использовать, т.к. для частот до 1-2 кГц есть ещё способ с быстрым измерением (время измерения от начала первого импульса до начала второго). И там не нужно 2 таймера. Достаточного одного.
01
volatile unsigned
int
int_tic;
02
volatile unsigned
long
tic;
03
void
setup
(){
04
Serial
.begin(9600);
05
pinMode (8,INPUT);
// вход сигнала ICP( №8 only для atmega328)
06
//настройка 16 бит таймера-счётчика 1
07
TCCR1B = 0; TCCR1A = 0; TCNT1 = 0;
08
TIMSK1 = (1<<ICIE1)|(1<<TOIE1);
//создавать прерывание от сигнала на пине ICP1
09
TCCR1B = (1<<ICNC1)|(1<<ICES1)|(1<<CS10);
//div 1
10
}
11
12
ISR (TIMER1_CAPT_vect) {
//прерывание захвата сигнала на входе ICP1
13
tic= ((uint32_t)int_tic<<16)|TCNT1 ;
//подсчёт тиков
14
ICR1=0; int_tic=0; TCNT1=0; }
15
16
ISR (TIMER1_OVF_vect) {
//прерывание для счёта по переполнению uint
17
int_tic++;
//считать переполнения через 65536 тактов
18
if
(int_tic > (F_CPU/65536)) {tic=0; int_tic=0;}
//если на входе пусто более секунды
19
}
//то обнулить счётчики
20
21
void
loop
(){
22
Serial
.println((
float
)F_CPU/tic);
23
}
Здесь переменная tic -это количество тактов процессора, совершённых за 1 период входного сигнала. Если tic * (1/F_CPU) то будет время периода в секундах. Если F_CPU/tic -будет частота в герцах.
dimax, использую ваш совет и всё работает почти отлично. сигнал хороший на всём диапозоне. Но есть одно НО. В одном месте, примерно на 1200 об\мин. происходит "провал".Датчик у меня выдаёт 12 импульсов на 1 оборот.
На ютубе в комментариях сказали что "таймер был рядом с предельным значением (65535)" и посоветовали: "Попробуйте просто заменить TCNT1 на ICR1"
После замены ситуация улучшилась, но до конца не пропала. Провалы продолжаются. С разными импульсами на 1 оборот на разных оборотах. Например на 8 импульсов на 1800, 6 импульсов на 2400, 18импульсов 800оборотов. Тоесть всё привязано ко времени между импульсами.
Как с этим можно бороться?
sany_sch, мне импульсы на оборот ни о чём не говорят. Какое значение tic в момент глюка, и какое значение бывает перед и после глюка.(когда нормально просчиталось).? Подозреваю, что это помехи, наводимые на МК, не рассматривали такой вариант?
sany_sch, мне импульсы на оборот ни о чём не говорят. Какое значение tic в момент глюка, и какое значение бывает перед и после глюка.(когда нормально просчиталось).? Подозреваю, что это помехи, наводимые на МК, не рассматривали такой вариант?
tic - точно сказать сейчас не готов. чтото около 66666 Подумаю, как можно это определить.
Насчёт помех, я сомневаюсь. так как подобное происходит на разных станках, с разными ардуинками, с разными двигателями в разных концах разных стран. Единственное что это всё объединяет один скетч и одинаковый tic во время сбоя.
sany_sch, кстати про то, что бы поменять TCNT1 на ICR1 -это правильно, а то TCNT1 счёлкает и после входа в перерывание, и может случиться переполнение в ненужный момент.
sany_sch, кстати про то, что бы поменять TCNT1 на ICR1 -это правильно, а то TCNT1 счёлкает и после входа в перерывание, и может случиться переполнение в ненужный момент.
Спасибо. Скажите, dimax, у меня ещё в скетче, отслеживается переход сети через 0, для регулировки симистора таким образом:
1
void
zero_crosss_int()
// function to be fired at the zero crossing to dim the light
2
{
3
time = micros();
4
5
}
прерывание на D2. А затем открытие симистора происходит так:
1
int
dimtime = (75 * dimming);
// For 60Hz =>65
2
tims = micros();
// считываем время, прошедшее с момента запуска программы
3
if
(tims >= (time + dimtime)) {
//если время больше или равно времени срабатывания нуля + время задержки
4
5
digitalWrite(AC_LOAD, HIGH);
// открываем симистор
6
delayMicroseconds(10);
// задержка 10 микросекунд (для 60Hz = 8.33)
7
digitalWrite(AC_LOAD, LOW);
// выключаем сигнал на симистор.
8
}
Теперь даже не знаю как правильно сформулировать вопрос.
Не может оказаться так, что в тот момент когда частота счётчика оборотов приближается к tic=65535, то сбой происходит не именно в подсчёте оборотов, а в отслеживании 0 или в открытии симистора. Это даже скорее будет давать подобные "провалы" и рывки.
sany_sch, не вижу взаимосвязи tic и приведёненого фрагмента. Глючить может всё что угодно, для начала нужно всё убрать кроме изначального измерителя длины импульса. Выводить tic , будет ли глюк? Какое значение tic будет во время глюка? У моего скетча есть одно слабое место - случай, если прерывание ICP и OVF сработают одновременно, тогда первым выполнится ICP и выдаст значение tic на 65535 меньше чем нужно. Вероятность что всё это произойдёт крайне низка. Поэтому я и спрашиваю точное значение tic, если младшие два байта "глючного" значения будут пустые -значит есть вероятность, что не успел прибавиться счётчик переполнения OVF, и нужно будет в прерывании ICP проверять флаг TOV1, и менять дальнейший алгоритм. Если не пустые -то проблема к таймерам и их прерываниям точно не имеет отношения.
sany_sch, не вижу взаимосвязи tic и приведёненого фрагмента. Глючить может всё что угодно, для начала нужно всё убрать кроме изначального измерителя длины импульса. Выводить tic , будет ли глюк? Какое значение tic будет во время глюка? У моего скетча есть одно слабое место - случай, если прерывание ICP и OVF сработают одновременно, тогда первым выполнится ICP и выдаст значение tic на 65535 меньше чем нужно. Вероятность что всё это произойдёт крайне низка. Поэтому я и спрашиваю точное значение tic, если младшие два байта "глючного" значения будут пустые -значит есть вероятность, что не успел прибавиться счётчик переполнения OVF, и нужно будет в прерывании ICP проверять флаг TOV1, и менять дальнейший алгоритм. Если не пустые -то проблема к таймерам и их прерываниям точно не имеет отношения.
Вывел значения ТИК на график. Посмотрите, если не сложно. 1,5 минуты. Как узнать в цифрах не знаю. Не подскажете?
В видео говорю "тик уменьшается." имел в виду увеличивается.
https://youtu.be/YMcAFNU2Uts
sany_sch, мне импульсы на оборот ни о чём не говорят. Какое значение tic в момент глюка, и какое значение бывает перед и после глюка.(когда нормально просчиталось).? Подозреваю, что это помехи, наводимые на МК, не рассматривали такой вариант?
Вот, нашел, может так понятней. Хоть цифры видно. Тик увеличивается вдвое. На некоторые симистор не успевает отреагировать, а некоторые "отрабатывает" и получается резкий уход графика вниз. Посмотрите, сбой почти всегда начинается с чуть больше 65000 и уходит вверх. Т иолько один раз в другом месте и вниз. Но это похоже на случайность.
Да, это похоже на глюк одновременного прихода прерывания захвата и прерывания переполнения. Красивого решения к сожалению не существует. Приделал костыль, попробуйте:
01
volatile uint16_t int_tic;
02
volatile uint32_t tic;
03
void
setup
(){
04
Serial
.begin(9600);
05
pinMode (8,INPUT_PULLUP);
// вход сигнала ICP( №8 only для atmega328)
06
//настройка 16 бит таймера-счётчика 1
07
TCCR1B = 0; TCCR1A = 0; TCNT1 = 0;
08
TIMSK1 = (1<<ICIE1)|(1<<TOIE1);
//создавать прерывание от сигнала на пине ICP1
09
TCCR1B = (1<<ICNC1)|(1<<ICES1)|(1<<CS10);
//div 1
10
}
11
12
ISR (TIMER1_CAPT_vect) {
//прерывание захвата сигнала на входе ICP1
13
TCNT1=0;
14
if
(TIFR1&(1<<TOV1)){ TIFR1|=1<<TOV1;
if
(ICR1<100) { int_tic++;} }
15
tic= ((uint32_t)int_tic<<16)| ICR1 ;
//подсчёт тиков
16
int_tic=0;
17
}
18
19
ISR (TIMER1_OVF_vect) {
//прерывание для счёта по переполнению uint
20
int_tic++;
//считать переполнения через 65536 тактов
21
if
(int_tic > 244)
//если на входе пусто более секунды
22
{tic=0; int_tic=0;}
//то обнулить счётчики
23
}
24
void
loop
(){
25
Serial
.println(tic);
26
27
}
Да, это похоже на глюк одновременного прихода прерывания захвата и прерывания переполнения. Красивого решения к сожалению не существует. Приделал костыль, попробуйте:
01
volatile uint16_t int_tic;
02
volatile uint32_t tic;
03
void
setup
(){
04
Serial
.begin(9600);
05
pinMode (8,INPUT_PULLUP);
// вход сигнала ICP( №8 only для atmega328)
06
//настройка 16 бит таймера-счётчика 1
07
TCCR1B = 0; TCCR1A = 0; TCNT1 = 0;
08
TIMSK1 = (1<<ICIE1)|(1<<TOIE1);
//создавать прерывание от сигнала на пине ICP1
09
TCCR1B = (1<<ICNC1)|(1<<ICES1)|(1<<CS10);
//div 1
10
}
11
12
ISR (TIMER1_CAPT_vect) {
//прерывание захвата сигнала на входе ICP1
13
TCNT1=0;
14
if
(TIFR1&(1<<TOV1)){ TIFR1|=1<<TOV1;
if
(ICR1<100) { int_tic++;} }
15
tic= ((uint32_t)int_tic<<16)| ICR1 ;
//подсчёт тиков
16
int_tic=0;
17
}
18
19
ISR (TIMER1_OVF_vect) {
//прерывание для счёта по переполнению uint
20
int_tic++;
//считать переполнения через 65536 тактов
21
if
(int_tic > 244)
//если на входе пусто более секунды
22
{tic=0; int_tic=0;}
//то обнулить счётчики
23
}
24
void
loop
(){
25
Serial
.println(tic);
26
27
}
Спасибо, помогло!!!
Доброго дня, уважаемые форумчане, кто сталкивался с двигателями SIEMENS от СМА ? Опознать по надписям на торце движка - сложно
По словам продавца - движок коллекторный+асинхронный, стоял на машине 6 кг отжим 800 об.
Отключил разъёмы от щёток, прозвонил - получилось так:
Подозрение вызывает 4 и 5 контакты - звонятся накоротко - может термопредохранитель? но в инете есть похожий движок -
у него 4 и 5 - обмотка >> http://monitor.espec.ws/section44/topic197135.html
Непонятно как-то...
Подключил к сети через утюг - 5 и 2 - крутит оборотов 300 - останавливается рукой. 5 и 3 тоже самое.
Что-то я упускаю.
Доброго дня, уважаемые форумчане, кто сталкивался с двигателями SIEMENS от СМА ? Опознать по надписям на торце движка - сложно
По словам продавца - движок коллекторный+асинхронный, стоял на машине 6 кг отжим 800 об.
Отключил разъёмы от щёток, прозвонил - получилось так:
Подозрение вызывает 4 и 5 контакты - звонятся накоротко - может термопредохранитель? но в инете есть похожий движок -
у него 4 и 5 - обмотка >> http://monitor.espec.ws/section44/topic197135.html
Непонятно как-то...
А у вас нету фото вашего статора без якоря? Что-то мне подсказывает, что это не обычные полюсные катушки...
В разобраном виде
В разобраном виде
встречал в сети такие движки, но в руках не держал. Это не обычный движок. а как бы 2 в одном. Но вот как его подключить я не знаю. По моему где то на чипмейкере такие обсуждались.
Спасибо, Александр за участие - пробую на чипмейкере.
Нашёл, что я упускаю:
Сопротивление между контактами
1-3 4,5Ом
1-2 4,5Ом
2-3 4Ом - (вместо предпологаемых 9 Ом) - значит ещё одна обмотка
Приделал костыль, попробуйте:
Снова обращаюсь к вам за помощю.
Регулятор доведён до конца и есть уже в двух вариантах. Но и всё же меня не до конца устраивает.
Постараюсь пояснить. На пине Д2 идёт прерывание - отслеживаем переход сети через ноль. В момент перехода выполняется команда "time = micros();" и всё. А далее в основном цыкле мы просто проверяем пора или не пора открывать симистор "if(tims >= (time + dimtime))"
И всё происходит хорошо в регуляторе без экрана. Но у нас есть экран и мы выводим на него информацию 2 раза в секунду. И в это время происходят какие то задержки и симистор открывается не правильно.
В общем нужно задать таймер на открытие симистора прямо в прерывании. чтоб экран нам не мешал.
001
#include <LiquidCrystal.h> // библиотека экрана
002
003
LiquidCrystal lcd(3,4,5,9,10,11);
// пины экрана
004
005
float
kImp = 120;
//ввести кол-во импульсов на 10 оборотов
006
007
int
AC_LOAD = 17;
// пин управления симистором
008
volatile
int
dimming = 120;
// время задержки от нуля 7 = максимально, 120 = минимально
009
010
volatile unsigned
long
time;
// время в микросекундах срабатывания датчика нуля
011
unsigned
long
tims;
// переменная показаний времени
012
013
unsigned
long
currentTime;
//временные переменные для таймера экрана
014
unsigned
long
loopTime;
015
016
017
018
volatile
int
holl = 0;
//переменная срабатываня датчика
019
020
volatile
int
sp = 0;
//переменная суммы срабатываний датчика
021
022
volatile unsigned
int
int_tic;
//переменные для подсчёта времени между импульсами.
023
volatile unsigned
long
tic;
024
volatile
int
t = 0;
//минимальное время импульсов +1
025
int
r1 = 18;
// Реле на А1
026
int
r2 = 19;
// реле на А2
027
028
029
void
setup
()
030
{
031
pinMode(r1, OUTPUT);
// Назначаем выходом
032
pinMode(r2, OUTPUT);
//назначаем выходом
033
digitalWrite(r1, LOW);
// Оставляем невключеным
034
digitalWrite(r2, LOW);
//оставляем невключенным
035
036
037
pinMode(AC_LOAD, OUTPUT);
// назначаем выходом
038
attachInterrupt(0, zero_crosss_int, RISING);
// прерывание по пину 2
039
040
lcd.begin(16, 2);
//дисплей 16символов 2строчки
041
lcd.setCursor(0,0);
042
043
lcd.write(
"Si:"
);
//в верхней строке выводим время задержки
044
045
lcd.setCursor(0,1);
046
047
lcd.write(
"Re:"
);
// В нижней выводим показания датчика
048
049
lcd.setCursor(9,1);
050
051
lcd.write(
"S:"
);
// В нижней выводим фактичесские обороты
052
053
pinMode (8,INPUT);
// вход сигнала ICP( №8 only для atmega328)
054
//настройка 16 бит таймера-счётчика 1
055
TCCR1B = 0; TCCR1A = 0; TCNT1 = 0;
056
TIMSK1 = (1<<ICIE1)|(1<<TOIE1);
//создавать прерывание от сигнала на пине ICP1
057
TCCR1B = (1<<ICNC1)|(1<<ICES1)|(1<<CS10);
//div 1
058
}
059
060
ISR (TIMER1_CAPT_vect) {
//прерывание захвата сигнала на входе ICP1
061
tic= ((uint32_t)int_tic<<16)|TCNT1 ;
//подсчёт тиков
062
ICR1=0; int_tic=0; TCNT1=0;
063
sp = sp +1 ;
// для подсчёта оборотов в минуту.
064
holl =holl+ 1;}
// после каждого срабатывания датчика холл+1
065
066
ISR (TIMER1_OVF_vect) {
//прерывание для счёта по переполнению uint
067
int_tic++;
//считать переполнения через 65536 тактов
068
if
(int_tic > t) {tic=0; int_tic=0;}
//если на входе пусто более минимального времени то обнулить счётчики
069
if
(int_tic > 500) {dimming =130;}
// если стоим 2 секунды, то сбрасываем напряжение.
070
}
071
072
// the interrupt function must take no parameters and return nothing
073
void
zero_crosss_int()
// function to be fired at the zero crossing to dim the light
074
{
075
time = micros();
076
077
}
078
079
void
loop
() {
080
081
082
int
val = analogRead(A0);
083
084
if
(val > 0){
// если регулятор больше 0
085
digitalWrite(r1, HIGH);
086
dimming =map(val, 0, 1023, 120, 7);
087
}
088
else
{
089
dimming =120;
//Если регулятор на 0 то время задержки 120
090
digitalWrite(r1,LOW );
091
}
092
093
dimming = constrain(dimming,7,120) ;
// Следим чтоб время задержки было не меньше 7 и не больше 130
094
int
dimtime = (75*dimming);
// For 60Hz =>65
095
tims = micros();
// считываем время, прошедшее с момента запуска программы
096
if
(tims >= (time + dimtime)){
//если время больше или равно времени срабатывания нуля + время задержки
097
098
digitalWrite(AC_LOAD, HIGH);
// открываем симистор
099
delayMicroseconds(10);
// задержка 10 микросекунд (для 60Hz = 8.33)
100
digitalWrite(AC_LOAD, LOW);
// выключаем сигнал на симистор.
101
}
102
else
{}
103
104
105
106
107
// Для вывода значений на дисплей 2 раз в секунду
108
109
currentTime = millis();
// считываем время, прошедшее с момента запуска программы
110
if
(currentTime >= (loopTime + 500)){
// сравниваем текущий таймер с переменной loopTime + 0,5 секунд
111
112
// выводим показания датчика
113
114
lcd.setCursor(3,0);
115
lcd.print(dimming);
116
lcd.print(
" "
);
// выводим время задержки на экран.
117
118
lcd.setCursor(3,1);
119
lcd.print(val);
120
lcd.print(
" "
);
121
122
123
lcd.setCursor(11,1);
124
125
lcd.print (
int
(sp*(1200/kImp)));
// выводим средние обороты на экран.
126
lcd.print(
" "
);
127
sp = 0;
128
129
loopTime = currentTime;
// в loopTime записываем новое значение
130
}
131
}
Возможно этот пример вам поможет:
01
#include <CyberLib.h>
02
03
void
setup
()
04
{
05
Serial
.begin (115200);
06
D13_Out;
07
StartTimer1(Led_Blink, 1000000);
// раз в секунду
08
}
09
10
void
Led_Blink()
11
{
12
D13_Inv;
13
Serial
.println ( millis() / 1000);
14
}
15
16
void
loop
() {
17
18
Serial
.println (
" delay start"
);
19
delay (10000);
// 10 секунд
20
Serial
.println (
" delay end"
);
21
22
23
}
И всё происходит хорошо в регуляторе без экрана. Но у нас есть экран и мы выводим на него информацию 2 раза в секунду. И в это время происходят какие то задержки и симистор открывается не правильно.
В общем нужно задать таймер на открытие симистора прямо в прерывании. чтоб экран нам не мешал.
Скоро буду собирать подобное устройство, уже вагончик прочитал - все слабовато. В общем для себя решил использовать 2 контроллера. Один рулит, другой управляет и показывает. Даром, что устройство не серийное и ценник не сверх меры. Пока обдумываю вариант с быстрым обменом данных 2 или 4 байта. Поделиться нечем, кроме как идеей.
Возможно этот пример вам поможет:
Спасибо, попробую.
зы. Прошу не писать про покупку готового регулятора - это не спортивно и не интересно получить сразу железку которая будет работать при первом же включении.
Очень даже согласен и более чем солидарен: не важен результат - важен сам процесс. Хотя если логически умозаключить, то - основной физической силой, движущей весь процесс, как раз и является сам результат.
Всем привет , тема еще живая ? Тоже долбаюсь с регулятором для мотора от стиралки на семисторе . Прочитал всю тему , нет ни где алгоритма работы . Я по входу ICP измеряю длинну импульса от HIGH до LOW. Потом в прерывании по зеро заряжаю таймер для открытия симистора , под нагрузкой работает нормально , без , плавает .
Всем привет , тема еще живая ? Тоже долбаюсь с регулятором для мотора от стиралки на семисторе . Прочитал всю тему , нет ни где алгоритма работы . Я по входу ICP измеряю длинну импульса от HIGH до LOW. Потом в прерывании по зеро заряжаю таймер для открытия симистора , под нагрузкой работает нормально , без , плавает .
А где обратная связь?
Использую мегу16 , отладка JTAGICE в студии . Сигнал от тахо идет на ICP(PD6) , ZERO на INT0(PD2) , выход на симистор PB3 . В прерывании захвата измеряю длинну импульса , в прерывании по зеро заряжаю таймер 0 на открытие симистора , все числа 8 бит .
Расчет времени открытия симистора я так понимаю можно делать хоть в main , хоть в обработчиках ZERO или ICP .
Всем привет , тема еще живая ? Тоже долбаюсь с регулятором для мотора от стиралки на семисторе . Прочитал всю тему , нет ни где алгоритма работы ..
А чем не устраивает готовый, рабочий вариант?
https://www.youtube.com/watch?v=TEBklpEF-HA&t=635s
Как готовое устройство мне не интересно , я бы купил его да и все . Просто хочу разобраться с пид регулированием , нахождение ошибки и тд. , интересен сам алгоритм , последовательность так сказать . Сама формула и какие измерения времени в нее вставлять , и регулятор не понятно то ли ПИД то ли просто ПД . Разобравшись с этим можно применять к другим моторам , инверторным например , их от стиралок тоже много , он и компактней и тише и мощнее .
Кто-нибудь сможет внести ясность? Если управлять коллекторным двигателем со щетками от стиральной машины, при выпрямлении тока после диодного нужно ставить высоковольтный электролит или нет? И на что повлияет его установка, кроме как повышения действующего значения напряжения?
Шим сигналом через полевик
Зачем полевик и конденсатор , можно просто одним симистором .
Зачем вообще писать не по существу
Просто я не видел в платах от стиральных машин полевика и конденсатора .
Это же не означает, что таких схем управления не существует
Тебе нужно официально разрешение его не ставить, потому, что тебе лень его заказать, а дома нет? ;))
Сорян, у меня печать в стирке, официального разрешения дать не могу. Но на словах - разрешаю, если ШИМ у тебя выше 500Гц. (вот тока не надо спрашивать: "поче-мууу?" Ответ: "поче-кря".)
(Ппц, какие остроумные вопросы пошли! Я ху..ю, без баяна!)
Конденсатор то есть. И заказывать не нужно даже. А вот поче-муууу ставить или не ставить очень интересно.
а какие параметры конденсатора, который у тебя в наличии..?
450V 470uF
он будет эффективен при нагрузке до 300 Ватт. на обмотку двигателя будет будет поступать действующее напряжение около 300 В. Мосфет нужен вольт на 800. и это только теория, на практике все это может недолго проработать...
На обмотке действующее напряжение 60-70 вольт. Оно растет при приложении нагрузки на двигатель. Мне просто вот интересно в чем заключается эффективность электролита, сама физика процесса.
схему рисуйте, иначе разговор бессмысленно продолжать. В импульсных источниках питания принято называть действующим максимальное амплитудное напряжение.
без емкости на малых оборотах сильно упадет момент на валу двигателя.
Вот такая схема. Электролит сейчас поставил на выход диодного моста, соответственно. Но каких либо изменений, чтобы прям вау, нету.
Получается если ваш двигатель и источник питания с хорошим запасом для существующей нагрузки и вы нашли оптимальную частоту шим, при этом нет высокого нагрева элементов, искрений на щетках, то вполне вероятно, что электролит не нужен...