Signaalin muuttaminen arduinolla

Moro,

nämä pienet ohjelmoitavat kikkareet on ihan uus kokemus mulle, joten voi olla et tulee tyhmiä kysymyksiä, mutta koittakaa kestää :slight_smile:

Tarvitsen auto projektissa seuraavanlaista ohjelmaa:

  1. nopeus signaalia pitää muuttaa ECU:lle kertoimella 0.617
  2. auton nopeusmittari näyttää pahasti pieleen ja haluaisin korjata sitä kertoimella 1.2
  3. ruiskujen ohjaus signaalia pitäisi muuttaa kertoimella 0.9

Tarvitsen tähän siis kaksi tuloa ja kolme lähtöä. Tulo 1 olisi nopeussignaali ja se kahdella eri kertoimella eri lähtöihin. Ruiskuille olisi oma tulo ja kertoimen jälkeen oma lähtö.
Nyt puuttuu tieto siitä millä arduinolla tämän voisi tehdä, Nano? ja jaksaako se pyörittää kaikkia muutoksia kerralla?
Arduinolle tulevista signaaleista ei ole vielä ihan varmuutta, mutta otan niistä selvää kun saisi ensin perusjutut selville :slight_smile:

Terveisin

Tuomas

Tyhmä kysymys=Hyvä kysymys. :question:

Tuossa laskeskelin, että tihein pulssi mitä tuo Arduinon sisääntulo joutuu käsittelemään on n. 700 pulssia/sekuntti.
Tuo pulssi määrä pitää sitten kahdella eri kertoimella laskea ja laittaa kahteen eri lähtöön. Lisäksi vielä ruiskujen laskeminen, mutta niistä pulsseista ei ole vielä tietoa ja sen selvitän vasta kun auto liikkuu, mutta tuo nopeuden muutos pitäs laittaa heti käyttöön…Riittääkö potku???

-Tuomas-

Helposti riittää Arduinon 328 versiot noiden pulssien tunnistamiseen ja kellottamiseen. PWM pinneistä pulssit pihalle.

Homman vaikeustaso määrittyy kun lyöt resoluutio- ja latenssivaatimukset pöytään.

arduino.cc/en/Reference/pulseIn
arduino.cc/en/Tutorial/PWM

PulseIn on vähän kökkö. Itte tekisin keskeytyksillä. Mutta onnistuu tuollakin jos riittävän löysät vaatimukset :wink:

Eikä tuo PWM:kään näköjään ole heittämällä kelvollinen; ei anna taajuutta muuttaa. Mutta kyllä tuon noita kirjastoja häkkäämällä saa kasaan.

playground.arduino.cc/Code/PwmFrequency

– Humppe

Tarkoitatko nopeussignaalilla ajoneuvon nopeutta etkä moottorin pyörimisnopeutta?
Ruiskutuspulssien pituuden lyhentäminen ei välttämättä ole kovinkaan yksinkertainen tehtävä…

Noilla spekseillä on täysin mahdotonta sanoa toimiiko vai ei.

  1. Nopeussignaali? Siis auton nopeus vai kierrosnopeus vai jotain muuta? Tuleeko tuo taajuudella, PWM:llä vai jotenkin muuten? Miten nopeasti pitää muutokseen reagoida? Mikä on muunnoksen tarkkuusvaatimus? Onko ajoitus tärkeä?

  2. Missä muodossa signaali tulee sisään ja menee eteenpäin? Tuossa varmasti riittää hitaahko (siis sekunnin kymmenyksiä) vaste eli on hyvin aikaa mitata sisääntuleva signaali ja muodostaa siitä ulostuleva.

  3. Ruiskujen ohjaus tehtänee joka työtahdilla hyvin tarkalla ajoituksella kanttipulsilla, jonka pituus määrittää ruiskutusmäärän ja ilmeisesti haluat muuttaa tuota pituutta koskematta ajoitukseen? Tuo kuvaus sopinee imukanavaan tehtävään monipisteruiskuun. Yksipisteruiskut eivät liene tarkkoja ajoitukselle. Jos haluat muokata jokaisen ruiskutustapahtuman erikseen, tulee väkisin jonkinlainen ajoitusero. Ennen ruiskutuksen aloitusta pitää tietää ruiskutuksen pituus, jotta pituutta voi lyhentää. Siis ruiskutus voi alkaa vasta kun alkuperäinen ruiskutus on päättynyt. Paremmin ajoituksen saa kohdalleen käyttäen edellisen ruiskutuksen pituutta pituuslaskennassa ja nykyisen ruiskutuksen aloitusta kohdistuksena, mutta silloin tietysti tulee viive pituuden muutokseen.

Noissa kaikissa kolmessa joutunet muuttamaan taajuutta jatkuvasti ja pelaamaan kolmella eri taajuudella. Onneksi taajuudet ovat hyvin alhaisia mikrokontrollerille, jolloin niiden mittaus ja generointi tarkasti on aika helppoa. Keskeytyksellä (input capture) saa tarkasti taajuudet ja pulssisuhteet. Noin alhaisen taajuuden voi tuottaa vaikka “käsin”, jos prossusta loppuu sopivat timerit jne. kesken. En tunne ko. piiriä, mutta ainakin Xmegoissa on hyvin simppeli ja tarkka taajuusgeneraattori valmiina.

