Arduino impulsų skaitiklis. ATmega

Arduino impulsų skaitiklis. ATmega

24.06.2023

Įgyvendino signalą PWM 25 kHz. Osciloskopo neturiu, bet noriu patikrinti rezultatą. Padarome pulsų skaitiklį ir patikriname darbą.

Užduotis

Ant pagrindo ATmega 328P patikrinimui įdiegti impulsų skaitiklį PWM 25 kHz, matavimų tikslumas iki pulso nereikalingas, bet reikia žinoti eilę.

Sprendimas

Sprendimo logika paprasta, sekame impulsus, kuriais per sekundę padidiname visuotinį kintamąjį. Sukaupta vertė bus gaunamo signalo dažnis.

Impulsams nuskaityti naudosime išorinius pertraukimus, jie aprašyti puslapiuose 87-96 gamintojo dokumentai. IN Atmega 328P yra du įėjimai, kuriais galime stebėti išorinius pertraukimus INT0 (PD2) Ir INT1 (PD3), kad išspręstume problemą, kurią naudosime INT0.

Išorinių pertraukimų konfigūravimas

Pirmas dalykas, kurį reikia padaryti, yra sukonfigūruoti prievadą D kaip įvestį, o kad išvengčiau trukdžių, prijungsiu traukimo rezistorių.

Norėdami nustatyti, kurie įvykiai suaktyvins pertraukimų tvarkyklę, turite sukonfigūruoti registrą ERIKA. Bitai ISC00 Ir ISC01 yra atsakingi už INT0, A ISC10 Ir ISC11 už nugaros INT1. Stebimų įvykių konfigūracija yra identiška, išskyrus bitų skirtumą:

00 — Žemas signalo lygis;
01 — Bet koks loginis signalo pakeitimas;
10 — Mažėjantis signalo kraštas;
11 — Kylantis signalo kraštas.

Norėdami tiesiogiai įjungti pertraukimo įvestis, naudokite registrą EIMSK, bitai INT0 Ir INT1 yra atsakingi už to paties pavadinimo išvestis. Naudodami aukščiau pateiktą kodą rašome

