Jump to content
InSides

Turntable Tachometer / Controller

Recommended Posts

Унапређење #1

Имплементација Timer2_Counter библиотеке за повећање прецизности система.

Позадина

Код који сам објавио се базира на коришћењу micros() функције (референца овде), која враћа укупни број микросекунда протеклих након иницијализације Ардуина. Код 16MHz Ардуина (као Нано које сам користио за развој) ова функција има резолуцију од 4 микросекунди.

То је ограничење стандардних Ардуино поставки. Постоји начин да се та резолуција повећа, али то изискује реиницијализацију интерних Atmega тајмера, које повлачи губитак других функција.

Један приступ је имплементација екстерне библиотеке Timer2_Counter која повећава резолуцију на 0.5 микросекудни. Губитак функционалности је, рецимо, занемарљив, али је библиотека лиценцирана под услове GPL-а, што повлачи нову шему лиценцирања целог пројекта.

Рачунице

Креирао сам малу debug рутину која на свако окидање, штампа следеће:

  1. Број протеклих микросекунди при задњем окидању тог окидача, по стандардној функцији;
  2. Број протеклих микросекунду при претпосљедњем окидању тог окидача, по стандардној функцији;
  3. Прерачунати RPM, по стандардној фукцији;
  4. RPM након израмњивања, по стандардној фукцији;
  5. Број протеклих микросекунди при задњем окидању тог окидача, по функцији више резолуције;
  6. Број протеклих микросекунду при претпосљедњем окидању тог окидача, по функцији више резолуције;
  7. Прерачунати RPM, по функцији више резолуције;
  8. RPM након израмњивања, по функцији више резолуције; и,
  9. Процентуална разлика између вредности функција.

Након стотинак циклуса, резултат изгледа овако (поставио сам само пет линија да не би порука била предугачка):

Ticks N1	Ticks O1	Calculated1	RPM1	Ticks N2	Ticks O2	Calculated2	RPM2	Difference

3675316		1875240		33.33192599	33.33	3675318		1875238		33.33185192	33.33	0.000222%
4126036		2325948		33.33170378	33.33	4126038		2325946		33.33162972	33.33	0.000222%
4576116		2776136		33.33370371	33.33	4576118		2776134		33.33362963	33.33	0.000222%
5024092		3223924		33.33022251	33.33	5024094		3223922		33.33014845	33.33	0.000222%
5475392		3675316		33.33192599	33.33	5475394		3675314		33.33185192	33.33	0.000222%

Разлика је 0.000222%, константно. Ово, по мени, показује:

  1. Да је drift минималан, или малтене непостојећи (разлика је константно иста); и,
  2. Да је разлика у прецизности тако мала да се манифестује тек у четвртој децимали, и то за вредност 1 (0.0001).

Закључак

Не вреди имплементирати, за овај склоп, библиотеку која повећава резолуцију micros() функције.

Бонус

Када сам референцирао micros() функцију на почетку поруке, потсетио сам се да се излазна вредност ресетира на 0 након ~71 минута (функција враћа unsigned long вредност).

Преглед раније верзије кода је показао да се овај overflow у коду не третира нарочито добро и може да узрокује прекид фунционалности тахометра.

Корегирано у задњој верзији (1640d1f), свакако:

https://github.com/stojnev/dwr-controller

Share this post


Link to post
Share on other sites

Унапређење #2

Рутине за приказ разних просека.

Позадина

Раније сам писао око прецизности мерења, тачније како сам имплементирао покушај за увећавање те прецизности уз помоћ више од једног окидача. Такође, утврдио сам да лимит прецизности није у интерним функцијама Ардуина, већ око процеса на превод аналогног сигнала у дигитални (тачније брзина окидања сензора која може да зависи и од сензора, и од окидача).

Комбинација ових узрока скоро увек даје резултате кои флуктуирају, чак и са веома (*) стабилним погоном.

(*) Не бих рекао најстабилнији погон, зато што нисам имао могућности тестирати са погоном који је стабилнији од мог, а сигуран сам да постоји.

Како изгледа примерак од, рецимо, 8 окидања сензора:

RPM (true)

33.3339
33.3325
33.3291
33.3313
33.3316
33.3336
33.3344
33.3341

Флуктуација почиње у трећој децимали, у 7 од 8 приказаних случаја. То би требало да буде довољно, али да видимо дали може боље за приказ.

Код

Сва логика око калкулација просека се налази у процедури:

showRPM();

А регулира се уз помоћ пар променљива:

boolean averageCalc = true;
const int averageTotal = 16;

Прва променљива утврђује да ли се калкулација просека уопште врши. Друга променљива утврђује колико од задњих вредности улази у просек.

