ti bisogna il phaserunner
Dependencies: mbed PID mbed-rtos
Peripherien/Phaserunner.h@7:15e6fc689368, 2019-05-16 (annotated)
- Committer:
- EpicG10
- Date:
- Thu May 16 20:42:39 2019 +0000
- Revision:
- 7:15e6fc689368
- Parent:
- Phaserunner.h@6:a80300ee574d
- Child:
- 9:56aed8c6779f
Implementation Regler (not finished)
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
EpicG10 | 0:8a660654d511 | 1 | /** |
EpicG10 | 0:8a660654d511 | 2 | * Handelt die Kommunikation (Lesen und Schreiben) mit den Phaserunnern |
EpicG10 | 0:8a660654d511 | 3 | */ |
EpicG10 | 0:8a660654d511 | 4 | |
EpicG10 | 0:8a660654d511 | 5 | #ifndef PHASERUNNER_H |
EpicG10 | 0:8a660654d511 | 6 | #define PHASERUNNER_H |
EpicG10 | 0:8a660654d511 | 7 | |
EpicG10 | 0:8a660654d511 | 8 | #include "mbed.h" |
EpicG10 | 0:8a660654d511 | 9 | #include "rtos.h" |
EpicG10 | 0:8a660654d511 | 10 | |
EpicG10 | 0:8a660654d511 | 11 | class Phaserunner { |
EpicG10 | 0:8a660654d511 | 12 | private: |
EpicG10 | 0:8a660654d511 | 13 | //Private constants |
EpicG10 | 0:8a660654d511 | 14 | static const uint8_t BUFLEN = 255; |
EpicG10 | 0:8a660654d511 | 15 | |
EpicG10 | 0:8a660654d511 | 16 | //Adressen |
EpicG10 | 0:8a660654d511 | 17 | static const unsigned short REMOTE_THROTTLE_VOLTAGE = 495; |
EpicG10 | 0:8a660654d511 | 18 | static const unsigned short REMOTE_ANALOG_BREAK_VOLTAGE = 497; |
EpicG10 | 0:8a660654d511 | 19 | static const unsigned short MOTOR_CURRENT = 262; |
EpicG10 | 0:8a660654d511 | 20 | static const unsigned short LAST_FAULT = 269; |
EpicG10 | 6:a80300ee574d | 21 | static const unsigned short EBRAKESOURCE = 249; |
EpicG10 | 0:8a660654d511 | 22 | |
EpicG10 | 0:8a660654d511 | 23 | //Modbus-Protokoll |
EpicG10 | 0:8a660654d511 | 24 | static const uint8_t SCHREIBANTWORT = 0x10; |
EpicG10 | 0:8a660654d511 | 25 | static const uint8_t LESEANTWORT = 0x03; |
EpicG10 | 0:8a660654d511 | 26 | |
EpicG10 | 0:8a660654d511 | 27 | |
EpicG10 | 0:8a660654d511 | 28 | //Sonstiges |
EpicG10 | 0:8a660654d511 | 29 | static const uint16_t WRITE_PERIOD = 3; //Minimaler Zeitintervall zwischen zwei Messages an den Phaserunner [ms] |
EpicG10 | 0:8a660654d511 | 30 | static const float TICKER_PERIOD = 0.02f; //Zeitintervall für das Schreiben auf den Phaserunner [s] |
EpicG10 | 0:8a660654d511 | 31 | |
EpicG10 | 0:8a660654d511 | 32 | //Thread thread; //Wird für die Funktion writeToPhaserunner() gebraucht |
EpicG10 | 0:8a660654d511 | 33 | Ticker ticker; |
EpicG10 | 0:8a660654d511 | 34 | |
EpicG10 | 0:8a660654d511 | 35 | //Verbindung zum Phaserunner |
EpicG10 | 0:8a660654d511 | 36 | RawSerial& connection; |
EpicG10 | 0:8a660654d511 | 37 | |
EpicG10 | 0:8a660654d511 | 38 | //Buffer in das gelesen wird. |
EpicG10 | 0:8a660654d511 | 39 | uint8_t writeBuffer[BUFLEN]; |
EpicG10 | 0:8a660654d511 | 40 | |
EpicG10 | 0:8a660654d511 | 41 | //Buffer aus dem geschrieben wird. |
EpicG10 | 0:8a660654d511 | 42 | uint8_t read_buffer[BUFLEN]; |
EpicG10 | 0:8a660654d511 | 43 | |
EpicG10 | 0:8a660654d511 | 44 | //State valiables |
EpicG10 | 0:8a660654d511 | 45 | float frequency; |
EpicG10 | 0:8a660654d511 | 46 | float voltage; |
EpicG10 | 0:8a660654d511 | 47 | float current; |
EpicG10 | 0:8a660654d511 | 48 | uint16_t error; |
EpicG10 | 0:8a660654d511 | 49 | uint16_t newTorque; |
EpicG10 | 0:8a660654d511 | 50 | uint16_t newRecuperation; |
EpicG10 | 0:8a660654d511 | 51 | |
EpicG10 | 0:8a660654d511 | 52 | /** |
EpicG10 | 0:8a660654d511 | 53 | * Wartet auf ein Byte. Wenn ein Datenstring gelesen wird, werden die Daten mithilfe einer Zustandsmaschine abgespeichert. |
EpicG10 | 0:8a660654d511 | 54 | */ |
EpicG10 | 0:8a660654d511 | 55 | void Rx_interrupt(); |
EpicG10 | 0:8a660654d511 | 56 | |
EpicG10 | 0:8a660654d511 | 57 | /** |
EpicG10 | 0:8a660654d511 | 58 | * @brief Bereitet buf darauf vor, versendet zu werden. |
EpicG10 | 0:8a660654d511 | 59 | * @param buf: Byte-Array |
EpicG10 | 0:8a660654d511 | 60 | * @param addr: Adresse des Registers, das beschrieben wird |
EpicG10 | 0:8a660654d511 | 61 | * @param value: Wert der in das Register geschrieben wird |
EpicG10 | 0:8a660654d511 | 62 | */ |
EpicG10 | 0:8a660654d511 | 63 | static int WriteRegister(uint8_t* buf, unsigned short addr, unsigned short value); |
EpicG10 | 0:8a660654d511 | 64 | |
EpicG10 | 0:8a660654d511 | 65 | /** |
EpicG10 | 0:8a660654d511 | 66 | * @brief Sendet einen Schreibbefehl auf einen Phaserunner |
EpicG10 | 0:8a660654d511 | 67 | * @param writeBuf: Byte-Array in das geschrieben wird. |
EpicG10 | 0:8a660654d511 | 68 | * @param registerAddress: Adresse des Registers aus dem gelesen wird. |
EpicG10 | 0:8a660654d511 | 69 | */ |
EpicG10 | 0:8a660654d511 | 70 | static int readRegister(uint8_t *buf, uint16_t registerAddress); |
EpicG10 | 0:8a660654d511 | 71 | |
EpicG10 | 0:8a660654d511 | 72 | /** |
EpicG10 | 0:8a660654d511 | 73 | * @brief Sendet ein Byte-Array zum Phaserunner |
EpicG10 | 0:8a660654d511 | 74 | * @param adress: Adresse des Zielregisters |
EpicG10 | 0:8a660654d511 | 75 | * @param value: Wert der in das Register geschriebern werden soll. |
EpicG10 | 0:8a660654d511 | 76 | * @return Anzahl gesendeter Bytes |
EpicG10 | 0:8a660654d511 | 77 | */ |
EpicG10 | 6:a80300ee574d | 78 | //int sendBuffer(unsigned short adress, unsigned short value); |
EpicG10 | 0:8a660654d511 | 79 | |
EpicG10 | 0:8a660654d511 | 80 | /** |
EpicG10 | 0:8a660654d511 | 81 | * @brief Sendet den writeBuffer |
EpicG10 | 0:8a660654d511 | 82 | * @param: Länge des zu sendenden Arrays |
EpicG10 | 0:8a660654d511 | 83 | * @return: Anzahl gesendeter Bytes |
EpicG10 | 0:8a660654d511 | 84 | */ |
EpicG10 | 0:8a660654d511 | 85 | int sendBuffer(int length); |
EpicG10 | 0:8a660654d511 | 86 | |
EpicG10 | 0:8a660654d511 | 87 | /** |
EpicG10 | 0:8a660654d511 | 88 | * @brief: Liest ein Register aus. |
EpicG10 | 0:8a660654d511 | 89 | * @param adress: Adresse des Registers aus dem gelesen werden soll. |
EpicG10 | 0:8a660654d511 | 90 | * @return: Anzahl gelesener Bytes |
EpicG10 | 0:8a660654d511 | 91 | */ |
EpicG10 | 0:8a660654d511 | 92 | int readBuffer(uint16_t adress); |
EpicG10 | 0:8a660654d511 | 93 | |
EpicG10 | 0:8a660654d511 | 94 | /** |
EpicG10 | 0:8a660654d511 | 95 | * @brief: Schreibt ein Drehmoment auf den Phaserunner. |
EpicG10 | 0:8a660654d511 | 96 | * @param: torque Drehmoment in percent |
EpicG10 | 0:8a660654d511 | 97 | */ |
EpicG10 | 0:8a660654d511 | 98 | void writeTorque(uint8_t torque); |
EpicG10 | 0:8a660654d511 | 99 | |
EpicG10 | 0:8a660654d511 | 100 | /** |
EpicG10 | 0:8a660654d511 | 101 | * @brief: Schreibt den Rekuperationswert auf den Phaserunner. |
EpicG10 | 0:8a660654d511 | 102 | * @param: recuperation Rekupertation in Prozent |
EpicG10 | 0:8a660654d511 | 103 | */ |
EpicG10 | 0:8a660654d511 | 104 | void writeRecuperation(uint8_t recuperation); |
EpicG10 | 0:8a660654d511 | 105 | |
EpicG10 | 0:8a660654d511 | 106 | /** |
EpicG10 | 0:8a660654d511 | 107 | * @brief: Prüfziffer berechnen |
EpicG10 | 0:8a660654d511 | 108 | * @param: msgByte Byte-Array |
EpicG10 | 0:8a660654d511 | 109 | * @param: length length of Byte-Array |
EpicG10 | 0:8a660654d511 | 110 | */ |
EpicG10 | 0:8a660654d511 | 111 | static uint16_t getCRC(uint8_t* msgByte, uint8_t length); |
EpicG10 | 0:8a660654d511 | 112 | |
EpicG10 | 0:8a660654d511 | 113 | /** |
EpicG10 | 0:8a660654d511 | 114 | * @brief: Sendet kontinuierlich einen Lesebefehl auf den Phaserunner. |
EpicG10 | 0:8a660654d511 | 115 | */ |
EpicG10 | 0:8a660654d511 | 116 | void writeToPhaserunner(); |
EpicG10 | 0:8a660654d511 | 117 | |
EpicG10 | 0:8a660654d511 | 118 | /** |
EpicG10 | 0:8a660654d511 | 119 | * @brief: Sendet einen Schreibbefehl für die Drehgewschwindigkeit, die Stromstärke und die Spannung |
EpicG10 | 0:8a660654d511 | 120 | */ |
EpicG10 | 0:8a660654d511 | 121 | void readRPM(); |
EpicG10 | 0:8a660654d511 | 122 | |
EpicG10 | 0:8a660654d511 | 123 | /** |
EpicG10 | 0:8a660654d511 | 124 | * @brief: Liest das Fehlerregister aus |
EpicG10 | 0:8a660654d511 | 125 | * @return Byte |
EpicG10 | 0:8a660654d511 | 126 | */ |
EpicG10 | 0:8a660654d511 | 127 | uint16_t readFaults(); |
EpicG10 | 0:8a660654d511 | 128 | |
EpicG10 | 0:8a660654d511 | 129 | public: |
EpicG10 | 0:8a660654d511 | 130 | static const uint8_t MAX_TORQUE_GAIN = 2; //Maximaler Sprung für Drehmoment |
EpicG10 | 0:8a660654d511 | 131 | static const uint8_t MIN_RECUPERATION = 10; //Schwellwert für die Aktivierung des Daumengriffbetätigers |
EpicG10 | 0:8a660654d511 | 132 | static const uint8_t MIN_HANDGRIFF = 5; //Schwellwert für die Aktivierung des Handgriffbetätigers |
EpicG10 | 6:a80300ee574d | 133 | int sendBuffer(unsigned short adress, unsigned short value); |
EpicG10 | 0:8a660654d511 | 134 | /** |
EpicG10 | 0:8a660654d511 | 135 | * @brief Initialisiert ein Phaserunner-Objekt |
EpicG10 | 0:8a660654d511 | 136 | * @param connection: Serielle Schnittstelle zum Phaserunner |
EpicG10 | 0:8a660654d511 | 137 | */ |
EpicG10 | 0:8a660654d511 | 138 | Phaserunner(RawSerial& connection); |
EpicG10 | 0:8a660654d511 | 139 | |
EpicG10 | 0:8a660654d511 | 140 | /** |
EpicG10 | 0:8a660654d511 | 141 | * @brief: Schreibt ein Drehmoment ins Phaserunnerobjekt, das dann geschrieben wird. |
EpicG10 | 0:8a660654d511 | 142 | * @param: torque Drehmoment in Prozent |
EpicG10 | 0:8a660654d511 | 143 | */ |
EpicG10 | 0:8a660654d511 | 144 | void setTorque(uint8_t torque); |
EpicG10 | 0:8a660654d511 | 145 | |
EpicG10 | 0:8a660654d511 | 146 | /** |
EpicG10 | 0:8a660654d511 | 147 | * @brief: Schreibt einen Rekuperationswert ins Phaserunnerobjekt, dass dann geschrieben wird. |
EpicG10 | 0:8a660654d511 | 148 | * @param: recuperation Rekuperationswert in Prozent |
EpicG10 | 0:8a660654d511 | 149 | */ |
EpicG10 | 0:8a660654d511 | 150 | void setRecuperation(uint8_t recuperation); |
EpicG10 | 0:8a660654d511 | 151 | |
EpicG10 | 0:8a660654d511 | 152 | /** |
EpicG10 | 0:8a660654d511 | 153 | * @return frequenz |
EpicG10 | 0:8a660654d511 | 154 | */ |
EpicG10 | 0:8a660654d511 | 155 | float getFrequency(); |
EpicG10 | 0:8a660654d511 | 156 | |
EpicG10 | 0:8a660654d511 | 157 | /** |
EpicG10 | 6:a80300ee574d | 158 | * @return strom |
EpicG10 | 0:8a660654d511 | 159 | */ |
EpicG10 | 0:8a660654d511 | 160 | float getCurrent(); |
EpicG10 | 0:8a660654d511 | 161 | |
EpicG10 | 0:8a660654d511 | 162 | /** |
EpicG10 | 0:8a660654d511 | 163 | * @return spannung |
EpicG10 | 0:8a660654d511 | 164 | */ |
EpicG10 | 0:8a660654d511 | 165 | float getVoltage(); |
EpicG10 | 6:a80300ee574d | 166 | |
EpicG10 | 6:a80300ee574d | 167 | /** |
EpicG10 | 6:a80300ee574d | 168 | * @return Ebrike Source |
EpicG10 | 6:a80300ee574d | 169 | */ |
EpicG10 | 6:a80300ee574d | 170 | int getRegister(int address); |
EpicG10 | 0:8a660654d511 | 171 | |
EpicG10 | 0:8a660654d511 | 172 | //Delete |
EpicG10 | 0:8a660654d511 | 173 | uint8_t badBuf[256]; |
EpicG10 | 0:8a660654d511 | 174 | uint8_t bufPointer; |
EpicG10 | 0:8a660654d511 | 175 | uint8_t read; |
EpicG10 | 0:8a660654d511 | 176 | DigitalOut led; |
EpicG10 | 0:8a660654d511 | 177 | |
EpicG10 | 0:8a660654d511 | 178 | uint16_t getRecup(); |
EpicG10 | 0:8a660654d511 | 179 | }; |
EpicG10 | 0:8a660654d511 | 180 | |
EpicG10 | 0:8a660654d511 | 181 | #endif |