Arduino impulsu skaitītājs. ATmega

Arduino impulsu skaitītājs. ATmega

24.06.2023

Ieviesa signālu PWM 25 kHz. Man nav osciloskopa, bet es gribu pārbaudīt rezultātu. Izgatavojam pulsa skaitītāju, pārbaudām darbu.

Uzdevums

Uz pamatnes ATmega 328P pārbaudiet impulsu skaitītāju PWM 25 kHz, mērījumu precizitāte līdz pulsam nav nepieciešama, taču ir jāzina secība.

Risinājums

Risinājuma loģika ir vienkārša, mēs izsekojam impulsus, ar kuriem mēs uz sekundi palielināsim globālo mainīgo. Uzkrātā vērtība būs ienākošā signāla frekvence.

Lai nolasītu impulsus, mēs izmantosim ārējos pārtraukumus, tie ir aprakstīti lapās 87-96 ražotāja dokumentāciju. IN Atmega 328P ir divas ieejas, ar kurām mēs varam uzraudzīt ārējos pārtraukumus INT0(PD2) Un INT1 (PD3), lai atrisinātu problēmu, mēs izmantojam INT0.

Ārējo pārtraukumu iestatīšana

Pirmais solis ir porta konfigurēšana D kā ieeju, un, lai izvairītos no traucējumiem, pievienošu pievilkšanas rezistoru.

Lai noteiktu, kuri notikumi aktivizēs pārtraukumu apstrādātāju, ir jākonfigurē reģistrs ĒRIKA. biti ISC00 Un ISC01 atbildīgs par INT0, A ISC10 Un ISC11 aiz muguras INT1. Uzraudzīto notikumu iestatījums ir identisks ar atšķirību bitos:

00 - Zems signāla līmenis;
01 — jebkura loģiska signāla maiņa;
10 — krītoša signāla mala;
11 — signāla augošā mala.

Reģistrs tiek izmantots, lai tieši iespējotu pārtraukumu ievades. EIMSK, biti INT0 Un INT1 ir atbildīgi par tāda paša nosaukuma izvadiem. Mēs rakstām kodu saskaņā ar iepriekš minēto

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

Ārējo pārtraukumu apstrāde

Pārtraukumi ir iestatīti, tagad mums tie ir jāapstrādā. Šim nolūkam ir pārtraukumu apstrādātājs. ISR(), kurā manā gadījumā ir jānorāda pārtraukuma veids INT0_vect. Funkcijā mēs palielināsim mainīgo Tic_Count:

ISR(INT0_vect) (Tic_Count ++; )

Rezultātu izvade

Lai atvieglotu rezultāta izvadīšanu, lai nesaskrūvētu displeju, izmantoju netīro ATmega 328P, A Arduino UNO Un Arduino NANO, uz kura kuģa tas pats MK.

Kā jau rakstīju iepriekš, mērījumu precizitāte nav tik svarīga, tāpēc taimerus neiestatīšu, bet vienkārši galvenajā cilpā reizi sekundē parādīšu mainīgā uzkrāto vērtību Tic_Count un atiestatiet to. Šo darbību laikā es pārtraucu pārtraukumu apstrādi.

Zemāk ir pilns kods problēmas risināšanai ar komentāriem:

#define F_CPU 1600000UL #include #iekļauts gaistošs unsigned int Tic_Count = 0; // Ārējais pārtraukumu apstrādātājs INT0 ISR(INT0_vect) ( Tic_Count ++; ) void setup() ( int0_initial(); Serial.begin(9600); ) void loop() ( cli(); // Atspējot pārtraukumus Serial. println( Tic_Count); Tic_Count = 0; sei(); // Iespējot pārtraukumu aizkavi (1000); ) void int0_initial(void) ( DDRD = 0x00; // Ports D kā ievade PORTD = (1)<< 2); // Включение подтягивающего регистра EICRA = (1 << ISC00) | (1 << ISC01); // Восходящий фронт сигнала EIMSK = (1 << INT0); // Включение входа прерывания sei(); // Разрешаем прерывания }

Tagad atliek savienot PWM signālu ar PD2 tapu un atvērt seriālā porta monitoru. Varat arī ģenerēt un pārbaudīt signālu vienā MK.