Процедура је релативно једноставна:

  1. При сваком окидању, тренутна вредност се додаје пољу averageValues;
  2. Показивач averageCount се повећа за вредност 1;
  3. Након првих averageTotal циклуса, averageCount се ресетује, а просек се почиње калкулирати - увек од задњих averageTotal вредности;
  4. У случају промене брзине (33.3 према 45 и обратно) све просечне вредности се ресетирају, и почињу се калкулирати тек након 2 * averageTotal циклуса. (**)

(**) Разлог иза овог приступа је намера да се избегне приказ "застарелих" вредности просека и тиме добити утисак погрешне брзине. Свакако, просеци се изједначују након пар циклуса, али овако је приказ линеарнији.

Резултати

Кад се ова функција примени на вредности које сам раније поставио, добија се ово:

PRM (true)	RPM (average)

33.3339		33.3346
33.3325		33.3348
33.3291		33.3346
33.3313		33.3346
33.3316		33.3346
33.3336		33.3347
33.3344		33.3347
33.3341		33.3346

Наизглед није пуно, али је излаз пуно линеарнији, и чини ми се, пријатнији за око и умањење аудиофилске нервозе.

Закључак

За моје потребе, веома корисно. Чини ми се да би било користи од више штимања, али основна функционалност је ту.

Код је, као и увек (c2efaba4), овде:

https://github.com/stojnev/dwr-controller

Share this post


Link to post
Share on other sites

Probaj da na senzor stavis magnetni sild sa procepom, za pocetak moze i parce bakra, ako se nema mu metal, bar 1mm, da jos vise suzis efekat polja. Trebalo bi da se pomeri na cetvrtu decimalu.

Dalje povecanje preciznosti meraca brzine prelazi u problematiku impulsa momenta motora, koliko on pravi gresku pri cimanju.  

Share this post


Link to post
Share on other sites
5 minutes ago, vladd said:

Probaj da na senzor stavis magnetni sild sa procepom, za pocetak moze i parce bakra, ako se nema mu metal, bar 1mm, da jos vise suzis efekat polja. Trebalo bi da se pomeri na cetvrtu decimalu.

Dalje povecanje preciznosti meraca brzine prelazi u problematiku impulsa momenta motora, koliko on pravi gresku pri cimanju.  

Хоћу, хвала. Му Метал можда је мало проблем, бар за одмах, али бакар је лакше наћи локално.

Хтео бих да догурам код до највеће могуће (али ипак практичне) границе, зато што бих га онда користио за унапређивање свог погона. Али проблем је ипак калибрација - чак и скупљи без контактни тахометри имају резолуцију од тек 0.01 у распону 1-100 ротација у минути.

Размишљао сам о корићењу комплета ласер/сензор од оптичких (ласерских) компјутерских мишева, као овај овде:

ADNS-9800 Laser Motion Sensor

Ово би требало дати већу прецизност, али компликује код и искључује друге важније функције, тако да за сада остајем на комбинацији hall effect / магнет.

Share this post


Link to post
Share on other sites

Laser, sa suzenom zonom detekcije radi slicnu stvar kao maska na magnetu. Preciznije je za neki red velicine.

Maska suzava i eliminise bocne lobove magnetnog polja, koliko moze, da ujednaci okidanje razlicitih magneta.

 

Ali je visoka preciznost vec postignuta, pa je preko toga igranjac vise zadovoljenje inovativnog dela duha. :) 

Share this post


Link to post
Share on other sites

Mislim da je “savet” g. [mention=1935]vladd[/mention] više nego dobar i nadasve racionalan.

Ponekad treba znati stati i ne juriti “savršeno rešenje” (ono i ne postoji).

Čuvajte energiju, trebaće vam sve više i više, kako budete odmicali sa projektom.

Dug je put pred Vama.

 

 

 

Srećko

 

Share this post


Link to post
Share on other sites

Insides,

jel mozes malo detaljnije da prezentujes pogon gramofona, koji tip motora je u pitanju (neke karakteristike ako su dostupne), da li ima i kakvu regulaciju, kako je spregnut sa gonjenim elementima itd.

Ne znam skoro nista o gramofonima, ali se sa pogonima mlatim tu i tamo...

Takodje, sta se ocekuje, kolika tolerancija od zadatog broja obrtaja.

 

 

Share this post


Link to post
Share on other sites
11 hours ago, Bajlag said:

jel mozes malo detaljnije da prezentujes pogon gramofona, koji tip motora je u pitanju (neke karakteristike ako su dostupne), da li ima i kakvu regulaciju, kako je spregnut sa gonjenim elementima itd.

Биће, у посебној теми. Мотор je BLDC, погон је 3 фазни синусни генератор + појачало у D класи.

Share this post


Link to post
Share on other sites

InSides,

Displej ,tip,sam kupio koji si ti preporučio.

