This shows you the differences between two versions of the page.
|
pm:prj2026:bianca.popa1106:radu_gabriel.covacs [2026/05/13 10:17] radu_gabriel.covacs [Algoritmi şi structuri] |
pm:prj2026:bianca.popa1106:radu_gabriel.covacs [2026/05/13 10:26] (current) radu_gabriel.covacs [Algoritmi şi structuri] |
||
|---|---|---|---|
| Line 88: | Line 88: | ||
| Controlul barierei se realizeaza asincron, manipuland direct perifericul Timer1 configurat in modul Fast PWM. In loc sa recurga la biblioteci standard, unghiul bratului este controlat printr-un algoritm de scalare liniara care transforma unghiul fizic (0° – 90°) in ciclu de lucru (duty cycle), modificand valoarea registrului de comparare OCR1A. | Controlul barierei se realizeaza asincron, manipuland direct perifericul Timer1 configurat in modul Fast PWM. In loc sa recurga la biblioteci standard, unghiul bratului este controlat printr-un algoritm de scalare liniara care transforma unghiul fizic (0° – 90°) in ciclu de lucru (duty cycle), modificand valoarea registrului de comparare OCR1A. | ||
| Formula utilizata este OCR1A = 2000 + (angle * 2000 / 90). Aceasta ecuatie translateaza gradele in „ticuri” de ceas de baza: pentru pozitia inchisa (0°), registrul ia valoarea de baza 2000 (generand un impuls precis de 1 ms), iar pentru pozitia deschisa (90°) atinge pragul de 4000 (impuls de 2 ms). Actualizarea directa a acestui registru permite o actionare mecanica precisa, in timp ce generarea frecventei de 50 Hz este gestionata complet in fundal de catre unitatea hardware, eliminand orice overhead asupra microcontrolerului. | Formula utilizata este OCR1A = 2000 + (angle * 2000 / 90). Aceasta ecuatie translateaza gradele in „ticuri” de ceas de baza: pentru pozitia inchisa (0°), registrul ia valoarea de baza 2000 (generand un impuls precis de 1 ms), iar pentru pozitia deschisa (90°) atinge pragul de 4000 (impuls de 2 ms). Actualizarea directa a acestui registru permite o actionare mecanica precisa, in timp ce generarea frecventei de 50 Hz este gestionata complet in fundal de catre unitatea hardware, eliminand orice overhead asupra microcontrolerului. | ||
| + | |||
| + | ===3. Detectarea fronturilor (Edge Detection) si calculul dinamic al tarifului=== | ||
| + | Senzorii infrarosu pentru locurile de parcare sunt cititi periodic, insa sistemul nu prelucreaza starea lor continua, ci reactioneaza strict la tranzitiile de stare (detectarea fronturilor crescatoare si descrescatoare) comparand starea curenta cu cea anterioara. La ocuparea locului (front descrescator): Sistemul memoreaza amprenta de timp curenta in vectorul 'occupancy_start_time'. La eliberarea locului (front crescator), sistemul calculeaza diferenta de timp pentru a afla durata stationarii in milisecunde. Algoritmul aplica apoi modelul de tarifare multiplicand secundele scurse cu constanta PRICE_PER_SECOND, generand valoarea finala de plata in mod dinamic si eficient din punct de vedere al memoriei. | ||
| + | |||
| + | ===4. Automat de stari temporizat pentru controlul accesului=== | ||
| + | Pentru a permite sistemului sa citeasca in continuare senzorii si sa trimita date pe seriala in timp ce o masina trece pe la bariera, s-a eliminat complet utilizarea functiilor de intarziere (delay). Logica barierei a fost modelata ca un automat de stari folosind variabilele 'asteptare_inchidere' si 'moment_eliberare_senzor'. Cand o masina declanseaza bariera, sistemul o ridica si asteapta ca vehiculul sa paraseasca raza senzorului ultrasonic. Odata ce senzorul nu mai detecteaza obstacolul (dist > 10), se declanseaza un "timp de gratie" de 3 secunde (current_time - moment_eliberare_senzor > 3000). Aceasta abordare garanteaza ca bariera nu va cobori peste masina (prevenind accidentele) si pastreaza microcontrolerul 100% responsiv in timpul celor 3 secunde de asteptare. | ||