Parādītie rādījumi ir aptuveni vienādi ar iepriekš aprēķināto biežumu, ieviešanas dēļ gaidāmas nelielas atšķirības. Lai veiktu precīzu mērījumu, iespējams, ir pareizāk skaitīt laiku starp impulsiem un aprēķināt frekvenci no tā.

Šajā rakstā ir visi dati par Arduino bāzes elektrības skaitītāju, tostarp diagrammas, programmaparatūra, komentāri par pašreizējās programmaparatūras versijas un dizaina pārskatīšanu.

Tā tas izskatās beigās.

Sākotnēji visu informāciju sadalīju lielā sīku rakstu kaudzē - kas padarīja ļoti neērtu to meklēt un vispār atkārtot šo ierīci. Šis raksts šo situāciju labo.

1. daļa. Ideja, dizains un domāšana skaļi.

Pirms kāda laika es uzstādīju divu zonu elektrības skaitītāju, lai izmantotu labāku nakts tarifu (50% no 2300 līdz 0800). Izrādījās, ka naktī patērējam 45% elektrības. Bet atbilde ir par to, kā patēriņš notiek patēriņa vietu kontekstā. Protams, šī ierīce to nedara.

Tāpēc radās nepieciešamība pēc patēriņa datu detalizētāka izklāsta. Sākotnēji tika nolemts izveidot ierīci, kas rāda šādus datus:

  1. Pašreizējā slodzes jauda
  2. Patēriņš kopš dienas sākuma
  3. Patēriņš kopš mēneša sākuma
  4. Nakts patēriņa procentuālā daļa %

Tāpat ierīcei ir jāpārraida uz konfigurējamu interneta adresi patēriņa dati par pēdējām 24 stundām 24 rādījumu veidā. Pārraides intervāls — iestatīts minūtēs 1…120.

Izvēlnē iestatītie parametri:

  1. Stunda RTC
  2. Minūte RTC
  3. Diena RTC
  4. Mēnesis RTC
  5. Gads RTC
  6. Skaitīšanas intervāls 1…120
  7. tīkla adrese, kas norāda pozicionālās rakstzīmes: “a-z0-9_-/: “. Rediģējamā rakstzīme ir jāizceļ, lai būtu skaidrs, kas tiek rediģēts.

Ierīces sākotnējā versija tiks izgatavota, pamatojoties uz šādu moduļu komplektu:

  1. (precizējums par indikatora pieslēgšanu mega 2560)

Ierīce interesē, lai noskaidrotu, cik daudz patērē darbnīca, mediju ierīces, virtuves piederumi. Tā rezultātā jums ir jāiegūst dati grafiku veidā, internetā vai vietējā tīkla serverī ()

Mērīšanas mezgla sākotnējā savienojuma shēma.

Es aizņēmos shēmu jaudas un sprieguma mērīšanai. Tiek ņemta vērā vidējā jauda, ​​un ne tikai, daudzi citi parametri, piemēram, frekvence, jaudas koeficients. Vispirms jums ir jāsamontē tik mazs statīvs mērīšanai.

Paņemu maizes dēli, meklēju piemērotu transformatoru, lai izmērītu spriegumu (ņemu no ATX dežūrtelpas), un uz priekšu.

UPD. Mērīšanas mezgls

2.1. daļa Piezīmes par pārsteidzošajām ENC28J60 funkcijām

Apbrīnojama lieta. Šodien sāku rakt moduli darbam ar ezernetu, "counter" projektam. Kurš gan būtu šaubījies, bija jautri, un beigās viss izdevās.

Pēc savienojuma. Mēs meklējam, kur atrast SPI saskarni ar Arduino "Mega", nu, vai jūsu. Mēs savienojam. Mēs pakarinām CS izvadi (čipu atlasi) jebkurā vietā, kur vēlamies, pēc tam tā tiek iestatīta atsevišķi bibliotēkas inicializācijā. Es to "pakāru" uz 42. tapas, jums var būt kāds cits. Atlikušie MOSI / MISO / SS / OV / 3.3V ir savienoti ar atbilstošajām Arduino tapām.