Void int0_initial(void) ( DDRD = 0x00; // D prievadas kaip įvestis PORTD = (1<< 2); // Включение подтягивающего регистра EICRA = (1 << ISC00) | (1 << ISC01); // Восходящий фронт сигнала EIMSK = (1 << INT0); // Включение входа прерывания sei(); // Разрешаем прерывания }

Išorinių pertraukimų tvarkymas

Sukonfigūravau pertraukimus, dabar turiu juos apdoroti. Tam yra pertraukimo funkcija. ISR(), kuriame, mano atveju, reikia nurodyti pertraukimo tipą INT0_vect. Funkcijoje padidinsime kintamąjį Tic_Count:

ISR(INT0_vect) (Tic_Count ++; )

Rezultato išvedimas

Kad palengvinčiau rezultato išvedimą, kad nesugadinčiau ekrano, naudojau nešvarų ATmega 328P, A Arduino UNO Ir Arduino NANO, laive, kuris yra tas pats MK.

Kaip rašiau aukščiau, matavimų tikslumas nėra toks svarbus, todėl laikmačių nenustatysiu, o tiesiog kartą per sekundę rodysiu pagrindinėje kilpoje sukauptą kintamojo reikšmę Tic_Count ir nustatykite jį iš naujo. Atlikdamas šiuos veiksmus sustabdau pertraukų apdorojimą.

Žemiau pateikiamas visas problemos sprendimo kodas su komentarais:

#define F_CPU 1600000UL #įtraukti #įtraukti nepastovus nepasirašytas int Tic_Count = 0; // Išorinis pertraukimų tvarkytuvas INT0 ISR(INT0_vect) ( Tic_Count ++; ) void setup() ( int0_initial(); Serial.begin(9600); ) void loop() ( cli(); // Išjungti pertraukimus Serial.println( Tic_Count); Tic_Count = 0; sei(); // Įgalinti pertraukimų delsą (1000); ) void int0_initial(void) ( DDRD = 0x00; // D prievadas kaip įvestis PORTD = (1)<< 2); // Включение подтягивающего регистра EICRA = (1 << ISC00) | (1 << ISC01); // Восходящий фронт сигнала EIMSK = (1 << INT0); // Включение входа прерывания sei(); // Разрешаем прерывания }

Dabar belieka prijungti PWM signalą prie PD2 kaiščio ir atidaryti nuosekliojo prievado monitorių. Taip pat galite generuoti ir išbandyti signalą viename MK.

Išėjimo rodmenys yra maždaug lygūs anksčiau apskaičiuotam dažniui, tikėtini nedideli skirtumai dėl įgyvendinimo. Norint tiksliai išmatuoti, tikriausiai teisingiau skaičiuoti laiką tarp impulsų ir iš to apskaičiuoti dažnį.

Šiame straipsnyje yra visi duomenys apie Arduino pagrindu pagamintą elektros skaitiklį, įskaitant diagramas, programinę įrangą, komentarus apie esamos programinės įrangos versijos ir dizaino patobulinimus.

Taip atrodo galų gale.

Iš pradžių visą informaciją suskaidžiau į didelę krūvą smulkių straipsnių – dėl to buvo labai nepatogu ją surasti ir išvis kartoti šį įrenginį. Šis straipsnis ištaiso šią situaciją.

1 dalis. Idėja, dizainas ir mąstymas garsiai.

Prieš kurį laiką įsirengiau dviejų zonų elektros skaitiklį, kad pasinaudočiau palankesniu naktiniu tarifu (50% nuo 2300 iki 0800). Paaiškėjo, kad naktį suvartojame 45 proc. Tačiau atsakymas yra toks, kaip vartojimas vyksta vartojimo vietose. Žinoma, šis įrenginys to nedaro.

Todėl atsirado poreikis detaliau pateikti vartojimo duomenis. Iš pradžių buvo nuspręsta sukurti įrenginį, rodantį šiuos duomenis:

  1. Dabartinė apkrovos galia
  2. Vartojimas nuo paros pradžios
  3. Vartojimas nuo mėnesio pradžios
  4. Nakties vartojimo procentas %

Įrenginys taip pat turi persiųsti pasirinktu interneto adresu paskutinių 24 valandų suvartojimo duomenis 24 skaičiavimų forma. Perdavimo intervalas – nustatytas minutėmis 1...120.

Meniu nustatyti parametrai:

  1. Valanda RTC
  2. Minutė RTC
  3. Diena RTC
  4. Mėnuo RTC
  5. Metai RTC
  6. Skaičiavimo intervalas 1…120
  7. tinklo adresas, nurodantis padėties simbolius: „a-z0-9_-/:“ Redaguotas simbolis turi būti paryškintas, kad būtų aišku, kas tiksliai redaguojama.

Pradinė įrenginio versija bus sukurta remiantis šiuo modulių rinkiniu:

  1. (paaiškinimas dėl indikatoriaus prijungimo prie mega 2560)

Įrenginys įdomus norint išsiaiškinti, kiek sunaudoja dirbtuvės, žiniasklaidos įrenginiai ir virtuvės reikmenys. Dėl to jums reikia gauti duomenis grafikų pavidalu, internete arba vietinio tinklo serveryje ()

Pradinė matavimo vieneto prijungimo schema.

Pasiskolinau galios ir įtampos matavimo grandinę. Skaičiuojama ne tik vidutinė galia, bet ir daugelis kitų parametrų, tokių kaip dažnis, galios koeficientas. Pirmiausia reikia surinkti tokį mažą stovą matavimui.

Paimu duonos lentą, ieškau tinkamo transformatoriaus įtampai matuoti (gaunu iš ATX stalo) ir einu.

UPD. Matavimo vienetas

2.1 dalis Pastabos apie nuostabias ENC28J60 savybes

Nuostabus dalykas. Šiandien pradėjau kasti modulį darbui su Ethernet „skaitiklio“ projektui. Kas suabejotų, buvo smagu, ir viskas galiausiai pavyko.

Pagal ryšį. Pažiūrėkime, kur rasti SPI sąsają su Arduino Mega arba jūsų. Prisijunkime. CS išvestį (lusto pasirinkimą) pakabiname kur norime, tada ji atskirai nurodoma bibliotekos inicializacijoje. Aš jį "pakabinau" ant 42 kaiščio, galbūt turite ką nors kita. Likę MOSI/MISO/SS/OV/3.3V yra prijungti prie atitinkamų Arduino kaiščių.

Paaiškėjo, kad norėdamas sumažinti atminties naudojimą, „nuostabios“ EtherCard bibliotekos kūrėjas nusprendė į programos atmintį nusiųsti keletą eilučių GET užklausai. Tai yra, įsivaizduokite, kad tam tikras laisvai samdomas programuotojas staiga nusprendė pasidaryti skaitikliu. Kad viskas būtų protinga, jis nusprendė redaguoti URL eilutę, į kurią siunčiami duomenys. Ir aš šiandien dariau taip:

Taigi, jis prijungia biblioteką ir mano, kad dabar gali lengvai pateikti užklausą išoriniam serveriui. Bet ne. Juk jis nurodė serverį kaip eilutę. Ir eilutė, deja, nėra programos atmintis. Harvardo architektūra. Viskas padalinta.

Nieko, greitai nuėjau į biblioteką, radau vietą, kur buvo pildomas prašymas, sujaučiau, išnešiau viską, kas mano nuomone „nereikalinga“, žinoma. Galų gale viskas veikia puikiai.

Pridedu biblioteką ir pavyzdį, kaip dirbti su serveriu, kuris veikia su eilutėmis. ir ne tik vertėms, kurių negalima pakeisti programoje. Kartu su pavyzdžiu -

Vykstant projektui, belieka išspręsti problemą su matavimo dalimi, visa kita jau išspręsta. Sunkiausia programos dalis buvo redaguoti URL eilutę.

Ryšio funkcija yra tik DHCP, aš nesiruošiu nustatyti statinio IP ir pasirinkti, viskas veikia gana korektiškai ir nereikia pridėti funkcijų, kurių man nereikia.

3 dalis. Pirminis skaitiklio programinės įrangos derinimas

Šiandien šiek tiek padirbėjau su skaitiklio programinės įrangos derinimu. Faktas yra tas, kad aš per klaidą neįdėjau sumažinto rezistoriaus ant CT jutiklio ir dėl to į įvestį pateko per didelė įtampa, taip pat per daug triukšmo. Pataisyta, lygiagrečiai su CT jutikliu prilituota 150 omų, iš viso pasirodė apie 100 omų.

Teko programoje truputi pakoreguoti koeficientus.Pakoregavau...pagal kinietiska skaitiklis. Tada ant voltmetro. Privedžiau jį kuo arčiau.

Todėl matuojant EH sąnaudas virinant virdulį, buvo matyti tą patį, ką ir Kinijos vatmetras. Jau gerai, bet kažkaip turėsite tai patikrinti naudodami pagrindinį skaitiklį.

Raidė h po kW netilpo ekrane, bet turėtumėte suprasti, kad ji yra. Skaičius rodo suvartojimą nuo dabartinės valandos pradžios. Valandos pabaigoje jis perduodamas į serverį ir atstatomas į nulį. Tada aš tikriausiai jį iš naujo nustatysiu kartą per dieną.

Skaitiklio programinė įranga, jos dabartinė forma -

4 dalis. Pirmosios kūno dalies gamyba

Korpusą dariau šiandien, medžiaga tokia pati kaip ir praeitą kartą - 11 mm kaprolonas. Tvirtinimas iš tikrųjų yra ant M4 galvutės varžtų, paskutinį kartą visur buvo M3. Tai gana silpna kūnui.

Dėl mastelio įkišau oro pelę į vidų.

Belieka padaryti priekinį skydelį, pritvirtinti modulius, padaryti frezavimą USB ir 12V maitinimui. Šio įrenginio atveju tikriausiai užteks 0,7A, tai yra, galite naudoti ką nors mažo.

5 dalis Priekinio skydelio gamyba

9 dalis. Programinė įranga atnaujinta pagal įrenginio veikimo rezultatus

Maždaug mėnesį eksploatuojant priėjau prie išvados, kad mėnesio pradžioje reikia pridėti esamos suvartojamos galios perdavimą. Be to, perkėliau surinkimo žiniatinklio serverį į savo potinklį ir nustojau perduoti duomenis iš išorės. Nes kai kuriems nepavyko. Taigi padidėjo duomenų rinkimo patikimumas. Na, štai naujausia programinė įranga – .

Atnaujinta 2015-09-23. Šiandien parašiau sąsają stebėjimo duomenims peržiūrėti. Tuo pačiu optimizavau programinę įrangą ir radau joje klaidų. Pakėliau vidinį DNS serverį, tai kelių minučių klausimas.

Tiesiog parodžiau paskutines 48 valandas (praradau statistiką, todėl grafike yra mažiau) išlyginto grafiko pavidalu. Aptaškymas yra skalbimo mašinos veikimo pradžia, anot U – kaina grivinomis už einamąją valandą, žinoma, atsižvelgiant į naktinį tarifą. Iki X – data/laikas.

Dabar galite šiek tiek pamatyti, kas vyksta. Mažas niuansas – viską įdėjau į namų tinklą, kad būtų didesnis stabilumas.

Anksčiau rašiau, kad išbandžiau vieną standartinę programinę įrangą, rodančią elektros suvartojimą (emoncms). Man nesuprantama paradigma ir požiūris. Ten kartą per tris sekundes siunčia duomenis į serverį ir kažką rodo. Dariau kitaip – ​​įrenginys kaupia duomenis 1 val., paskui siunčia paskutines 24 valandas. Žiniatinklio serveris neįsijungė, tai NAS, sunaudojantis mažai energijos.

UPD. Paaiškėjo, kad tai ne mano turimas internetas, šis įrenginys kartais neperduoda duomenų. Neaišku, kas tai sukelia, ir sunku sugauti, todėl nuėjau kitu keliu - apskaičiuodamas tarpinius rodmenis pagal esamą srautą. Sugenda apie 1-2 kartus per dieną. Ši schema leidžia atsisakyti saugoti valandinius duomenis eeprom, kuris dėl tam tikrų priežasčių taip pat neveikia visiškai tinkamai.

UPD. Sukūriau šiek tiek svetainės programinės įrangos, kuri rodo duomenis. Dabar yra įtampa pagal valandas, valandines ir dienos sąnaudas.

Galvoju apie programinės įrangos paskelbimą „Github“. Gal būt. taip ir bus.

Ne, šis straipsnis nėra apie dar vieną būdą apgauti šį nelaimingą įrenginį. Čia kalbėsime apie tai, kaip naudojant Arduino ir LabView aplinką elektros skaitiklį paversti energijos suvartojimo monitoriumi ar net ampermetru!


Pats pirmasis elektros skaitiklis buvo indukcinis. Jo veikimo principas juokingai paprastas – iš esmės tai elektros variklis, kurio rotorius yra aliuminio diskas, sukasi ciferblatą. Kuo daugiau srovės suvartojama, tuo greičiau diskas sukasi. Prietaisas yra grynai analoginis.

Tačiau šiandien indukciniai skaitikliai praranda savo pozicijas ir užleidžia vietą pigesniems elektroniniams analogams. Ir tik vienas toks asmuo taps bandomuoju:

Veikimo principas daug nepasikeitė – tokiu atveju diską pakeičia elektronika, kuri generuoja impulsus pagal suvartojamos elektros kiekį. Paprastai daugumoje prietaisų šie impulsai rodomi LED indikatoriumi. Atitinkamai, kuo greičiau mirksės ši lemputė, tuo brangesnis kW sudeginamas.
Be to, bet kurio įrenginio priekiniame skydelyje yra matuoklio pavaros santykis A- impulsų skaičius 1 kWh. Kaip matyti iš nuotraukos, tiriamojo A = 12800. Iš šios informacijos galima padaryti tokias išvadas:

Su kiekvienu impulsu skaitiklis registruoja suvartojimą, lygų 1/12800 1 kWh. Jei prie skaitiklio prijungiate apkrovą ir tik pradedate skaičiuoti impulsus, tuomet nesunkiai gausite jo sunaudotą elektros kiekį (kWh), padalijus impulsų skaičių iš pavarų skaičiaus.

Kadangi indikatorius keičia savo mirksėjimo greitį, galima išvesti ryšį tarp galios (kW) ir vieno metro impulso laiko, kuris pateiks duomenis apie galią / srovę.
Straipsnio skaičiavimais neįkelsime, bet jei reikia,

jie yra čia

Tikrai, skaitiklio perdavimo skaičius yra puikus dalykas, nes jį žinodami galite išreikšti tiek galią, tiek srovę:
Padarykime proporciją iš mūsų perdavimo skaičiaus (A = 12800 imp/kWh) ir nežinomo perdavimo skaičiaus, kuris bus esant apkrovai X ir vieno impulso (mirksėjimo lemputei) metu:

Čia X yra nežinoma galia, o t yra vieno impulso laikas. Mes išreiškiame nežinomą galią iš čia ir čia:

Srovė apskaičiuojama naudojant šią žinomų ir nežinomų srovių perdavimo koeficientų proporciją esant X apkrovai:


Tai paprastai lemia identišką formulę, bet srovei (srovė matuojama amperais, o indeksai rodo apkrovą, kuriai esant ši srovė):

Čia galite pastebėti spąstą - reikia žinoti srovę esant idealiai 1 kW apkrovai. Jei reikia gero tikslumo, geriau jį išmatuoti patiems, o jei ne, tada galite apytiksliai apskaičiuoti pagal formulę (įtampa ir galia žinomos), tačiau tai bus apytikslė, nes galios koeficientas neatsižvelgiamas sąskaitą.


Taigi, viskas priklauso nuo vieno impulso laiko matavimo (indikatoriaus mirksėjimo). Savo tyrime rėmiausi šiuo puikiu projektu. Italas sukūrė sąsają galios stebėjimui Labview aplinkoje ir sugalvojo impulsų matavimo grandinę. Tačiau jo projektas turėjo didžiulį trūkumą – jis buvo tinkamas tik skaitikliams, kurių perdavimo skaičius buvo 1000 imp/kWh.

Viršutiniame grafike rodoma vidutinė 5 minučių galia, apačioje – realiuoju laiku. Sąsaja yra gana lanksti ir gali būti lengvai modifikuojama, kad atitiktų jūsų poreikius. Jei dar nesusidūrėte su LabView aplinka, rekomenduoju susipažinti.

Kad viskas veiktų, pakako prie programos algoritmo pridėti vieną bloką pagal aukščiau pateiktą formulę.

Tai atrodo taip


Atrodytų paprasta, bet vis tiek reikia apie tai pagalvoti!

Taigi, jei vis tiek nuspręsite įdiegti galios stebėjimą, yra dvi galimybės:

1. Jūsų skaitiklis uždarytas ir užplombuotas, todėl nežaiskite su juo. Tai reiškia, kad impulsus galima nuskaityti tik naudojant fotorezistorių, kuris reaguoja į lemputės mirksėjimą. Jis turi būti pritvirtintas mėlyna elektros juosta priešais LED indikatorių skaitiklio priekiniame skydelyje.
Diagrama atrodys taip:

Bekontakčio impulso paėmimo grandinė


Programa tiesiog palygina fotorezistoriaus ir potenciometro varžos vertę. Be to, pastarasis leidžia nustatyti tokio jutiklio jautrumą, kad būtų išvengta klaidingų teigiamų rezultatų ir prisitaikytų prie indikatoriaus ryškumo.

2. Turite prieigą prie skaitiklio impulsų išvesties. Daugelis modelių turi impulsų išvestį, kuri dubliuoja šviesos mirksėjimą. Tai daroma tam, kad būtų galima įrenginį prijungti prie automatizuotos apskaitos sistemos. Tai tranzistorius, kuris atsidaro, kai indikatorius užsidega, ir užsidaro, kai užgęsta. Tiesiogiai prie jo prijungti paprasta – tereikia vieno ištraukiamojo rezistoriaus. Tačiau prieš tai darydami įsitikinkite, kad tai impulso išvestis, o ne kažkas kita! (pase visada yra diagrama)

Jungimo prie telemetrijos išvesties schema


Mano atveju tai yra visiška prieiga, todėl per daug nesivarginau. Įdiekite LabView ir pradėkite matuoti! Visi grafikai rodo galią (W) realiuoju laiku.
Pirmasis buvo išdalintas ilgai kentėjęs arbatinukas. Ant dangtelio rašoma, kad jo galia – 2,2 kW, tačiau, sprendžiant iš grafiko, reguliariai sunaudoja tik 1700 W. Atminkite, kad suvartojimas laikui bėgant yra daugiau ar mažiau pastovus. Tai reiškia, kad kaitinimo elementas (greičiausiai nichromas) labai mažai keičia savo varžą viso virimo metu.

Klijų pistoletas yra visai kitas reikalas - nurodyta galia 20 W. Jis elgiasi pagal fizikos dėsnius - kaitinant didėja šildytuvo varža, atitinkamai mažėja srovė. Patikrinau multimetru ir viskas gerai.

Senas radijo imtuvas "Pavasaris". Čia grafikas pradžioje pakilo dėl to, kad matavimą pradėjau pulso metu, kas atitinkamai paveikė duomenis. Diagramos skaidrės rodo, kaip pasukau garsumo rankenėlę. Kuo garsesnis, tuo labiau radijas suvalgo.

Perforuotas grąžtas, kurio nurodyta galia 700 W. Paspaudžiau mygtuką iki galo, šiek tiek palaukiau ir atleidau, bet ne sklandžiai. Diagrama aiškiai rodo srovės viršįtampius užvedant variklį. Štai kodėl lemputė mirksi, kai malonus kaimynas pradeda daužyti savo mėgstamą sieną.

Dabar ateina linksmoji dalis. Aš atlikau nedidelį eksperimentą su savo senu nešiojamuoju kompiuteriu, kurio rezultatas parodytas paveikslėlyje:

Oranžinis taškas žymi laiką, kai vienu metu paleidau kelias „sunkias“ programas. Kaip matote, procesoriaus apkrovos grafikai ir padidėjęs suvartojimas turi kažką bendro. Neseniai buvau

Dėl papildomos užduoties

Schema

Schema duonos lentoje

pastaba

    Šiame eksperimente pirmą kartą naudojame lustą, šiuo atveju 74HC595 išvesties poslinkio registrą. Mikroschemos yra naudingos, nes leidžia išspręsti konkrečią problemą, kiekvieną kartą nesurinkus standartinės grandinės.

    Išvesties poslinkio registras leidžia „išsaugoti“ skaitmeninius išėjimus naudojant tik 3, o ne 8. Registrų kaskada leistų pagaminti 16 ir t.t. signalai per tuos pačius tris kontaktus.

    Prieš naudodami mikroschemą, turite atidžiai išstudijuoti jo prijungimo schemą duomenų lape. Norint suprasti, kur skaičiuoti mikroschemos kojeles, vienoje jų pusėje yra puslankiu įpjova. Jei 74HC595 pastatysime įpjovą į kairę, apatinėje eilutėje bus 1–8 kojos, o viršutinėje – 16–9.

    Mūsų eksperimento grandinės schemoje kojos išdėstytos kitokia tvarka, kad būtų išvengta painiavos jungtyse. Kaiščių priskyrimas pagal duomenų lapą yra pažymėtas mikroschemos paveikslėlio viduje, kaiščių numeriai yra išorėje.

    Prisiminkime, kad septynių segmentų indikatoriaus vaizdas pažymėtas jo kojų numeriais ir jų atitikimu segmentams.

Eskizas

Norėdami toliau perduoti duomenų dalį, kuri bus siunčiama per pamainų registrą, fiksavimo kaiščiui turime pritaikyti LOW (lusto ST cp įvestis), tada perduoti duomenis ir siųsti HIGH į fiksavimo kaištį, po kurio perduodamas aukšto ir žemo signalo lygių derinys.

Duomenims perduoti naudojome funkciją shiftOut(dataPin, clockPin, bitOrder, value) . Funkcija nieko negrąžina, bet ją reikia pasakyti kaip parametrus

  • Arduino kaištis, kuris yra prijungtas prie lusto DS įvesties (duomenų kaiščio),

3

Tai galite padaryti ne tik be pertraukimų tvarkyklės, bet ir nenaudodami arba visai be programinės įrangos ir susidoroti su greitesniais impulsais, kurie įmanomi naudojant programinės įrangos apklausą arba pertraukimų skaičiavimą.

„Atmel AVR“, kad dauguma „Arduinos“ yra pagrįsti skaitiklio / laikmačio aparatine įranga, kuri tiesiogiai skaičiuos impulsą įvesties kaištyje. Viskas, ką jums reikia padaryti, tai sukonfigūruoti aparatinę įrangą, kad būtų paleistas skaitiklis, ir nuskaityti skaitiklio registrą. 16 bitų skaitikliai 8 bitų įrenginyje turi nedidelę komplikaciją, tačiau ją lengva įveikti. „Arduino“ pagal numatytuosius nustatymus sukonfigūruoja PWM operacijų laikmačius, tačiau tai gali būti nepaisoma, kaip aprašyta (daugiau informacijos rasite AVR vartotojo vadove) – CTC režime turite naudoti laikmatį/skaitiklį.

Arduninos pagrįstas ARM ir beveik bet kuris kitas mikrovaldiklis turės panašią techninę įrangą; kai kurie turi daugiau lankstumo, todėl kaiščiai gali būti naudojami įrangai skaičiuoti.

AVR turi 8 ir 16 bitų skaitiklius, jei reikia didelių skaičių, gali tekti tvarkyti perpildymo pertraukimą. Reguliariai tikrindami skaitiklį, galėsite apdoroti net ir tai be pertrūkių, nes galėsite apklausti daug lėtesniu ir galbūt periodišku greičiu nei įvesties pulso dažnis, prieš kitą perpildymą tiesiog apklausdami perpildymo vėliavėlę.

Jūsų atveju tikriausiai reikia nuskaityti impulsų skaičių įprastu periodu, kuris yra mažesnis nei laikas, per kurį skaitiklis perpildys didžiausią numatomą pulso dažnį. Taigi, pavyzdžiui, jei naudojate 8 bitų skaitiklį ir maksimalus širdies susitraukimų dažnis buvo 1 kHz, jums reikės atlikti apklausą kas 256/1000 sekundžių ar mažiau, tačiau didžiausią tikslumą galima gauti padarius šį laikotarpį tol, kol galima. Taigi, pavyzdžiui, galite turėti kažką panašaus į šį (tai nėra tikrasis kodas, o tik fragmentas):

For(;;) ( delayMS(250) ; dažnis = 4 * readCounter() ; )

Alternatyva, kuri gautų linijiškesnį atsaką, bet nedeterministinis skaičius, apklaustų, ar nėra perpildymo, ir išmatuotų laiką, kurio reikia fiksuotam impulsų skaičiui suskaičiuoti, todėl matavimas būtų nustatytas nuo tam tikro laiko momento fiksuotam skaičiui, o ne per. skaičiuoti fiksuotą laiką.

For(;;) ( int start = getMillisec() ; while(!counterOVF()) ( // Nieko nedaryti (arba kažko naudingo, bet greitai) ) int t = getMillisec() - start ; dažnis = 256 * t/1000 ; )

0

Labai ačiū už klausimą. Jei gerai suprantu, jūsų pirmoji idėja yra išjungti impulsus naudojant aparatinę įrangą, o antra - išjungti impulsus visą laiką, kai CPU yra užimtas. Problema ta, kad mano mikrovaldiklis yra pilnai pakrautas (todėl paprastas ISR, padidinantis skaičių kintamąjį, neveiks) ir jo negalima apklausti, nes jis turi kitų užduočių. Be to, aš nebeturiu aparatūros skaitiklių. Ar yra kitų alternatyvų? Girdėjau, kad tai įmanoma naudojant analoginius prievadus (remiantis panašumu į PWM). Labai ačiū - manatta rugpjūčio 28 d 14 2014-08-28 08:16:36 val

0

Abiem atvejais aparatūros skaitiklis atlieka skaičiavimą, antrame pavyzdyje mano apklausa tikrina, ar nėra perpildymo vėliavėlės, bet tai tik siekiant parodyti principą, tai nėra esminis sprendimas; tai taip pat gali būti pertraukimų tvarkytuvas – privalumas yra tas, kad jūs gaunate vieną pertraukimą už kiekvienus 256 impulsus (darant prielaidą, kad skaitiklis yra 8 bitų), o ne kiekvieną impulsą, todėl pertraukimo pridėtinė vertė yra daug mažesnė. - Klifordas rugpjūčio 28 d 14 2014-08-28 11:10:07

0

Analoginę įvestį galite naudoti tik tuo atveju, jei jutiklio išvestis yra fiksuoto dažnio PWM (ir pridėjote tinkamą analoginį filtravimą, kurio ribą šiek tiek žemiau šio dažnio), tačiau jūsų klausimas reiškia, kad tai kintamasis dažnis, o ne PWM (kitaip kaip padės impulsų skaičiavimas?). -



© 2023 globusks.ru - Automobilių remontas ir priežiūra pradedantiesiems