Frekvensdelare arduino

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
ktm_micke
Inlägg: 116
Blev medlem: 24 juni 2009, 09:34:27
Ort: Halmstad

Frekvensdelare arduino

Inlägg av ktm_micke »

Hej
Jag har ett litet problem jag har en rattstång med elservo som vill ha 29 pulser/varv från hjulen nu har jag 48pulser/varv tänkte att man kan ta in pulserna i en Arduin och dela dessa med en konstant och pulsa en utgång.
Någon som har något förslag?
Användarvisningsbild
Icecap
Inlägg: 26139
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Frekvensdelare arduino

Inlägg av Icecap »

Jag skulle vara mycket intresserat av hur du har tänkt dig att göra detta.

Att dela med 1,655 är inte så enkelt men det ska gå att skapa en räknare som adderar bråken och ger ut heltalsdelen.
Användarvisningsbild
carpelux
Inlägg: 1876
Blev medlem: 13 oktober 2007, 12:33:33
Ort: Varnhem

Re: Frekvensdelare arduino

Inlägg av carpelux »

Den gemensamma nämnare blir 1392, så den måste man nog använda sig av
ktm_micke
Inlägg: 116
Blev medlem: 24 juni 2009, 09:34:27
Ort: Halmstad

Re: Frekvensdelare arduino

Inlägg av ktm_micke »

Eller multiplicera ingången med 1000 dela sedan med 1655 fast det blir ju 1,655 det med
Användarvisningsbild
Wedge
Inlägg: 1026
Blev medlem: 8 juli 2012, 17:33:33

Re: Frekvensdelare arduino

Inlägg av Wedge »

Mät infrekvensen och skapa en lägre utfrekvens med 1.655 ggr längre periodtid. Ganska enkelt, men kan kanske bli lite knepigt när man har snigelfart och behöver räkna med långa tider.
Hur exakt måste det vara? Om pulserna blir för få eller för många innebär väl det bara att servot över- eller underkompenserar lite. Prova att dela med två i låg fart. Varannan inpuls.
ktm_micke
Inlägg: 116
Blev medlem: 24 juni 2009, 09:34:27
Ort: Halmstad

Re: Frekvensdelare arduino

Inlägg av ktm_micke »

Jag tror inte den är jättekänslig på pulserna det är ett Opel Corsa elservo (EPAS)
Det har 3 mappar som ger olika servo assistens
upp till ca 24km/h mest servo verkan omslags punkt 24km/h är ca 128 pulser/sekund
mellan ca 24km/h och ca 60km/h är servoverkan medel hög 60km/h är ca 320pulser/sekund
Över 60km/h låg servoverkan
Användarvisningsbild
carpelux
Inlägg: 1876
Blev medlem: 13 oktober 2007, 12:33:33
Ort: Varnhem

Re: Frekvensdelare arduino

Inlägg av carpelux »

lite psuedokod som jag tror borde fungera:

Kod: Markera allt

loopa {
	läs hjulsensor
	öka variabel med 1
	om variabel - (heltalsdel (variabel * 48 /1392)) = 0 {
		Skicka puls 
		variabel = 0
		}
	}
ktm_micke
Inlägg: 116
Blev medlem: 24 juni 2009, 09:34:27
Ort: Halmstad

Re: Frekvensdelare arduino

Inlägg av ktm_micke »

Kan man inte bara mäta pulslängden och sedan dividera eller multiplicera med en faktor och sedan pulsa en utgång med detta?
Användarvisningsbild
Icecap
Inlägg: 26139
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Frekvensdelare arduino

Inlägg av Icecap »

Jag skulle nog göra på samma sätt som ktm_micke skriver.

Rimligt enkelt, det enda som är svårt är att fixa en time-out när fordonet står still. Och den bit är ändå enkel.

EDIT: Alltså mäta från en flank till samma flank = 1/frekvensen.
Senast redigerad av Icecap 30 december 2016, 09:57:34, redigerad totalt 1 gång.
Användarvisningsbild
Wedge
Inlägg: 1026
Blev medlem: 8 juli 2012, 17:33:33

Re: Frekvensdelare arduino

Inlägg av Wedge »

Om servot mäter pulser per tidsenhet lär det inte fungera så bra. Varför skulle pulsbredden vara avgörande? Då skulle man vara beroende av veta sensorkarakteristik och behöva kalibrera. Frekvens är frekvens, oavsett pulsbredd.
Användarvisningsbild
hanpa
Utsparkad, på semester
Inlägg: 639
Blev medlem: 22 november 2016, 21:54:43
Ort: Hemort

Re: Frekvensdelare arduino

Inlägg av hanpa »

ktm_micke skrev:Hej
Jag har ett litet problem jag har en rattstång med elservo som vill ha 29 pulser/varv från hjulen nu har jag 48pulser/varv tänkte att man kan ta in pulserna i en Arduin och dela dessa med en konstant och pulsa en utgång.
Någon som har något förslag?
Intressant problem!

Jag skulle tänka så här:
- Vinkelförflyttning på inkommande (48/varv) är 360 grader / 48 per puls, alltså 7.5 grader per puls
- Vinkelförflyttning på utgående ska vara 360 / 29 (ungefär 12,41 grader per puls)

En enda variabel räcker, V, den motsvarar vinkelförändringen du ska leverera i form av pulser till utgående.

Pseduokod:

Kod: Markera allt

För varje inkommande puls (48/varv):
   V = V + 360/48

Om V >= 360/29
   V = V - 360/29
   Skicka en utgående puls (29/varv)
Du får räkna med flyttal så du inte tappar noggrannhet, alternativt skala upp till större heltal, typ ggr 100 så duger det nog. Då motsvarar variabeln inte längre grader utan grader *100. Kallar den X:

Kod: Markera allt

För varje inkommande  puls
  X = X + 750

Om X >= 1241
   X = X - 1241
   skicka en utgående puls
Beräkningen blir mycket enkel och kan göras med heltal. 1241 istället för 1241.37931034 lär du inte märka av....

Detta bygger på att servot klarar att pulserna inte kommer med konstant mellanrum, givet en viss konstant hjulhastighet. Om servot mäter tiden mellan pulserna så kan det ju bli tokigt om värdena inte filtreras i servot. Men det rimliga är väl att servot har en medelvärdesbildning?

Annars får man göra som Wedge säger.

En lyxlösning kan vara att kombinera frekvens och pulsräkning.

Räknaren C motsvarar att en puls borde levereras snart på utgående

Kod: Markera allt

För varje inkommande  puls
  X = X + 750

Om X >= 1241
   X = X - 1241
   C = C + 1
Sen gör man pulsavkodningen interruptstyrd på Arduinon och baserat på tiden mellan inkommande pulser räknar ut vad motsvarande tid, T, borde vara på utgående.
I huvudloopen kollar man hur lång tid i millisekunder det gått sedan föregående utlevererad puls. När tiden är >= T (eller större än ett lämpligt minvärde) skickar man ut en puls givet att C > 0. Man minskar därefter C med 1.

Detta borde innebära att man i snitt får en stabil utfrekvens som motsvarar den inkommande men att man ändå räknar pulser i grunden.

Kanske ingen som förstår denna algoritm mer än jag men det borde fungera. Det blir lite stabilare än att bara mäta frekvens och generera en omräknad utfrekvens. Guldpläterad lösning!
Skriv svar