Izrādījās, ka, lai samazinātu atmiņas izmantošanu, "brīnišķīgās" EtherCard bibliotēkas izstrādātājs nolēma un nosūtīja dažas virknes GET pieprasījumam programmas atmiņā. Tas ir, iedomājieties, ārštata programmētājs pēkšņi nolēma sevi padarīt par skaitītāju. Lai viss būtu gudrs, viņš nolēma rediģēt URL rindiņu, kurā dati tiek nosūtīti. Un pat šodien izdarīja to:

Un tā viņš savieno bibliotēku un domā, ka tagad viņš viegli iesniegs pieprasījumu ārējam serverim. Nē. Galu galā viņš iestatīja serveri kā virkni. Diemžēl virkne nav programmas atmiņa. Hārvardas arhitektūra. Viss ir sadalīts.

Nekas, ātri iekāpu bibliotēkā, atradu vietu, kur pieprasījums aizpildīts, sagrozīju, atņēmu visu “lieko” manuprāt, protams. Galu galā viss darbojas lieliski.

Es pievienoju bibliotēku un piemēru darbam ar serveri, kas darbojas virknēm. un ne tikai par nemaināmām vērtībām programmā. Kopā ar piemēru -

Projekta gaitā atliek tikai atrisināt problēmu ar mērīšanas daļu, viss pārējais jau ir atrisināts. Sarežģītākā lieta programmā bija URL virknes rediģēšana.

Savienojuma iespēja ir tikai DHCP, statiskos ip un atlases uzdevumus netaisos darīt, viss darbojas diezgan korekti, kā arī nevajag pievienot funkcionalitāti, kas man nav vajadzīga.

3. daļa. Skaitītāja programmatūras sākotnējā atkļūdošana

Šodien es nedaudz pacentos ar skaitītāja programmatūras atkļūdošanu. Fakts ir tāds, ka es kļūdas dēļ neuzstādīju pazeminošo rezistoru, pārāk daudz sprieguma iekļuva CT sensorā, un rezultātā ieejā iekļuva pārāk daudz trokšņa. Labots, pielodēts 150 omi paralēli ST sensoram, kopumā iznāca ap 100 omi.

Programmā nācās nedaudz koriģēt koeficientus.Pielāgoju...pēc ķīniešu skaitītāja. Pēc tam uz voltmetra. Dabūju pēc iespējas tuvāk.

Rezultātā EH patēriņa mērīšana tējkannas vārīšanai parādīja to pašu, ko Ķīnas vatmetrs. Ir jau labi, bet būs kaut kā jāpaskatās uz galvenā letes.

Burts h aiz kW displejā neiederējās, bet jāsaprot, ka tas ir. Skaitlis parāda patēriņu kopš pašreizējās stundas sākuma. Stundas beigās tas tiek nosūtīts uz serveri un tiek atiestatīts uz nulli. Tad, iespējams, es to atiestatīšu reizi dienā.

Skaitītāja programmatūra tās pašreizējā formā -

4. daļa. Pirmās ķermeņa daļas izgatavošana

Šodien uztaisīju maciņu, materiāls tāds pats kā pagājušo reizi - 11mm kaprolons. Stiprinājums taisnība uz M4 imbus skrūvēm, pēdējo reizi visur bija M3. Tas ir pārāk vājš ķermenim.

Mērogiem ielieciet peli iekšā "gaiss".

Atliek izgatavot priekšējo paneli, salabot moduļus, veikt frēzēšanu USB un 12V jaudai. Šīs ierīces gadījumā droši vien pietiks ar 0,7A, tas ir, var izmantot kaut ko maza izmēra.

5. daļa Priekšējā paneļa izgatavošana

9. daļa. Atjaunināta programmatūra, pamatojoties uz ierīces darbības rezultātiem

Apmēram vienu mēnesi operācijas laikā nonācu pie secinājuma, ka vajag pieskaitīt kārtējās patērētās jaudas pārsūtīšanu, mēneša pirmajā pusē. Turklāt es pārvietoju apkopojošo tīmekļa serveri savā apakštīklā un pārtraucu datu pārsūtīšanu ārpusē. Jo dažiem tas neizdevās. Tādējādi ir palielinājusies datu vākšanas uzticamība. Nu, patiesībā šeit ir jaunākā programmaparatūra - .

Atjaunināts 23.09.2015. Šodien uzrakstīju interfeisu monitoringa datu apskatei. Tajā pašā laikā es optimizēju programmaparatūru, atradu tajā kļūdas. Es paaugstināju iekšējo DNS serveri, vietnē "" tas ir dažu minūšu jautājums.

