Sida 1 av 1
Frekvensdelare arduino
Postat: 29 december 2016, 08:00:53
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?
Re: Frekvensdelare arduino
Postat: 29 december 2016, 08:16:31
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.
Re: Frekvensdelare arduino
Postat: 29 december 2016, 08:24:27
av carpelux
Den gemensamma nämnare blir 1392, så den måste man nog använda sig av
Re: Frekvensdelare arduino
Postat: 29 december 2016, 09:05:30
av ktm_micke
Eller multiplicera ingången med 1000 dela sedan med 1655 fast det blir ju 1,655 det med
Re: Frekvensdelare arduino
Postat: 29 december 2016, 09:54:42
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.
Re: Frekvensdelare arduino
Postat: 29 december 2016, 10:06:38
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
Re: Frekvensdelare arduino
Postat: 29 december 2016, 10:12:45
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
}
}
Re: Frekvensdelare arduino
Postat: 30 december 2016, 08:11:21
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?
Re: Frekvensdelare arduino
Postat: 30 december 2016, 08:43:08
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.
Re: Frekvensdelare arduino
Postat: 30 december 2016, 09:45:29
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.
Re: Frekvensdelare arduino
Postat: 30 december 2016, 10:25:15
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!