Регулятор оборотов двигателя с обратной связью
- 1
- 2
- 3
- 4
- 5
- 6
- следующая ›
- последняя »
- Войдите на сайт для отправки комментариев
Ну вот у меня руки и дошли до ШИМ регулятора шпинделя с обратной связью. Регулировка пока что планируется через терминал. Так же как и вывод текущего состояния. По идее также будет включен обратный сигнал E-stop для станка в случае заклинивания шпинделя.
Дано:
Коллекторный двигатель постоянного тока на напряжение 48В с встроенным блестящим вентилятором на 12 лопастей :). Диапазон оборотов 0-12000 в минуту.
Оптический сенсор ON2153, даташит - http://pdf1.alldatasheet.com/datasheet-pdf/view/13605/PANASONIC/ON2153.html
На текущий момент Arduino Nano, в будущем будет Atmega8a.
Полевик IRF540N и кучка мелких деталек.
Сейчас имею следующее:
Сенсор успешно считывает обороты двигателя, но показывает ниже заявленных на максимуме (ок. 110 об/с что соответствует 6600 об/мин). ШИМ был подключен внешний примерно на 20кГц. Скетч брал из этой темы от dimax (#19): http://arduino.ru/forum/programmirovanie/kak-schityvat-chastotu-posredstvom-arduino
Только тики при выводе делил на 12. Или я не правильно понял как работает скетч? В любом случае буду писать свой так чтобы была совместимость с мегой8. Также хочу учитывать не только попадания на лопасти вентилятора, но и уход с них, тогда будет 24 отсчета вместо 12, хотя и менее равномерных.
Никак не могу продумать обратную связь. При максимуме понятно что анализировать нет смысла снижение оборотов под нагрузкой - больше на двигатель не пойдет. А вот например на половине мощности я например представляю так: известно что следующий тик должен быть не раньше и не позже определенного времени. Если тик был меньше, то понижаем на номинал ШИМ. Если по прошествии максимального времени не было тика надо ШИМ повысить. И тут возникает вопрос - на сколько? И как часто опрашивать после этого был тик или нет для дальнейшего повышения ШИМ? Особенно это касается низких оборотов, до 6000 когда время тика будет очень большим и двигатель легко тормознуть.
зы. Прошу не писать про покупку готового регулятора - это не спортивно и не интересно получить сразу железку которая будет работать при первом же включении.
Где-то видел регулировку с обратной связью и для движков постоянного тока и для переменного. Сделано на какой-то микросхеме (в смысле мозги), но не микроконтроллере. Если хочешь, ссылки поищу.
...И тут возникает вопрос - на сколько? И как часто опрашивать после этого был тик или нет для дальнейшего повышения ШИМ? Особенно это касается низких оборотов, до 6000 когда время тика будет очень большим и двигатель легко тормознуть.
, вообще-то это достаточно муторный расчет: оценить силы, моменты, записать дифф.уравнение, оценить постоянные времени, резонансную частоту и т.д. Тем боле, что все это надо делать, подставляя реальные физические характеристики конкретного двигателя.
Ну и от тогог, как именно реализован ШИМ, тоже зависит.
Сильно подозреваю, что придется не измерять время между импульсами, а считать количетво импульсов.
Мне кажется что все проще. Ну это так....теоретически. Есть заданные обороты двигателя, есть обороты, фактические...вот только что измеренные. Быстренько сравниваем и, в зависимости от величины разницы быстренько даем увеличение или уменьшение пропорционально разнице. Разница небольшая поддали немного, не хватило - добавили еще.
Можно импульсы считать, а можно и напряжение измерять, если датчик электомагнитный.
Как-то так.
Пока прикладываю скетч по анализу оборотов, правда сильно сырой. Но обороты считает неплохо.
01
volatile unsigned
int
tic = 0;
02
unsigned
int
tic_now = 0;
03
unsigned
long
micros_last, micros_now, micros_delta;
04
void
setup
() {
05
// put your setup code here, to run once:
06
Serial
.begin(9600);
07
pinMode(2, INPUT);
08
attachInterrupt(0, tics, CHANGE);
09
micros_last = micros();
10
}
11
12
void
loop
() {
13
// put your main code here, to run repeatedly:
14
micros_now = micros();
15
micros_delta = micros_now - micros_last;
16
if
(micros_delta > 100000){
17
tic_now = tic;
18
tic = 0;
19
Serial
.println( tic_now * 600000 / micros_delta * 100 / 24);
20
micros_last = micros_now;
21
}
22
}
23
24
void
tics() {
25
tic++;
26
}
Хочется реализовать именно на МК регулятор.
По поводу анализа и регулировки оборотов. Вся проблема в том что если шпиндель на минимальных оборотах (около 1000 об/мин) врезается в деталь, то он может резко остановиться полностью и замера оборотов не произойдет. Именно по этой причине нужно будет замерять времяя каждого тика. Но с какой скоростью увеличивать ШИМ и с каким шагом? Можно конечно экспериментально выяснить именно по минимальным оборотам (тормознув рукой). Но может кто знает как можно рассчитать это все дело и объяснит логику рассчета.
метка на шпинделе ( датчик Холла , фотоинтерраптор или др..... )
с метки - сигнал на прерывание и на анализ....
именно dimax имеет или умеет написать код анализа RPM через счётчик МК
:)
Вся проблема в том что если шпиндель на минимальных оборотах (около 1000 об/мин) врезается в деталь, то он может резко остановиться полностью......
Значит ХЕРОВЫЙ токарь !!!!!!!!!!!! :)-
Походу, нужен пид регулятор.
Как реализуется, написано тут:
http://robot-develop.org/archives/2833
и тут: тыц
Фрезер ЧПУ и работает согласно программе. Если будет 1000 об/мин, подача 200 мм/мин, фреза 2 мм однозаходная, режет оргстекло, глубина врезания 1 мм. Теперь считаем сколько будет резать материала за оборот: 200 мм/мин / 1000 об/мин = 0.2 мм/об. Поскольку фреза однозаходная, то рез получается 0.2 мм на режущую кромку (1/10 диаметра). Рез небольшой, но усилие немалое (попробуйте от оргстекла срезать уголок хотя-бы в полмиллиметра одним резом и поймете какое усилие нужно приложить. Но на таких оборотах я могу пальчиками тормознуть шпиндель (правда за вентилятор, а не за фрезу - мне пальчики еще пригодятся). Обороты упадут конечно до 0 не моментом - хотя бы пару тиков двигатель успеет сделать из 24 на оборот. Вот за эти пару тиков и надо будет понять что появилась нагрузка.
Приведу еще немного цифр для того чтобы был понятен порядок времени оперирования.
Обороты планируется от 1000 до 12000 (замер показал реальную частоту 11800).
На минимальных оборотах соответственно максимальные тайминги. 1000 об/мин -> 16.7 об/сек (Гц) -> 0.06 сек/об -> 60 мс/об -> 2.5 мс/тик (или 5 мс за 2 тика, т.к. одиночные тики будут неравномерны).
На максимальных оборотах соответственно минимальные тайминги. 11800 об/мин -> 196.7 об/сек (Гц) -> 0.0051 сек/об -> 5.1 мс/об -> 0.212 мс/тик (или 0.424 мс за 2 тика).
Как видите на минимальных оборотах можно относительно неспешно воздействовать (сотни микросекунд на принятие решения), а вот на близких к максимальным уже не так много времени остается на раздумья. Но с другой стороны при минимальных оборотах если за 5 мс не было двух тиков (но 1 уже точно был - это условие что шпиндель все-таки не встал).
Также есть условие что если вдруг мощность на шпинделе 100%, а он развивает менее 50% оборотов за определенный промежуток времени (например 0.1 с) должен сработать сигнал аварийной остановки станка "E-Stop". Данное условие по нескольким тикам не сделать, какой бы двигатель хороший не поставил он будет разгоняться какое-то время. Только надо будет проанализировать это время.
Sloper, спасибо. Очень похоже на то что надо.
Пытаюсь запустить ШИМ на увеличенной частоте. Порт 9 на ардуино нано (аппаратный PB1).
01
String inputString =
""
;
02
byte
shim = 0;
03
boolean stringComplete =
false
;
04
05
void
setup
() {
06
// put your setup code here, to run once:
07
Serial
.begin(9600);
08
TCCR1A = (1 << COM1A1) | (1 << WGM10);
09
TCCR1B = (1 << CS10);
10
OCR1A = 0x00;
11
}
12
13
void
loop
() {
14
// put your main code here, to run repeatedly:
15
while
(
Serial
.available()) {
16
char
inChar = (
char
)
Serial
.read();
17
if
(inChar ==
' '
) {
18
stringComplete =
true
;
19
shim = inputString.toInt();
20
}
21
inputString += inChar;
22
}
23
if
(stringComplete) {
24
stringComplete =
false
;
25
Serial
.print(
"Received - "
);
26
Serial
.print(shim);
27
Serial
.print(
"|"
);
28
Serial
.println(inputString);
29
inputString =
""
;
30
if
(shim <= 255) {
31
OCR1A = shim;
32
// analogWrite(9, shim);
33
}
34
}
35
}
analogWrite срабатывает нормально, а вот через регистры не работает. Чего ему не хватает?
зы. сейчас на ШИМ подключен светик через полевик чтобы видеть работает или нет.
Что-то я не вижу в коде, чтобы PB1 был проиничен, как выход.
http://arduino.ru/forum/programmirovanie/enkoder-i-dc-motor
http://arduino.ru/forum/programmirovanie/regulyator-oborotov-kollektorno...
Спасибо, Максим. Там уже почти готовое решение. Разве что я не хочу использовать analogWrite из-за его долгой отработки (2мс).
По скетчу. Он еще может мне пригодится и для другого. В analogWrite я не обязан указывать порт как вывод, здесь нужно указать явно? В примере для atmega8 не было инита (http://avrlab.com/node/90). Попробую с инитом.
В примере, в строке 22, как раз есть инит.
Да, действительно, инита и не хватало.
Теперь возникла другая проблема. На полных оборотах вроде правильно показывает частоту (около 12000 RPM), а при понижении начинает безбожно врать :). Видать наводки от ШИМ в катушке генерятся. Если повесить конденсатор между принимающей сигнал ногой и землей, то поможет? И какой лучше выбрать конденсатор (тип, емкость)?
nevkon, скетч из #4 ? Я бы не советовал пользоваться прерываниями 0 и 1 для этой задачи. Слишком много глюков при их использовании, лучше использовать таймеры.
Теперь возникла другая проблема. .............................
nevkon, посмотрите ссылочку про регулировку оборотов коллекторного двигателя. Есть документация по регулировке двигателей постоянного и переменного тока. Мне показалось очень интересно Минимальные обороты с сохранением момента на валу.
http://www.youtube.com/watch?v=Y9BvqMI7Eec
Dimax, в чем заключаются глюки прерываний? Ваш варианнт рассчета частоты я не осилил (не понял как он работает).
У меня датчик на отражение светит на вентилятор шпинделя. У шпинделя 12 лопастей. Как изменить скетч (тот который я указывал в 1 сообщении) чтобы он измерял частоту при этих условиях?
Если что речь шла об объединенном скетче из #4 и #9. Все-же кажется проблема в наводках - при использовании внешнего ШИМ все показывало вполне адекватно. А здесь значения получаются завышенными. Отличие еще в том что при отдельном ШИМ сигнале замер производился с рук и сигнальный провод был далеко от шпинделя, а теперь он проходит рядом.
nevkon, глюки заключаются в ложных срабатываниях. Достоверно не известно при каких условиях это возникает, соответсвенно неизвестно как лечить. Я лично сталкивался, что схема, и использованием int0 собранная на макетке с бородой из висящих проводов работала без проблем, а собранная красиво на печатной плате -глючила.
Если 12 срабатываний на оборот -то результат делить на 12. Что, какие то с этим проблемы?
Она занижает обороты, пробовал на 12 делить. Хотя в логике сейчас на свежую голову разобрался, попробую еще раз, может получится.
Плохо что таймер занимает, даже 2.
Ура! Мои экперименты дали результат. В виде сгоревшего полевика :)
ПИ регулятор Максима работает с небольшой доработкой, но пока еще плохо. При попытке тормознуть шпиндель он обжег мне палец и сжег полевик по ходу дела, ну и ... открылся навсегда :) Обороты жаль не успел получить стабильные. Хочу переработать так чтобы обороты считались по скетчу от Dimax в этом регуляторе. Остался еще один полевик со схожими характеристиками, но и он слабоват. В следующий раз учту что эти не рассчитаны на такой ток (irfs640a vs irf630a, всего то на 9А). В рабочей то лошадке поставлю irf540n, а эти халявные откуда-то достались.
Вот скажите если в характеристике указано в районе 1000В и сопротивление DS около 1 Ома сильно будет просадка для двигателя?
Dimax, объясни пожалуйста что происходит в 19 строке?
01
volatile unsigned
int
int_tic=0;
02
volatile unsigned
long
tic;
03
04
void
setup
(){
05
Serial
.begin(9600);
06
pinMode (5,INPUT);
// вход сигнала T1 (only для atmega328)
07
TCCR2A=1<<WGM21;
//CTC mode
08
TIMSK2=1<<OCIE2A; OCR2A=124 ;
//прерывание каждые 8мс
09
TCCR2B=(1<<CS22)|(1<<CS21)|(1<<CS20);
//делитель 1024
10
TCCR1A=0; TIMSK1 = 1<<TOIE1;
//прерывание по переполнению
11
TCCR1B = (1<<CS10)|(1<<CS11)|(1<<CS12);
//тактировани от входа Т1
12
}
13
14
ISR (TIMER1_OVF_vect){ int_tic++; }
15
16
ISR (TIMER2_COMPA_vect){
17
static
long
n=1;
18
if
(n==125){
19
tic= ((uint32_t)int_tic<<16) | TCNT1;
//сложить что натикало
20
//tic=int_tic;
21
int_tic=0;
22
TCNT1 = 0; n=0;
23
}
24
n++;
25
}
26
27
void
loop
(){
28
delay(1000);
29
Serial
.print(tic/12);
30
Serial
.print(
" | "
);
31
Serial
.println(int_tic);
32
}
Показывает десятки оборотов при низких (500-2000 в реале), максимум 200 проскочило при запуске на максимальных. А int_tic всегда 0. Не правильно обращаюсь к переменной?
nevkon, переменная int_tic инкреминируется если входящая частота выше, чем 65536 Герц. Если у вас 12 срабатываний на один оборот, то на 12т. оборотов частота будет 144000Гц. Ещё важно помнить что скорость реакции данного метода измерения -1 секунда. Нужно для проверки запустить мотор на макимальных оборотах, и убедится что они показывают правильно. (144000 или если /12 то 12000) Если так, то фотодатчик работает исправно, и можно думать дальше.
Уже пятый раз выкладываю аналоговый регулятор. Мне кажется, самое простое решение. Немного освобожусь, буду испытывать. Пацаны показывают, работает изумительно. Уверен, что и цифровое регулирование может быть не хуже.
Скетч работает правильно и частоту показывает правильно. Это я тупанул. Он показывает ведь в том виде не RPM, а RPS. Результат еще на 60 надо умножить. Завтра вечером проверю на максимальных оборотах - сегодня не буду беспокоить соседей.
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 -будет частота в герцах.
Спасибо, вечером попробую. А можно на второй таймер перекинуть, а то с первого хочется ШИМ получить (если не ошибаюсь по одному таймеру на 2 ноги обеспечивают ШИМ сигнал)?
F_CPU системная переменная?
nevkon, на atmega328 только один 16 битный таймер с такой возможностью. А шим как раз можно с любого таймера снять. F_CPU да, системная константа.
А мне и 8 битного хватит если с переполнением работать. За секунду менее 2500 отсчетов всего будет даже на максимальных оборотах. Только с какой ноги можно тактировать второй таймер? Скетч я сам подправлю.
nevkon, ну я ж написал, что только один таймер с такой возможностью, он имеет ICP (Input Capture Pin) . На других так просто не сделать, только с усложнением алгоритма, и подключением внешних прерываний.
Понял, спасибо за терпеливое объяснение.
Здравствуйте, Все! Принимайте в новички (чайники).
Очень интересуюсь данной темой. Не просто очень, а очень-очень. В 17 сообщении есть ссылка на видео. и там на первых секундах упоминается Шенрок Александр. Так вот, это я и есть. Упоминается одно из моих видео по данному регулятору. Например это: https://www.youtube.com/watch?v=vePBpGuqKrY или это: https://www.youtube.com/watch?v=DMilSM--rMg На таких регуляторах я уже сделал два станка и они оба очень хорошо работают. Но это всё аналог. А хотелось бы цыфру. С возможностью вывода оборотов на дисплей и добавлением, при необходимости других датчиков (термо, силы тока ...). Но сами понимаете, изучать программирование ради одной программы как-то не очень. Хотя я честно пытался. В результате и нашел данную тему. Получилось поморгать диодами, подключить потенциометр и через ШМИ порегулировать яркость лампочки на 220В через мосфет. Подключить дисплей и вывести символы.
Теперь конкретно. Нужна помощ в написании скетча. Так как на прерываниях я срезался. И не отдельные куски, а полностью весь от начала до конца. Железяки и опыты мои. Идеи ваши. Если нужно что-то взамен, пишите, обсудим.
С уважением Александр.
К сожалению пока что у меня времени нет на работу над регулятором, поэтому ничего не двигалось с того времени.
Здравствуйте, Все! .........................................
Здравствуйте, sany_sch. Очень рад видеть Вас на форуме.В моих планах есть изготовление Вашего регулятора, но пока руки все не доходят. Хочу сделать такой регулятор на шпиндель станочка с ЧПУ.
Мне кажется, для Вашего регулятора ни каких дополнительных примочек не требуется, как следует из видео, он прекрасно работает. А измерение оборотов, температуры и прочего можно оформить отдельным блоком. И то что ваш регулятор аналоговый, это скорее всего плюс чем минус.
Здравствуйте, Все! .........................................
В моих планах есть изготовление Вашего регулятора,
Небольшая поправочка. Он не мой. Схему нашел на чипмейкере. Просто она даёт огромные возможности двигателю, вот я её и советую всем.
Дело не в том, что она плохая. А в том, что она не так проста в изготовлении. Желающих её сделать много, но не все дружат с паяльником до такой степени. И я в том числе. Именно поэтому я и ищу альтернативный вариант. Собрать такой регулятор на ардуино намного проще. Причём каждый узел можно проверить отдельно. Подключил дисплей - залей соответствующую програмку, проверь. подключил потенциометр - проверил. И т.д. В аналоговой плате трудно найти где "накосячил".
Согласен скетч будет не простой. Но ведь так интересней. Нужно предусмотреть много нюансов, возможность быстрой перенастройки под разные максимальные и минимальные обороты, под разное количество импульсов датчика на один оборот. Слелать некую универсальность. И много людей скажет нам спасибо. Ведь это будет, своего рода как частотник для асинхронника, только намного лучше.
Вот здесь, в моём блоге, http://shenrok.blogspot.com/p/blog-page_61.html я немного порассуждал о том, какой двигатель более предпочтителен для домашних станков. Вдруг кому интересно.
Что имею:
Ардуино про мини. На пин 9 подключен мосфет 10nk60zfp . по такой схеме: http://cxem.net/arduino/arduino11.php
Двигатель из этого видео: https://www.youtube.com/watch?v=k9wLRY9qsS4 Смотреть с 14 минуты. И датчик холла, и магнит там-же.
Заливаю этот скетч, из урока Джереми, и потенциометром на пине А0 регулирую обороты от 0 до максимума.
01
int
sensePin = 0;
02
int
ledPin = 9;
03
04
void
setup
()
05
{
06
07
pinMode(ledPin, OUTPUT);
08
09
10
analogReference(DEFAULT);
11
12
}
13
14
void
loop
()
15
{
16
17
int
val = analogRead(sensePin);
18
19
int
ledLevel = map(val, 0, 1024, 0, 255);
20
analogWrite(ledPin, ledLevel);
21
22
23
}
Дисплей LCD 1602 подключен к пинам 3,4,5,6,7,8. Датчик Холла на пине 2.
Этот скетч позволяет посчитать количество импульсов за один оборот вала. И выводит информацию на экран.
01
//библиотека экрана и пины подключения
02
#include <LiquidCrystal.h>
03
LiquidCrystal lcd( 3, 4, 5, 6, 7, 8);
04
05
//пин датчика Холла
06
int
HollPin = 2;
07
08
//переменная запоминания данных датчика
09
boolean lastButton = LOW;
10
11
//переменная импульсов
12
int
impulsi = 0;
13
14
void
setup
()
15
{
16
//датчик холла вход
17
pinMode(HollPin, INPUT);
18
19
// задаём дисплей
20
lcd.begin(16, 2);
21
22
// пишем в верхней строке.
23
lcd.print(
"schitaem impulci"
);
24
25
}
26
27
void
loop
()
28
{
29
lcd.setCursor(2,1);
30
lcd.print(impulsi);
31
32
if
(digitalRead(HollPin) == HIGH && lastButton == LOW)
33
{
34
impulsi = impulsi + 1;
35
lastButton = HIGH;
36
}
37
else
38
{
39
//lastButton = LOW;
40
lastButton = digitalRead(HollPin);
41
}
42
}
У меня получилось 8 импульсов на 1 оборот.
Для начала хотелось бы вывести об\мин на экран. Или время между фронтами соседних импульсов в микросекундах.
Ребята, я всё ещё надеюсь на помощ.
загрузил такой скетч:
01
volatile unsigned
long
length = 0;
02
volatile unsigned
long
start_time = 0;
03
//время между импульсами
04
05
void
setup
(){
06
attachInterrupt(0, impuls, RISING);
07
Serial
.begin(9600);
08
}
09
10
void
loop
(){
11
12
}
13
14
// Подпрограмма прерывания
15
void
impuls(){
16
length =micros()-start_time;
17
start_time = micros();
18
19
Serial
.println(length);
20
}
монитор орта выдаёт такое:
01
40128
02
280
03
43596
04
280
05
43408
06
280
07
52520
08
276
09
63016
10
280
11
123968
12
324
13
1462776
14
376
15
69756
16
280
17
50280
18
280
19
43688
20
276
21
39192
22
280
23
49944
24
280
25
67960
26
276
27
1172728
28
376
29
445292
30
328
31
906572
32
324
33
643440
34
324
35
527348
36
328
37
931304
38
328
Тоесть каждое второе срабатывание ложное. Стягивающий резистор ничего не даёт. Замена RISING на FALLING тоже. При прежнем скетче, где просто считались импульсы ложных срабатываний небыло.
Да, вал вращаю от руки, большие числа верные, маленькие нет. Как избавиться?
sany_sch, скорее всего у вас типовой глюк ложного срабатывания внешнего прерывания INT0/1. Радикальный выход -сделать на таймере. У него есть возможность использовать встроенный антипомеховый алгоритм, + сам метод гораздо меньше загружает микроконтрроллер. Посмотрите тут, я уже давал пример.
sany_sch, скорее всего у вас типовой глюк ложного срабатывания внешнего прерывания INT0/1. Радикальный выход -сделать на таймере. У него есть возможность использовать встроенный антипомеховый алгоритм, + сам метод гораздо меньше загружает микроконтрроллер. Посмотрите тут, я уже давал пример.
Спасибо. Хоть и мало что понял, но буду углубляться. Я так понял, что для моей частоты этого достаточно.
Но ещё вопрос по прерываниям. А если использовать Триггер Шмитта, Это поможет избежать ложных срабатываний?
Надо бы отделять "мух от котлет".... слаботочную часть от сильноточной оптопарами.
Так и собирался сделать после испытаний.
Не любят входы прерывания пологие фронты, однозначно триггер шмитта должен быть.
Нарисуйте пожалуйста схему как и какой подключать.
И ещё вопрос. А если мы будем програмно игнорировать импульсы короче определённого времени. Например мой двигатель на переменке может развить 10тыс об\мин. Я даю постоянку, обороты возрастут до примерно 12тыс об\мин. Делим на 60 = 200 оборотов\сек * на 8 импульсов за оборот = 1600 импульсов в сек. 1000000\1600=625 микросекунд на один импульс при максимально возможных оборотах двигателя. Так вот, все значения меньше этого будем игнорировать, а ещё лучше прибавлять к большему. Такой вариант пройдёт?
Но ещё вопрос по прерываниям. А если использовать Триггер Шмитта, Это поможет избежать ложных срабатываний?
Моё мнение -не поможет. Помеха лезет через всё что угодно, не факт, что именно через тот вход, на который вы подали сигнал с датчика холла. Она может идти например по земляной шине. Попробуйте то, что я предложил, это радикальное средство.
Моё мнение -не поможет. Помеха лезет через всё что угодно, не факт, что именно через тот вход, на который вы подали сигнал с датчика холла. Она может идти например по земляной шине. Попробуйте то, что я предложил, это радикальное средство.
Я сразу же вчера попробовал. загрузил как есть, полезла куча цифр. Датчик на пин 8. Но у меня про мини, а там по даташиту на прерываниях только 2 и 3. Но цифры пошли. Я так понимаю частота в герцах. Поменял , как вы писали в нижней строке, F_CPU/tic на tic * (1/F_CPU) на мониторе порта пошли 0,00 с такой быстротой, что я не смог ничего больше залить в свою ардуинку. Еле-еле всё исправил. сижу пытаюсь разобраться что у вас к чему. Так что пытаюсь, но паррлельно думаю и о других вариантах. Ваш способ может выводить время импульса в микросекундах?
Тут как бы и рисовать-то нечего. Между датчиком и входом прерывания нужно поставить триггер шмитта, например CD40106. Фронты должны быть короче 1 мкс.
Спасибо огромное. Просто раньше о таком и не слышал. не знал с чего начать. Маркировка даёт почти всё. Спасибо.
Создавать себе проблемы, а потом героически их преодолевать...
Так мы по другому не можем. Проблемы, они сами создаются. А я хочу их решить не просто в конкретно моём случае, а так, чтоб те кто шел по нашим с вами стопам, о них просто не знали. Это -же не игрушка, а нужная для самодельщиков вещ.
Одна очевидная проблема уже заложена:
Проблема не в полевике, а в том, что пальцем тормозил. Предохранитель 5 А по входу решит роблему сгораний 10 А полевика на хорошем радиаторе. И защитит 2А двигатель. На моей аналоговой плате предохранитель 6А в период исытаний и отладки горел не однократно. На токарном станке по дереву - ни разу! Вот станок: https://www.youtube.com/watch?v=LZ8pQndz_ys
sany_sch, канэчна! Вот вам в микросекундах и медленно :)
1
void
loop
(){
2
Serial
.print (
"Period="
);
3
Serial
.print((
float
)tic * 0.0625 );
4
Serial
.println (
" uS"
);
5
delay(300);
6
}
Спасибо. Буду пробовать.
sany_sch, канэчна! Вот вам в микросекундах и медленно :)
1
void
loop
(){
2
Serial
.print (
"Period="
);
3
Serial
.print((
float
)tic * 0.0625 );
4
Serial
.println (
" uS"
);
5
delay(300);
6
}
Dimax, с этой частью всё понятно. выводим тик умноженный на коэфициент и делаем задержку. Но, что -то у меня не складывается. чем меньше обороты, тем меньше число. Если это микросекунды между фронтами то должно быть наоборот.
Не могли бы вы прокоментировать всю программу где как и что получается и берётся. Для "чайника" так сказать. Чтоб я разобрался. И ещё, обязательно использовать пин8 или можно любой, пин 2 например?
sany_sch, в программе всё прокомментировано. Такого что б чем меньше обороты -тем меньше число быть не должно. Этот скетч измеряет период сигнала очень точно, проверено не раз. на этом принципе работают частотомеры. Проверьте на осциллографе что выдаёт ваш датчик, на вход нужно подавать чёткие ТТЛ-лог. уровни. Пин не меняется, он жёстко привязан к входу "Input Capture Pin" таймера.
sany_sch, в программе всё прокомментировано. Такого что б чем меньше обороты -тем меньше число быть не должно. Этот скетч измеряет период сигнала очень точно, проверено не раз. на этом принципе работают частотомеры. Проверьте на осциллографе что выдаёт ваш датчик, на вход нужно подавать чёткие ТТЛ-лог. уровни.
Прокоментировано хорошо, но для тех кто понимает.
Буду спашивать. Что такое
tic
в чём измеряется? Я так понимаю это количество тактов между фронтами импульсов. Сколько тиков в секунде?Осцилограф буду спрашивать. Найду - посмотрю.