Tikko rādīja pēdējās 48 stundas (pazaudēju statistiku, tāpēc grafikā ir mazāk) izlīdzinātas diagrammas veidā. Šļakatas ir veļas mazgājamās mašīnas sākums, saskaņā ar U - cena grivnās par pašreizējo stundu, protams, ņemot vērā nakts likmi. Pēc X — datums/laiks.

Tagad mēs varam apskatīt notiekošo. Neliela nianse - visu ievietoju mājas tīklā, lielākai stabilitātei.

Jau iepriekš rakstīju, ka izmēģināju vienu standarta programmatūru, lai parādītu elektriķu patēriņu (emoncms). Es nesaprotu paradigmu un pieeju. Tur tas ik pēc trim sekundēm nosūta datus uz serveri un kaut ko parāda. Es darīju savādāk - ierīce uzkrāj datus par 1 stundu, pēc tam nosūta tos pēdējās 24 stundās. Tīmekļa serveris nedarbojas, tas ir mazjaudas NAS.

UPD. Izrādījās, ka tas nav internets, kas man ir, šī ierīce dažreiz nepārraida datus. Nav skaidrs, ar ko saistīts, un grūti noķert, tāpēc gāju citu ceļu - rēķinot starprādījumus pēc pašreizējā patēriņa. Uz dienu kaut kur 1-2 reizes ir neveiksme. Šī shēma ļauj atteikties no stundu datu glabāšanas savā nozarē, kas arī kaut kādu iemeslu dēļ nedarbojas gluži pareizi.

UPD. Vietnei ir pabeigta programmatūra, kas parāda datus. Tagad ir spriegums pa stundām, stundas un dienas izdevumi.

Es domāju par programmatūras mitināšanu vietnē github. Var būt. tā arī būs.

Nē, šis raksts nav par citu veidu, kā maldināt šo neveiksmīgo ierīci. Lūk, kā izmantot Arduino un LabView, lai pārvērstu elektrības skaitītāju par jaudas monitoru vai pat ampērmetru!


Pats pirmais elektrības skaitītājs bija indukcijas. Tās darbības princips ir smieklīgi vienkāršs – patiesībā tas ir elektromotors, kura rotors ir alumīnija disks, kas griež ciparnīcu. Jo vairāk strāvas tas velk, jo ātrāk disks griežas. Ierīce ir tīri analoga.

Tomēr šodien indukcijas skaitītāji zaudē savu vietu, dodot vietu lētākiem elektroniskajiem kolēģiem. Un tikai viens no tiem kļūs eksperimentāls:

Darbības princips nav īpaši mainījies - šajā gadījumā disks tiek aizstāts ar elektroniku, kas ģenerē impulsus atbilstoši patērētās elektroenerģijas daudzumam. Parasti lielākajā daļā ierīču šos impulsus parāda LED indikators. Attiecīgi, jo ātrāk mirgo šī gaisma, jo dārgāks kW tiek sadedzināts.
Turklāt jebkuras ierīces priekšējā panelī ir skaitītāja attiecība A- impulsu skaits uz 1 kWh. Kā redzams fotoattēlā, eksperimentālais A = 12800. No šīs informācijas var izdarīt šādus secinājumus:

Ar katru impulsu skaitītājs reģistrē patēriņu, kas vienāds ar 1/12800 no 1 kWh. Ja ieslēdzat slodzi uz skaitītāju un sākat vienkārši skaitīt impulsus, tad ir viegli iegūt tā patērēto elektroenerģijas daudzumu (kWh), dalot impulsu skaitu ar pārnesumu attiecību.

Tā kā indikators maina mirgošanas ātrumu, ir iespējams secināt sakarību starp jaudu (kW) un viena metra impulsa laiku, kas ļaus iegūt datus par jaudu / strāvu.
Nekrāsim rakstu ar aprēķiniem, bet ja vajag, tad

šeit tie ir

Patiešām, skaitītāja pārnesumskaitlis ir lieliska lieta, jo, to zinot, jūs varat izteikt gan jaudu, gan strāvu:
Izveidosim proporciju no mūsu pārnesumskaitļa (A=12800 imp/kW*h) un nezināmā pārnesuma skaita, kas būs pie slodzes X un viena impulsa laikā (gaisma mirgo):