Muista, että Arduino on vain ohjelmointiympäristö AVR:ään. Mikään ei estä tekemästä ohjelmaa puhtaasti AVR:lle, siis ilman Arduino-ympäristöä, joka saattaa tehdä joistain asioista vaikeampia kuin ne ovat. Ei tuollaisen muunnoksen ohjelmointi ole kovinkaan vaikeaa.

Tarkennellaan:

  1. Nopeus signaalissa on kyse auton nopeudesta.

  2. Signaali tulee ABS-yksiköltä kanttiaaltona ja menee moottorin ECU:lle. Tuohon väliin Arduino korjaamaan virhettä. Virhe johtuu siitä kun ABS-yksikkö on eri autosta kuin ECU jolloin ABS-kehä ja sitä kautta kanttiaallon taajuus ovat ihan eri luokkaa.

Toinen muutos eri kertoimella olisi tarkoitus laittaa ABS-yksikön ja nopeusmittarin väliin niin saisi mittarivirheen pois.

Mitä tarkemman muunnoksesta tekee niin aina nopeudet ovat paremmin hanskassa, mutta hirveän tarkkojahan noiden ei tarvitse välttämättä olla. Toimivat aika laajalla toleranssilla :slight_smile:

  1. Tämä ruiskujen signaali on myös kanttiaaltoa ja idea siinä on muuttaa diagnostiikka pistokkeelta saatavaa signaalia niin, että ajotietokone ymmärtäisi laskea kulutuksen oikein. Tässä virhe johtuu siitä, kun vanha moottori oli V6 jolloin suuttimia oli 6 kpl ja niiden koko luokkaa 195cc/kpl. Nyt moottorin vaihtuessa rivi neloseen ruiskuja on 4kpl ja koko 350cc/kpl. Tästä johtuen ajotietokone laskee päin honkia.

ECU:lle menevä signaali vaikuttaa moottorin väännön rajoitukseen, mikä ei ole kaikissa edes käytössä, joten ei ole välttämätön, mutta suotava. Mikään muutoksista ei tule siis vaikuttamaan moottorin ohjaukseen vaan kaikki ovat oheistoimintoihin meneviä tietoja eli vaikka kuinka härvää ja kikkailee saa aikaan korkeintaan suurta hämmennystä kabiinin puolella :slight_smile:

Kiitoksia kaikille kommenteista ja kysymyksistä. Taisin löytää ohjelman jonka joku on tehnyt vähän samaan tarkoitukseen. Laitan sen liitteenä kohta…

-Tuomas-

Ymmärsinkö siis oikein, että kaikki kolme ulostulevaa signaalia ovat kanttiaaltoa ja ainoastaan taajuudella on merkitystä eli ei pulssisuhteella. Eli nopeussignaaleissa taajuus on suoraan verrannolinen nopeuteen ja ruiskutussinaalissa polttoaineenkulutukseen (l/h).

Jos noin on, homma on varsin helppo. Tarvitset timer capturet molemmille sisääntulosignaaleille. Sillä mittaat jaksonpituutta. Voit ottaa keskiarvon vaikkapa 100-500 ms ajalta, jos muuten signaaliin tulee kohinaa.

Nyt siis tiedät molempien sisääntulojen taajuudet. Ulostuloihin pitää sitten saada 3 kpl korjattuja taajuuksia. Xmegassa olisi tosiaan valmiina taajuusulostulo, jossa on hyvin helppo asettaa taajuus. Arduinoja en tunne, mutta kyllä se niilläkin jotenkin onnistuu, viimeistään suoraan ohjelmasta pinnejä ohjaamalla. Tässä jotain Arduinoon liittyvää:
forum.arduino.cc/index.php/topic,44544.0.html
engineersgarage.com/embedded … ng-arduino

Luultavasti ko. signaalit ovat 12 V tasolla, joten joudut vielä tekemään tasomuunnokset. Sisääntulossa riittää jännittenjako (+ suojaus TVS:llä), mutta ulostuloon tarvitset jonkun aktiivisen systeemin.

Joakim

Kaikki signaalit on tämän hetken tutkimusten mukaan 5V tasolla, mutta jos yllätyksiä tulee pitää niitä muutella. Auto ei vielä liiku, joten en ole voinut varmistaa asiaa.
ABS-yksikön pulssi on nimenomaan pelkästään taajuus muuttuva, koska vetoakselissa on hammastus josta pulssit luetaan. Hammastus on vielä tasajaolla eli 0-taso ja 1-taso ovat yhtä pitkä.

Ruiskujen signaalista en ole löytänyt varmaa tietoa, joten kun saadaan auto käyntiin niin kattelen oskilloskoopilla mitä sieltä tulee :slight_smile: Tässä voisi muuttua myös pulssisuhde, mut varmistetaan.

Mikään pakkohan tätä ei ole arduinolla tehdä jos joku muu laite tekee sen helpommin ja hinta on samassa luokassa.

-Tuomas-