Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pm:prj2021:abasoc:api_arc_board [2021/05/03 18:26]
robert_mihai.lica [Descriere generală]
pm:prj2021:abasoc:api_arc_board [2021/06/03 02:45] (current)
robert_mihai.lica [Bibliografie/Resurse]
Line 10: Line 10:
 ====== Descriere generală ====== ====== Descriere generală ======
 Diagrama software:\\ \\ Diagrama software:\\ \\
-TO_DO: Schimba imaginea cu cea mai noua versiune, fa OCW-ul sa vada ultima versiune si sa o ignore pe prima \\ 
 {{ :​pm:​prj2021:​abasoc:​robert_mihai.lica-api_software_diagram.png?​500 }} \\ {{ :​pm:​prj2021:​abasoc:​robert_mihai.lica-api_software_diagram.png?​500 }} \\
 Diagrama hardware:\\ \\ Diagrama hardware:\\ \\
Line 32: Line 31:
   - Un receiver de dimensiuni mici pe 2.4Ghz compatibil cu radio telecomenzile FlySky. Este folosit pentru a da o comanda de kill masinii daca este pe cale sa se loveasca de ceva.   - Un receiver de dimensiuni mici pe 2.4Ghz compatibil cu radio telecomenzile FlySky. Este folosit pentru a da o comanda de kill masinii daca este pe cale sa se loveasca de ceva.
 ====== Software Design ====== ====== Software Design ======