Šeit X ir nezināmā jauda, ​​un t ir viena impulsa laiks. Mēs izsakām nezināmo spēku no šejienes, un šeit tas ir:

Strāvu aprēķina, izmantojot šādu pārnesumu attiecību un zināmo un nezināmo strāvu proporciju pie slodzes X.:


Kas kopumā noved pie identiskas formulas, bet strāvai (strāvu mēra ampēros, un indeksi nozīmē slodzi, pie kuras šī strāva būs):

Šeit jūs varat redzēt kļūmi - jums jāzina strāva pie ideālas slodzes 1 kW. Ja nepieciešama laba precizitāte, labāk to izmērīt pats, un, ja nē, tad to var aptuveni aprēķināt, izmantojot formulu (spriegums un jauda ir zināmi), taču tas būs aptuvenāks, jo jaudas koeficients netiek ņemts vērā. konts.


Tādējādi viss balstās uz viena impulsa laika mērīšanu (indikatora mirgošana). Savā pētījumā es paļāvos uz šo lielisko projektu. Kāds itālis izveidoja interfeisu jaudas uzraudzībai Labview vidē un nāca klajā ar ķēdi impulsu mērīšanai. Bet viņa projektā bija milzīgs trūkums - tas bija piemērots tikai skaitītājiem ar pārnesuma attiecību 1000 imp / kWh.

Augšējais grafiks ir vidējā jauda 5 minūtēs, apakšējā diagramma ir reāllaikā. Interfeiss ir diezgan elastīgs, un to var viegli pārveidot, lai tas atbilstu jūsu vajadzībām. Ja vēl neesi tikusi galā ar LabView vidi, iesaku iepazīties.

Lai viss darbotos, izrādījās, ka pietika ar vienu bloku ievadīšanu programmas algoritmā saskaņā ar iepriekš minēto formulu.

Tas izskatās šādi


Šķiet vienkārši, bet pirms tam vēl jāpadomā!

Tātad, ja jūs joprojām nolemjat ieviest jaudas uzraudzību, ir divas iespējas:

1. Jūsu lete ir aizvērta un aizzīmogota, cik vien iespējams. Tas nozīmē, ka impulsus var nolasīt tikai, izmantojot fotorezistoru, kas reaģē uz spuldzes mirgošanu. Tam jābūt piestiprinātam ar zilu elektrisko lenti pretī LED indikatoram skaitītāja priekšējā panelī.
Shēma izskatīsies šādi:

Bezkontakta impulsa uztveršanas shēma


Programma vienkārši salīdzina fotorezistora un potenciometra pretestības vērtību. Turklāt pēdējais ļauj iestatīt šāda sensora jutību, lai izvairītos no viltus trauksmes un pielāgotos indikatora spilgtumam.

2. Jums ir piekļuve skaitītāja impulsa izvadei. Daudziem modeļiem ir impulsa izvade, kas dublē mīļotā mirkšķināšanu. Tas tiek darīts, lai ierīci varētu savienot ar automatizēto uzskaites sistēmu. Tas ir tranzistors, kas atveras, kad indikators ir ieslēgts, un aizveras, kad tas nodziest. Tiešā savienojuma izveide ar to nav grūta - ir nepieciešams tikai viens pievilkšanas rezistors. Tomēr, pirms to darāt, pārliecinieties, ka šī ir impulsa izvade, nevis kaut kas cits! (pasē vienmēr ir shēma)

Shēma savienošanai ar telemetrijas izvadi


Manā gadījumā piekļuve ir pilna, tāpēc es pārāk neuztraucos. Instalējiet LabView un sāciet mērīt! Visi grafiki attēlo jaudu (W) reāllaikā.
Kā pirmā tika izdalīta ilgi cietusī tējkanna. Uz vāciņa rakstīts, ka tā jauda ir 2,2 kW, taču, spriežot pēc grafika, tas regulāri patērē tikai 1700 vatus. Ņemiet vērā, ka patēriņš laika gaitā ir vairāk vai mazāk nemainīgs. Tas nozīmē, ka sildelements (visticamāk, nihroms) ļoti maz maina savu pretestību visa viršanas procesa laikā.