Pinovi,odozgo na dole kod mene su obeleženi:SDA ,SCK ,VCC ,GND.

Da li je šema povezivanja podudarna ili nije?

Share this post


Link to post
Share on other sites
4 hours ago, bnb said:

InSides,

Displej ,tip,sam kupio koji si ti preporučio.

Pinovi,odozgo na dole kod mene su obeleženi:SDA ,SCK ,VCC ,GND.

Da li je šema povezivanja podudarna ili nije?

Ако имаш Arduino Nano, SDA = A4, SCK = A5. Ево breadboard сличице:

dwr-controller-v0.1.png

Ако користиш нешто друго осим Nano-а, пиши шта је и видећу дали су пинови различити.

Начин на који ја користим u8g2 библиотеку не тражи да се пинови упишу у код.

Share this post


Link to post
Share on other sites

Баг #4 (*)

Блок програма ради прекорачења вредности у рутини за приказ просека.

(*) Багови #1, #2 и #3 искорењени пре официјалног release-а.

Позадина

Након имплементације рутине за просек (види овде) повремено је долазило до блокаде Ардуина, али се нисам пуно замарао јер је било спорадично, а хардвер и софтвер је још увек у флуксу.

Пре пар дана, теста ради, ресетирао сам контролер и оставио да се регулира брзина са око 38.00rpm на 33.33. То је дало очекиване резултате, и онда прешао на регулацију 45.00 са отприлике 51.00rpm. Ту је запело након пар минута - блокиран дисплеј и престала регулација. Ардуино IDE је мало проблематичан за дебаговање за разлику од стандардних околина где постоје debug субрутине, брејк поинти итд, тако да морају се, у основи, програмирати брејкови, па се онда елиминира рутина по рутини.

Зато сам проширио испис на сериском порту да штампа скоро све променљиве које имају утицај.

Баг

Проблем је лоциран у субрутини за приказ просека, и то у бројачу поља који се континуирано ресетира како би се могли увек добијати задњи број просека:

const int averageTotal = 16; int averageCount = 0;

Тачније, averageCount се није ресетирао. Али не увек, него само када се пребаци мод са 33 1/3 на 45 окретаја у минути. Како скоро 95% плоча које имам су резане на 33 1/3, нисам до сада приметио проблем.

Ево конкретне рутине где се проблем јавио:

if (averageCount == averageTotal)
{
  if (!averageFlip)
  {
    averageCount = 0;
    averageCompleted = true;
  }
  else
  {
    averageFlip = false;
  }
}

Решење

За сваки случај - (1) ресетирати averageCount увек, и (2) ухватити промену averageCount параметра још и раније:

if (averageCount >= averageTotal)
{
  averageCount = 0;
  if (!averageFlip)
  {
    averageCompleted = true;
  }
  else
  {
    averageFlip = false;
  }
}

И још, рутина за штампање на сериску порту сада приказује (1) просечни RPM, (2) тренутачни RPM и (3) број слота у пољу за просеке (од 1 до averageTotal):

if (debugSerial)
{
  Serial.print(currentX, 4); Serial.print(" "); Serial.print(currentRPM, 4); Serial.print(" "); Serial.print(averageCount); Serial.println();
}

Код

Код је, као и увек (d217886), овде:

https://github.com/stojnev/dwr-controller

Share this post


Link to post
Share on other sites

Imao bik ja jednu primedbu u vezi neodimium magneta koji prolaze na par cm od gramofonske glave. Jel provereno indukuje li to šta na izlazu, kolko ja računjam nekih 2,2Hz je učestanost prolaska magneta u odnosu na neku fiksnu tačku?

Ako ne onda ništa :)

Share this post


Link to post
Share on other sites
15 hours ago, ManicP said:

Imao bik ja jednu primedbu u vezi neodimium magneta koji prolaze na par cm od gramofonske glave. Jel provereno indukuje li to šta na izlazu, kolko ja računjam nekih 2,2Hz je učestanost prolaska magneta u odnosu na neku fiksnu tačku?

Ako ne onda ništa :)

Учесталост је, у ствари - 0.45Hz за 33.33rpm и 0.33Hz за 45rpm. Тренутно користим 4 магнета.

Магнети су минијатурни, 6мм х 3мм, и у најгорем случају су (код мене) бар 10 центиметара. У најбољем, више од 12 центиметара. Тањир који користим је укупне "дебљине" од 100 милиметара (70мм алуминијум, 15мм ваздух, 15мм полиоксиметилен).

Сличан метод се користи код грамофона са тањим тањирима, и нисам видео да је ико пријавио проблем (што не значи да га нема).

Да одговорим питање - нисам мерио / проверивао дали магнет има утицај на квалитет излаза.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.

×