-TODO+===<​timer.hpp>​=== 
 +==Notes:​== 
 +Biblioteca foloseste timmer-ul FTM1.\\ 
 +\\  
 +==Metode:​== 
 + ​static Timer& get_instance(void) \\ 
 + ​Returneaza o referinta catre obiect si la prima apelare este initializat obiectul. 
 +    Timer& instance = Timer::​get_instance();​ 
 +\\ 
 + ​uint32_t micros(void) \\ 
 + ​Returneaza un unsigned int ce reprezinta timpul in microsecunde de la primul apel Timer::​get_instance(). 
 +    auto elapsed = instance.micros();​ 
 +\\ 
 + ​uint32_t millis(void) \\ 
 + ​Returneaza un unsigned int ce reprezinta timpul in milisecunde de la primul apel Timer::​get_instance(). 
 +    auto elapsed = instance.millis();​ 
 +\\ 
 + void delayMicroseconds(uint32_t t) \\ 
 + ​Functie blocanta ce asteapta '​t'​ microsecunde. 
 +    instance.delayMicroseconds(500000U);​ // 0.5 sec 
 +\\ 
 + void delay(uint32_t t) \\ 
 + ​Functie blocanta ce asteapta '​t'​ milisecunde. 
 +    instance.delay(1000);​ // 1.0 sec 
 +\\ 
 + ​uint32_t add_irq_handler(void (*time_IRQn_handler)(void)) \\ 
 + ​Returneaza 0 pentru success si -1 in caz de eroare. \\ 
 + ​Primeste un pointer la o functie, ce intoarce void si accepta void ca parametru, si o adauga in vectorul "​irq_handlers"​ ce vor fi apelate la intreruperea de ceas (0.2 sec). 
 +    instance.add_irq_handler(function);​ 
 +\\ 
 + void call_irq_handlers(void) \\ 
 + ​Metoda apelata de rutina de tratare a intreruperii de ceas (0.2 sec) pentru a executa toate functiile din vectorul "​irq_handlers"​ 
 +    instance.call_irq_handlers();​ 
 +\\
  
 +\\
 +===<​motor_driver.hpp>​===
 +==Notes:==
 +Biblioteca foloseste timmer-ul FTM0 si canalele 0, 1, 2, 3.\\
 +==Metode:==
 + ​static Motors& get_instance(void) \\
 + ​Returneaza o referinta catre obiect si la prima apelare este initializat obiectul.
 +    Motors& instance = Motors::​get_instance();​
 +\\
 + ​static void give_config(struct motor_config_t&​ conf) \\
 + ​Pentru viitor: mod avansat de a configura clasa inaintea primului apel catre Motors::​get_instance();​ momentan este folosita configuratia default.
 +    Motors::​give_config(custome_config);​
 +\\
 + void enable_motor_driver(void) \\
 + ​Activeaza puntile H ale placii. Pentru detalii consultati schemele {{ :​pm:​prj2021:​abasoc:​robert_mihai.lica-nxp_cup_arc_ingenierie_schematic_prints.pdf | placii}} si a [[https://​www.nxp.com/​docs/​en/​data-sheet/​MC33887.pdf | puntii-H]]
 +    instance.enable_motor_driver();​
 +\\
 + void disable_motor_driver(void) \\
 + ​Dezactiveaza puntile H ale placii. Pentru detalii consultati schemele {{ :​pm:​prj2021:​abasoc:​robert_mihai.lica-nxp_cup_arc_ingenierie_schematic_prints.pdf | placii}} si a [[https://​www.nxp.com/​docs/​en/​data-sheet/​MC33887.pdf | puntii-H]]
 +    instance.disable_motor_driver();​
 +\\
 + void enable_motor_outputs(void) \\
 + ​Activeaza output-urile puntilor-H. Pentru detalii consultati schemele {{ :​pm:​prj2021:​abasoc:​robert_mihai.lica-nxp_cup_arc_ingenierie_schematic_prints.pdf | placii}} si a [[https://​www.nxp.com/​docs/​en/​data-sheet/​MC33887.pdf | puntii-H]]
 +    instance.enable_motor_output();​
 +\\
 + void disable_motor_outputs(void) \\
 + ​Dezactiveaza output-urile puntilor-H. Pentru detalii consultati schemele {{ :​pm:​prj2021:​abasoc:​robert_mihai.lica-nxp_cup_arc_ingenierie_schematic_prints.pdf | placii}} si a [[https://​www.nxp.com/​docs/​en/​data-sheet/​MC33887.pdf | puntii-H]].
 +    instance.disable_motor_output();​
 +\\
 + void update_motor_status(void) \\
 + ​Configureaza puntile-H conform starii interne a obiectului. Aceasta metota nu ar trebuii sa fie utilizata decat daca pinii uC-ului au fost setati nu prin API-ul current si a aparut o discrepanta intre configurare si starea interna a obiectului.
 +    instance.update_motor_status();​
 +\\
 + void set_rps_target(const float rps) \\
 + ​Seteaza un nr. de rotatii pe secunda (rps) dorit si bucla PID interioara se ocupa de atingerea tintei daca aceasta este activata (default activa). ​
 +    instance.set_rps_target(15.5f);​
 +\\
 + void get_rps_target(void) \\
 + ​Returneaza nr. de rotatii pe secunda dorit, folosit de bucla PID interioara se ocupa de atingerea tintei daca aceasta este activata (default activa). ​
 +    instance.set_rps_target(15.5f);​
 +\\
 + void enable_pid_control(const int8_t new_command = 0) \\
 + Daca bucla PID era dezactivata,​ este activat controlul prin PID, rps_targhet-ul este setat la 0, comanda la motoare este setata ca "​new_command"​ (default 0).
 +    instance.enable_pid_control();​
 +\\
 + void disable_pid_control(void) \\
 + Daca bucla PID era activata, este dezactivat controlul prin PID, rps_targhet-ul este setat la 0, comanda la motoare este setata la 0.
 +    instance.disable_pid_control();​
 +\\
 + ​static void pid_update(void) \\
 + ​Functie apelata de intreruperea de ceas pentru a itera prin bucla PID de control a motoarelor daca aceasta este activata. Functia este lasata publica in caz ca user-ul doreste o iterare mai frecventa.
 +    Motors::​pid_update();​
 +\\
 + void set_command(int8_t command) \\
 + ​Seteaza comanda (-100 <= command <= 100) ce reprezinta duty cycle-ul semnalului pentru motoare. Pentru valori negative polaritatea motoarelor este inversata automat. Este folosit de bucla PID pentru a da o comanda motoarelor, dar poate fi folosita si de utilizator. Daca se seteaza o comanda in timp ce bucla PID este activa, la urmatoarea intrerupere de ceas aceasta va fi suprascrisa de rezultatul buclei PID.
 +    instance.set_command(-50);​
 +\\
 + ​int8_t get_command(void) \\
 + Ar trebuii sa returneze ultima comanda data puntilor-H. Daca bucla PID este activa, returneaza ultima commanda calculata de aceasta, iar daca este inactiva returneaza ultima commanda data de utilizator manual explicit sau prin diferite functii (exemplu "​enable/​disable_pid_control"​).
 +    auto command = instance.get_command();​
 +\\
 + void stop_interrupt(const bool state) \\
 + ​Pentru "state = true", opreste de urgenta puntile-H la declansarea unei intreruperi pe pinul de Signal Kill. Altfel activeaza la loc puntile-H daca acestea erau activate inaintea semnalului de kill.
 +    instance.stop_interrupt(true);​
 +\\
 +
 +\\
 +===<​speed_sensor.hpp>​===
 +==Notes:==
 +Acronimul rps inseamna "​rotatii pe secunda"​ \\
 +Biblioteca ofera suport pentru pana la 2 senzori de viteza a cate 2 canale fiecare. \\
 +\\
 +==Metode:==
 + ​static SpS& get_instance() \\
 + ​Returneaza o referinta catre obiect si la prima apelare este initializat obiectul.
 +    SpS& instance = SpS::​get_instance();​
 +\\
 + float get_rps_a(void) \\
 + ​Returneaza nr. de rps a senzorului de viteza A daca acesta exista. Daca nu, intoarce viteza senzorului B sau 0 daca nici acesta nu exista. Functia este folosita la interarea buclei PID.
 +    auto speed_a = instance.get_rps_a();​
 +\\
 + float get_rps_b(void) \\
 + ​Returneaza nr. de rps a senzorului de viteza B daca acesta exista. Daca nu, intoarce viteza senzorului A sau 0 daca nici acesta nu exista. Functia este folosita la interarea buclei PID.
 +    auto speed_b = instance.get_rps_b();​
 +\\
 + void sensor_interrupt(void) \\
 + ​Functia este apelata de rutina de tratare a intreruperii pentru a verifica daca aceasta a venit pe pinii senzorilor de viteza. Este calculat noul nr. de rps per motor si se afla directia de rotatie prin cuadratura.
 +    sensor_interrupt();​
 +\\
 +
 +\\
 +===<​kill_switch.hpp>​===
 +==Notes:==
 + Este folosit pinul PTA13 care deregula este folosit pentru unul din senzorii hall. \\
 + ​Prezenta unui modul radio pe masina este interzisa in cadrul competitiei NXP Cup. Acesta poate fi activat sau dezactivat usor doar schimband in fisierul "​kill_switch.hpp"​
 +    #define KILL_SWITCH_ENABLE 1 // to enable the kill_switch
 +    // #define KILL_SWITCH_ENABLE 0 // to disable the kill_switch
 +==Functii:​==
 + void kill_switch_init(void) \\
 + ​Configureaza pinul si activeaza intreruperea pe ambele fronturi de semnal.
 +    kill_switch_init();​
 +\\
 + void kill_switch_interrupt(void)
 + Daca acest pin a declansat intreruperea,​ puntile-H vor fi dezactivate sau activate in functie de starea actualal a pinului. Aceasta functie este folosita in rutina de tratare a intreruperii.
 +    kill_switch_interrupt();​
 +\\
 +
 +\\
 +===<​servo.hpp>​===
 +==Notes:==
 +Biblioteca foloseste timmer-ul FTM2 si canalele 0, 1.\\
 +\\
 +==Metode:==
 + ​static Servo& get_instance(void) \\
 + ​Returneaza o referinta catre obiect si la prima apelare este initializat obiectul.
 +    Servo& instance = Timer::​get_instance();​
 +\\
 + void set_angle(ftm_chnl_t sv, uint16_t angle)\\
 + ​Primeste ca si parametru channel-ul (SV1_FTM_CHANNEL sau SV2_FTM_CHANNEL) la care este conectat servo-motorul si unghiul dorit (0 <= angle <= 180).\\
 +    set_angle(SV1_FTM_CHANNEL , 90U);
 +\\
 + void set_dutycycle(ftm_chnl_t sv, uint8_t dc)\\
 + ​Primeste ca si parametru channel-ul (SV1_FTM_CHANNEL sau SV2_FTM_CHANNEL) la care este conectat servo-motorul si duty cycle-ul dorit (0 <= dc <= 100) sa fie scris pe pinul de semnal.
 +    set_dutycycle(SV1_FTM_CHANNEL , 2U);
 +\\
 +
 +\\
 +===<​Pixy2.h>​===
 +==Notes:==
 +Pentru mai multe detalii, consultati documentatia oficiala de pe [[https://​docs.pixycam.com/​wiki/​doku.php?​id=wiki:​v2:​porting_guide|pagina]].\\
 +Pentru portare a trebuit sa implementez comunicatia pe SPI blocanta si functiile de "​delay"​ si "​millis"​ din <​Timer.hpp>​.
 +\\
 +\\
 +\\
 +===<​SPI.h>​===
 +==Notes:==
 +Configuratia de SPI este realizata in configuratorul din MCUXpresso [[https://​duckduckgo.com|astfel]](TO_DO:​ adauga imagine cu configuratia). \\
 +Biblioteca de Pixy2 se asteapta ca comunicatia de SPI sa fie blocanta. Pentru viitor comunicatia sa nu mai fie blocanta si sa se foloseasca intreruperi sau eDMA.\\
 +==Metode:==
 + ​static void begin(void) \\
 + ​Pentru a fi folosit pe viitor cand configurarea nu mai este facuta din GUI-ul din MCUXpresso.
 +    SPI::​begin();​
 +\\
 + ​static void send(uint8_t *buf, uint8_t len) \\
 + ​Trimite prin SPI un vector de bytes fara a intoarce ce citeste pe SPI. Comunicatia este blocanta.
 +    SPI::​send(buffer,​ n);
 +\\
 + ​static void recv(uint8_t *buf, uint8_t len) \\
 + ​Primeste prin SPI un vector de bytes in timp ce trimite pe SPI \0. Comunicatia este blocanta.
 +    SPI::​recv(buffer,​ n);
 ====== Rezultate Obținute ====== ====== Rezultate Obținute ======
-TODO+Functioneaza,​ gata sa fie folosit de cineva care stie niste teorie de auto-reglare pentru a o face sa mearga pe pista.\\ 
 +Demo pe [[https://​youtu.be/​A627lpIsANQ | youtube]]
  
 ====== Concluzii ====== ====== Concluzii ======
-TODO+Pregatit sa fie programat mai departe pentru competitia NXP CUP 2022.
  
 ====== Download ====== ====== Download ======
-TODO +[[https://​github.com/​Robert-ML/​API_NXP-CUP_release | GitHub]]
- +
-====== Jurnal ====== +
-TODO+
  
 ====== Bibliografie/​Resurse ====== ====== Bibliografie/​Resurse ======
-TODO+{{ :​pm:​prj2021:​abasoc:​robert_mihai.lica-pagina_ocw.pdf | Pagina OCW }}\\ 
 +{{ :​pm:​prj2021:​abasoc:​robert_mihai.lica-pagina_ocw_finala.pdf | Pagina OCW Finala}}\\ 
 +[[https://​stackoverflow.com | stackoverflow]] ​ [[https://​google.github.io/​styleguide/​cppguide.html | Google Coding Style]] ​ [[https://​en.cppreference.com/​w/​ | cppreference]] ​ [[https://​docs.pixycam.com/​wiki/​doku.php?​id=wiki:​v2:​start | Pixy2 Docs]] ​ [[https://​developer.arm.com/​support | developer.arm]] ​ [[https://​www.geeksforgeeks.org | geeksforgeeks]]  ​
pm/prj2021/abasoc/api_arc_board.1620055615.txt.gz · Last modified: 2021/05/03 18:26 by robert_mihai.lica
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0