Līmes pistole ir pavisam cita lieta - deklarētā jauda ir 20 W. Tas uzvedas saskaņā ar fizikas likumiem - sildot, sildītāja pretestība palielinās, un strāva attiecīgi samazinās. Es to pārbaudīju ar multimetru un viss ir klāt.

Vecs radio uztvērējs "Pavasaris". Šeit grafiks sākumā pacēlās uz augšu, jo es sāku mērījumu impulsa laikā, un attiecīgi tas ietekmēja datus. Diagrammas slaidi parāda, kā es pagriezu skaļuma pogu. Jo skaļāk - jo vairāk radio ēd.

Perforators ar deklarēto jaudu 700 vati. Nospiedu pogu līdz galam, mazliet pagaidīju un palaidu vaļā, bet ne gludi. Grafikā skaidri redzama iedarbināšanas strāva, iedarbinot dzinēju. Tāpēc gaisma mirgo, kad labs kaimiņš sāk dauzīties pa savu mīļoto sienu.

Un tagad pats interesantākais. Veicu nelielu eksperimentu ar savu veco portatīvo datoru, kura rezultāts ir redzams attēlā:

Oranžs punkts apzīmē laiku, kad es palaidu vairākas "smagas" programmas vienlaikus. Kā redzat, CPU slodzes grafikiem un palielinātam patēriņam ir kaut kas kopīgs. Nesen bija

Papildu uzdevumam

ķēdes shēma

Shēma uz maizes dēļa

Piezīme

    Šajā eksperimentā mēs pirmo reizi izmantojam IC, šajā gadījumā 74HC595 izvades maiņas reģistru. Mikroshēmas ir noderīgas ar to, ka tās ļauj atrisināt konkrētu problēmu, katru reizi nesaliekot standarta ķēdi.

    Izvades maiņu reģistrs dod mums iespēju "saglabāt" digitālās izejas, izmantojot tikai 3, nevis 8. Reģistra kaskāde ļautu 16 utt. signālus caur tiem pašiem trim kontaktiem.

    Pirms mikroshēmas lietošanas rūpīgi jāizpēta tās savienojuma shēma datu lapā. Lai saprastu, kur skaitīt mikroshēmas kājas, tām vienā pusē ir pusapaļa iecirtums. Ja 74HC595 novietosim ar iecirtumu pa kreisi, tad apakšējā rindā būs 1.–8. kājas, bet augšējā rindā — 16.–9.

    Mūsu eksperimenta shematiskajā diagrammā kājas ir sakārtotas citā secībā, lai savienojumos nebūtu neskaidrību. Tapu piešķiršana saskaņā ar datu lapu ir parakstīta mikroshēmas attēla iekšpusē, kāju numuri ir ārpusē.

    Atgādiniet, ka uz septiņu segmentu indikatora attēla ir parakstīti tā kāju numuri un to atbilstība segmentiem.

Skice

Lai tālāk pārsūtītu daļu no datiem, kas tiks nosūtīti caur maiņu reģistru, fiksatortapai jāpieliek LOW (mikroshēmas ST cp ieeja), pēc tam jāpārsūta dati un pēc tam jānosūta HIGH uz fiksatortapu. , pēc kura pārraidīts augsta un zema signāla līmeņa kombinācija.

Datu pārsūtīšanai izmantojām funkciju shiftOut (dataPin, clockPin, bitOrder, value). Funkcija neko neatgriež, un kā parametri tā ir jāpasaka

  • Arduino tapa, kas ir savienota ar mikroshēmas DS ieeju (datu tapu),

3

To var izdarīt ne tikai bez pārtraukumu apdarinātāja, bet arī ar nelielu programmatūras daudzumu vai bez tās, kā arī izmantot ātrākus impulsus, kas ir iespējami ar programmatūras aptauju vai pārtraukumu skaitīšanu.

Atmel AVR, ka lielākā daļa Arduinos ir balstīti uz skaitītāja/taimera aparatūru, kas tieši uzskaitīs impulsu pie ievades tapas. Viss, kas jums jādara, ir iestatīt skaitītāja aparatūru un izlasīt skaitītāju reģistru. 16 bitu skaitītāji 8 bitu ierīcē rada nelielu sarežģījumu, taču to var viegli pārvarēt. Arduino pēc noklusējuma iestata taimerus PWM darbībām, taču to var ignorēt, kā aprakstīts (sīkāku informāciju skatiet AVR lietotāja rokasgrāmatā) - jums ir jāizmanto taimeris/skaitītājs CTC režīmā.

Arduninos balstīta ARM un gandrīz jebkuram citam mikrokontrollerim būs līdzīga aparatūra; daži ir elastīgāki, lai ar tapas varētu skaitīt aprīkojumu.

AVR ir 8 un 16 bitu skaitītāji, ja nepieciešams liels skaits, iespējams, būs jārīkojas ar pārplūdes pārtraukumu. Ja regulāri pārbaudāt skaitītāju, varat veikt pat to bez pārtraukuma, jo varat veikt aptaujas ar daudz lēnāku un, iespējams, periodisku ātrumu nekā ievades pulsa ātrums, vienkārši aptaujājot pārpildes karogu pirms nākamās pārplūdes.

Jūsu gadījumā, iespējams, jums ir jānolasa impulsu skaits regulārā periodā, kas ir mazāks par laiku, kad skaitītājs pārplūdīs ar maksimālo paredzamo pulsa ātrumu. Piemēram, ja jūs izmantojat 8 bitu skaitītāju un maksimālais sirdsdarbības ātrums bija 1 kHz, jums būtu jāveic aptauja ik pēc 256/1000 sekundēm vai mazāk, taču jūs varat iegūt vislielāko precizitāti, padarot šo periodu pēc iespējas ilgāku. . Piemēram, jums varētu būt kaut kas līdzīgs šim (tas nav īsts kods, tikai fragments):

For(;;) ( delayMS(250) ; frekvence = 4 * readCounter() ; )

Alternatīva, kas saņems lineārāku atbildi, bet nedeterministisku skaitīšanu, nopratinās pārplūdes un izmērīs laiku, kas nepieciešams, lai saskaitītu fiksētu impulsu skaitu, un tādējādi definēs savu mērījumu no fiksēta skaita laika, nevis skaitīt noteiktā laikā.

For(;;) ( int start = getMillisec() ; while(!counterOVF()) ( // Nedarīt neko (vai kaut ko noderīgu, bet ātri) ) int t = getMillisec() - start ; frekvence = 256 * t/1000 ; )

0

Liels paldies par jūsu jautājumu. Ja es pareizi saprotu, jūsu pirmā ideja ir izslēgt impulsus caur aparatūru, un otrā ir visu laiku, kad CPU ir aizņemts. Problēma ir tāda, ka mans mikrokontrolleris ir pilnībā ielādēts (tāpēc vienkāršs ISR, kas palielina skaitītāja mainīgo, nedarbosies), un to nevar aptaujāt, jo tam ir jāveic citi uzdevumi. Tāpat man vairs nav aparatūras skaitītāju. Vai ir citas alternatīvas? Esmu dzirdējis, ka tas ir iespējams, izmantojot analogos portus (paļaujoties uz līdzību ar PWM). Liels paldies - manattatta 28. augusts 14 2014-08-28 08:16:36

0

Abos gadījumos aparatūras skaitītājs veic skaitīšanu, otrajā piemērā mana aptauja pārbauda pārpildes karogu, bet tas ir tikai, lai parādītu principu, tas nav būtisks lēmums; tas var būt arī pārtraukumu apstrādātājs - priekšrocība ir tāda, ka jūs saņemat vienu pārtraukumu uz katriem 256 impulsiem (pieņemot, ka 8 skaitītāja biti), nevis katru impulsu, tāpēc pārtraukuma pieskaitāmās izmaksas ir daudz mazākas. - Kliforda 28. augusts 14 2014-08-28 11:10:07

0

Analogo ieeju var izmantot tikai tad, ja sensora izeja ir fiksēta PWM frekvence (un esat pievienojis piemērotu analogo filtrēšanu ar robežvērtību nedaudz zem šīs frekvences), taču jūsu jautājums nozīmē, ka tā ir mainīga frekvence, nevis PWM (pretējā gadījumā palīdz pulsa skaitīšanai? ). -



© 2023 globusks.ru - Automašīnu remonts un apkope iesācējiem