├── LICENSE ├── README.md ├── examples ├── MT6701_set_get_ZeroDegreePosition │ └── MT6701_set_get_ZeroDegreePosition.ino └── MT6701_test │ └── MT6701_test.ino ├── images └── mt6701_module.jpg ├── keywords.txt ├── library.properties └── src ├── MT6701_I2C.cpp └── MT6701_I2C.h /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Roman Sklyar S-LAB 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # MT6701-Arduino-Library 2 |

3 | 4 | ## Еще магнытные датчики 5 | * [AS5600](https://github.com/S-LABc/AMS-AS5600-Arduino-Library) 6 | * [AS5601](https://github.com/S-LABc/AMS-AS5601-Arduino-Library) 7 | 8 | ## Предупреждение 9 | * Библиотека не проверялась полностью. Возможны ошибки. Используя бибилиотеку вы берете все риски на себя 10 | * Реализованы не все возможности датчика. Для взаимодействия с регистрами датчика можно использовать эти методы: 11 | ```C++ 12 | // Чтение содержимого регистра 13 | uint8_t MT_RequestSingleRegister(uint8_t _reg_addr); 14 | // Запись нового содержимого в регистр 15 | void MT_WriteOneByte(uint8_t _reg_addr, uint8_t _payload); 16 | ``` 17 | * Использовать методы описанные выше седует через наследование класса MT6701I2C 18 | * Все доступные методы, константы, типы данных можно посмотреть [тут](https://github.com/S-LABc/MT6701-Arduino-Library/blob/main/src/MT6701_I2C.h) 19 | 20 | ## Ссылки 21 | * [Даташит MT6701 rev.1.0](https://www.magntek.com.cn/upload/MT6701_Rev.1.0.pdf) 22 | * [Даташит MT6701 rev.1.5](http://www.magntek.com.cn/upload/MT6701_Rev.1.5.pdf) 23 | * [Даташит MT6701 rev.1.8](https://www.magntek.com.cn/upload/MT6701_Rev.1.8.pdf) 24 | * [Страница MT6701](http://www.magntek.com.cn/en/list/177/559.htm) 25 | * [Корпус для тестов](https://github.com/S-LABc/AMS-AS5600-Arduino-Library/tree/main/addons/AS5600-Case-STL) 26 | -------------------------------------------------------------------------------- /examples/MT6701_set_get_ZeroDegreePosition/MT6701_set_get_ZeroDegreePosition.ino: -------------------------------------------------------------------------------- 1 | /* 2 | * 1. Open Serial Monitor at 9600 and there is no line ending 3 | * 2. Send the character "s" to the Serial Monitor 4 | * 5 | * CORRECT SERIAL MONITOR LOGS 6 | 7 | Sensor Found! 8 | 9 | Reading Current Value... 10 | Zero Degree Position (HEX): 0 [0 - default, but may be different] 11 | 12 | Changing Value... Value Changed 13 | 14 | Saving New Values... 15 | 16 | Reading New Value... 17 | Zero Degree Position After Saving (HEX): 8 18 | 19 | Program Complete! 20 | * 21 | */ 22 | 23 | #include 24 | 25 | MT6701I2C SensorI2C(&Wire); 26 | 27 | void setup() { 28 | Serial.begin(9600); 29 | 30 | SensorI2C.begin(); 31 | SensorI2C.setClock(); 32 | 33 | while(1) { // Waiting for the input of the character "s" 34 | byte c; 35 | if(Serial.available()) 36 | c = Serial.read(); 37 | if(c == 's') { 38 | break; 39 | } 40 | delay(100); 41 | } 42 | 43 | while(!SensorI2C.isConnected()) { 44 | Serial.println("Sensor not Connected!"); 45 | delay(500); 46 | } 47 | Serial.println("Sensor Found!"); 48 | Serial.println(); 49 | 50 | delay(300); // The delay is not important. so it's easier to see in the SM 51 | 52 | Serial.println("Reading Current Value..."); 53 | word zdp; 54 | zdp = SensorI2C.getZeroDegreePositionData(); 55 | Serial.print("Zero Degree Position (HEX): "); 56 | Serial.println(zdp, HEX); 57 | Serial.println(); 58 | 59 | delay(300); // The delay is not important. so it's easier to see in the SM 60 | 61 | Serial.print("Changing Value... "); 62 | word zdp_new = 0x0008; // New value 63 | if(SensorI2C.setZeroDegreePositionDataVerify(zdp_new)) { 64 | Serial.println("Value Changed"); 65 | } else { 66 | Serial.println("Value Change Error"); 67 | } 68 | Serial.println(); 69 | 70 | delay(300); // The delay is not important. so it's easier to see in the SM 71 | 72 | Serial.println("Saving New Values..."); 73 | Serial.println(); 74 | // It's important to save the new values after the change. 75 | // Called once even after setting multiple values 76 | // else values return to default after power off 77 | SensorI2C.saveNewValues(); 78 | 79 | delay(700); // >600ms 80 | 81 | Serial.println("Reading New Value..."); 82 | word zdp_after; 83 | zdp_after = SensorI2C.getZeroDegreePositionData(); 84 | Serial.print("Zero Degree Position After Saving (HEX): "); 85 | Serial.println(zdp_after, HEX); 86 | Serial.println(); 87 | 88 | Serial.println("Program Complete!"); 89 | } 90 | 91 | void loop() { 92 | // nop 93 | } 94 | -------------------------------------------------------------------------------- /examples/MT6701_test/MT6701_test.ino: -------------------------------------------------------------------------------- 1 | /* 2 | * MT6701_test 3 | * 4 | * Демонстрация некоторых возможнойстей библиотеки MT6701_I2C.h для датчика MT6701 5 | * 6 | * Документация к датчику: 7 | * http://www.magntek.com.cn/upload/MT6701_Rev.1.5.pdf 8 | * 9 | * Все методы можно посмотреть в файле MT6701_I2C.h или тут 10 | * https://github.com/S-LABc/MT6701-Arduino-Library/blob/main/src/MT6701_I2C.h 11 | * 12 | * Контакты: 13 | ** GitHub - https://github.com/S-LABc 14 | ** Gmail - romansklyar15@gmail.com 15 | * 16 | * Copyright (C) 2022. v1.1 / Скляр Роман S-LAB 17 | */ 18 | 19 | #include 20 | 21 | // Раскомментировать для заупска функции сохранения значений 22 | //#define SAVE_VALUES 23 | 24 | MT6701I2C SensorI2C(&Wire); 25 | 26 | void setup() { 27 | Serial.begin(115200); 28 | 29 | // Запускаем соединение 30 | SensorI2C.begin(); 31 | // Настраиваем шину I2C на 400кГц 32 | SensorI2C.setClock(); 33 | //Можно на друие частоты, но работает не на всех микроконтроллерах 34 | //SensorI2C.setClock(MT6701_I2C_CLOCK_100KHZ); // 100кГц 35 | //SensorI2C.setClock(MT6701_I2C_CLOCK_1MHZ); // 1МГц 36 | //SensorI2C.setClock(725000); // Пользовательское значение 725кГц 37 | 38 | /* 39 | * Если нужно управлять режимами датчика 40 | * STM32_MT6701_MODE_PIN PC13 41 | * ESP8266_MT6701_MODE_PIN 2 42 | * ESP32_MT6701_MODE_PIN 4 43 | * ARDUINO_MT6701_MODE_PIN 3 44 | * или любой другой GPIO 45 | */ 46 | //SensorI2C.attachModePin(ARDUINO_MT6701_MODE_PIN); // SensorI2C.detachModePin(); 47 | //SensorI2C.enableI2CorSSI(); // Включить интерфейс I2C/SSI 48 | //SensorI2C.enableUVWorABZ(); // Включить интерфейс UVW/ABZ 49 | 50 | 51 | while(!Serial); 52 | 53 | while(!SensorI2C.isConnected()) { 54 | Serial.println("Датчик не обнаружен"); 55 | delay(500); 56 | } 57 | } 58 | 59 | 60 | void loop() { 61 | #ifdef SAVE_VALUES 62 | saveNewSettings(); 63 | #else 64 | readValues(); 65 | #endif 66 | } 67 | 68 | void readValues() { 69 | Serial.print("Raw: "); 70 | Serial.println(SensorI2C.getRawAngle()); 71 | 72 | Serial.print("Degrees: "); 73 | Serial.println(SensorI2C.getDegreesAngle()); 74 | 75 | Serial.print("Radians: "); 76 | Serial.println(SensorI2C.getRadiansAngle()); 77 | 78 | Serial.print("Resolution UVW: "); 79 | Serial.println(SensorI2C.getOutputResolutionUVW()); // setOutputResolutionUVW() 80 | 81 | Serial.print("Resolution ABZ: "); 82 | Serial.println(SensorI2C.getOutputResolutionABZ()); // setOutputResolutionABZ() 83 | 84 | Serial.print("Output Type: "); 85 | MT6701I2COutputType output_type = SensorI2C.getOutputType(); 86 | if(output_type == MT6701I2_OUTPUT_TYPE_ABZ) { // setOutputTypeABZ() 87 | Serial.println("ABZ"); 88 | } else if(output_type == MT6701I2_OUTPUT_TYPE_UVW) { // setOutputTypeUVW() 89 | Serial.println("UVW"); 90 | } 91 | 92 | Serial.print("Output Mode: "); 93 | MT6701I2COutputMode output_mode = SensorI2C.getOutputMode(); 94 | if(output_mode == MT6701I2_OUTPUT_MODE_ANALOG) { // setOutputModeAnalog() 95 | Serial.println("ANALOG"); 96 | } else if(output_mode == MT6701I2_OUTPUT_MODE_PWM) { // setOutputModePWM() 97 | Serial.println("PWM"); 98 | } 99 | 100 | Serial.print("Rotation Direction: "); 101 | MT6701I2CDirection output_dir = SensorI2C.getOutputRotationDirection(); 102 | if(output_dir == MT6701I2_DIRECTION_CLOCKWISE) { // setOutputRotationDirectionClockwise() 103 | Serial.println("CLOCKWISE"); 104 | } else if(output_dir == MT6701I2_DIRECTION_COUNTERCLOCKWISE) { // setOutputRotationDirectionCounterclockwise() 105 | Serial.println("COUNTERCLOCKWISE"); 106 | } 107 | 108 | Serial.println(); 109 | 110 | delay(200); 111 | } 112 | 113 | void saveNewSettings() { 114 | Serial.print("Write Resolution ABZ: "); 115 | word new_res_abz = 732; 116 | if(SensorI2C.setOutputResolutionABZVerify(new_res_abz)) { 117 | Serial.println("OK"); 118 | } else { 119 | Serial.println("ERROR"); 120 | } 121 | 122 | Serial.print("Write Output Mode PWM: "); 123 | if(SensorI2C.setOutputModePWMVerify()) { 124 | Serial.println("OK"); 125 | } else { 126 | Serial.println("ERROR"); 127 | } 128 | 129 | Serial.print("Write Rotation Direction Clockwise: "); 130 | if(SensorI2C.setOutputRotationDirectionClockwiseVerify()) { 131 | Serial.println("OK"); 132 | } else { 133 | Serial.println("ERROR"); 134 | } 135 | 136 | Serial.println("Saving New Values..."); 137 | SensorI2C.saveNewValues(); 138 | delay(700); // >600мс 139 | Serial.println("Saved Successfully. Reconnect Power"); 140 | 141 | while(1); 142 | } 143 | -------------------------------------------------------------------------------- /images/mt6701_module.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/S-LABc/MT6701-Arduino-Library/cb1b78f444c997c26c24278a4ba3a96aa3192881/images/mt6701_module.jpg -------------------------------------------------------------------------------- /keywords.txt: -------------------------------------------------------------------------------- 1 | ####################################### 2 | # Syntax Coloring Map For MT6701_I2C 3 | ####################################### 4 | 5 | ####################################### 6 | # Datatypes (KEYWORD1) 7 | ####################################### 8 | 9 | MT6701_I2C KEYWORD1 10 | SensorI2C KEYWORD1 11 | 12 | ####################################### 13 | # Methods and Functions (KEYWORD2) 14 | ####################################### 15 | 16 | MT6701I2C KEYWORD2 17 | 18 | begin KEYWORD2 19 | setClock KEYWORD2 20 | end KEYWORD2 21 | 22 | saveNewValues KEYWORD2 23 | 24 | isConnected KEYWORD2 25 | 26 | attachModePin KEYWORD2 27 | detachModePin KEYWORD2 28 | 29 | enableI2CorSSI KEYWORD2 30 | enableUVWorABZ KEYWORD2 31 | 32 | getRawAngle KEYWORD2 33 | getDegreesAngle KEYWORD2 34 | getRadiansAngle KEYWORD2 35 | 36 | getConfigurationOutputType KEYWORD2 37 | setConfigurationOutputTypeABZ KEYWORD2 38 | setConfigurationOutputTypeABZVerify KEYWORD2 39 | setConfigurationOutputTypeUVW KEYWORD2 40 | setConfigurationOutputTypeUVWVerify KEYWORD2 41 | 42 | getOutputType KEYWORD2 43 | setOutputTypeABZ KEYWORD2 44 | setOutputTypeABZVerify KEYWORD2 45 | setOutputTypeUVW KEYWORD2 46 | setOutputTypeUVWVerify KEYWORD2 47 | 48 | getOutputRotationDirection KEYWORD2 49 | setOutputRotationDirectionCounterclockwise KEYWORD2 50 | setOutputRotationDirectionCounterclockwiseVerify KEYWORD2 51 | setOutputRotationDirectionClockwise KEYWORD2 52 | setOutputRotationDirectionClockwiseVerify KEYWORD2 53 | 54 | getOutputResolutionUVW KEYWORD2 55 | setOutputResolutionUVW KEYWORD2 56 | setOutputResolutionUVWVerify KEYWORD2 57 | 58 | getOutputResolutionABZ KEYWORD2 59 | setOutputResolutionABZ KEYWORD2 60 | setOutputResolutionABZVerify KEYWORD2 61 | 62 | getZPulseWidth KEYWORD2 63 | setZPulseWidth1LSB KEYWORD2 64 | setZPulseWidth1LSBVerify KEYWORD2 65 | setZPulseWidth2LSB KEYWORD2 66 | setZPulseWidth2LSBVerify KEYWORD2 67 | setZPulseWidth4LSB KEYWORD2 68 | setZPulseWidth4LSBVerify KEYWORD2 69 | setZPulseWidth8LSB KEYWORD2 70 | setZPulseWidth8LSBVerify KEYWORD2 71 | setZPulseWidth12LSB KEYWORD2 72 | setZPulseWidth12LSBVerify KEYWORD2 73 | setZPulseWidth16LSB KEYWORD2 74 | setZPulseWidth16LSBVerify KEYWORD2 75 | setZPulseWidth180DEG KEYWORD2 76 | setZPulseWidth180DEGVerify KEYWORD2 77 | 78 | getZeroDegreePositionData KEYWORD2 79 | setZeroDegreePositionData KEYWORD2 80 | setZeroDegreePositionDataVerify KEYWORD2 81 | 82 | getFrequencyPWM KEYWORD2 83 | setFrequencyPWM9944 KEYWORD2 84 | setFrequencyPWM9944Verify KEYWORD2 85 | setFrequencyPWM4972 KEYWORD2 86 | setFrequencyPWM4972Verify KEYWORD2 87 | 88 | getPolarityPWM KEYWORD2 89 | setPolarityPWMHigh KEYWORD2 90 | setPolarityPWMHighVerify KEYWORD2 91 | setPolarityPWMLow KEYWORD2 92 | setPolarityPWMLowVerify KEYWORD2 93 | 94 | getOutputMode KEYWORD2 95 | setOutputModeAnalog KEYWORD2 96 | setOutputModeAnalogVerify KEYWORD2 97 | setOutputModePWM KEYWORD2 98 | setOutputModePWMVerify KEYWORD2 99 | 100 | ####################################### 101 | # Constants (LITERAL1) 102 | ####################################### 103 | 104 | MT6701_I2C_CLOCK_100KHZ LITERAL1 105 | MT6701_I2C_CLOCK_400KHZ LITERAL1 106 | MT6701_I2C_CLOCK_1MHZ LITERAL1 107 | MT6701_I2C_ADDRESS LITERAL1 108 | 109 | STM32_MT6701_MODE_PIN LITERAL1 110 | ESP8266_MT6701_MODE_PIN LITERAL1 111 | ESP32_MT6701_MODE_PIN LITERAL1 112 | ARDUINO_MT6701_MODE_PIN LITERAL1 113 | 114 | MT6701_I2C_ANGLE_DATA_REG_H LITERAL1 115 | MT6701_I2C_ANGLE_DATA_REG_L LITERAL1 116 | 117 | MT6701_I2C_EEPROM_UVW_MUX_REG LITERAL1 118 | MT6701_I2C_EEPROM_UVW_MUX_BIT LITERAL1 119 | 120 | MT6701_I2C_EEPROM_ABZ_MUX_DIR_REG LITERAL1 121 | MT6701_I2C_EEPROM_ABZ_MUX_BIT LITERAL1 122 | 123 | MT6701_I2C_EEPROM_DIR_REG LITERAL1 124 | MT6701_I2C_EEPROM_DIR_BIT LITERAL1 125 | 126 | MT6701_I2C_EEPROM_UVW_RES_REG LITERAL1 127 | MT6701_I2C_EEPROM_UVW_MUX_BIT_S LITERAL1 128 | 129 | MT6701_I2C_EEPROM_ABZ_RES_REG_H LITERAL1 130 | MT6701_I2C_EEPROM_ABZ_RES_REG_L LITERAL1 131 | MT6701_I2C_EEPROM_ABZ_MUX_BIT_S LITERAL1 132 | 133 | MT6701_I2C_EEPROM_HYST_REG_H LITERAL1 134 | MT6701_I2C_EEPROM_HYST_REG_L LITERAL1 135 | 136 | MT6701_I2C_EEPROM_Z_PULSE_WIDTH_REG LITERAL1 137 | MT6701_I2C_EEPROM_Z_PULSE_WIDTH_BIT_S LITERAL1 138 | 139 | MT6701_I2C_EEPROM_ZERO_REG_H LITERAL1 140 | MT6701_I2C_EEPROM_ZERO_REG_L LITERAL1 141 | 142 | MT6701_I2C_EEPROM_PWM_FREQ_REG LITERAL1 143 | MT6701_I2C_EEPROM_PWM_FREQ_BIT LITERAL1 144 | 145 | MT6701_I2C_EEPROM_PWM_POL_REG LITERAL1 146 | MT6701_I2C_EEPROM_PWM_POL_BIT LITERAL1 147 | 148 | MT6701_I2C_EEPROM_OUT_MODE_REG LITERAL1 149 | MT6701_I2C_EEPROM_OUT_MODE_BIT LITERAL1 150 | 151 | MT6701_I2C_EEPROM_A_START_REG_H LITERAL1 152 | MT6701_I2C_EEPROM_A_START_REG_L LITERAL1 153 | 154 | MT6701_I2C_EEPROM_A_STOP_REG_H LITERAL1 155 | MT6701_I2C_EEPROM_A_STOP_REG_L LITERAL1 156 | MT6701_I2C_EEPROM_A_STOP_BIT_S LITERAL1 157 | 158 | MT6701_I2C_EEPROM_PROG_KEY_REG LITERAL1 159 | MT6701_I2C_EEPROM_PROG_KEY_VALUE LITERAL1 160 | MT6701_I2C_EEPROM_PROG_CMD_REG LITERAL1 161 | MT6701_I2C_EEPROM_PROG_CMD_VALUE LITERAL1 162 | 163 | MT6701I2CConfigurationOutputType LITERAL1 164 | MT6701I2_CONFIG_OUTPUT_TYPE_UVW LITERAL1 165 | MT6701I2_CONFIG_OUTPUT_TYPE_A_B_Z LITERAL1 166 | 167 | MT6701I2COutputType LITERAL1 168 | MT6701I2_OUTPUT_TYPE_ABZ LITERAL1 169 | MT6701I2_OUTPUT_TYPE_UVW LITERAL1 170 | 171 | MT6701I2CDirection LITERAL1 172 | MT6701I2_DIRECTION_COUNTERCLOCKWISE LITERAL1 173 | MT6701I2_DIRECTION_CLOCKWISE LITERAL1 174 | 175 | MT6701I2CZPulseWidth LITERAL1 176 | MT6701I2_Z_PULSE_WIDTH_1LSB LITERAL1 177 | MT6701I2_Z_PULSE_WIDTH_2LSB LITERAL1 178 | MT6701I2_Z_PULSE_WIDTH_4LSB LITERAL1 179 | MT6701I2_Z_PULSE_WIDTH_8LSB LITERAL1 180 | MT6701I2_Z_PULSE_WIDTH_12LSB LITERAL1 181 | MT6701I2_Z_PULSE_WIDTH_16LSB LITERAL1 182 | MT6701I2_Z_PULSE_WIDTH_180DEG LITERAL1 183 | MT6701I2_Z_PULSE_WIDTH_1LSB_2 LITERAL1 184 | 185 | MT6701I2CFrequencyPWM LITERAL1 186 | MT6701I2_PWM_FREQUENCY_9944 LITERAL1 187 | MT6701I2_PWM_FREQUENCY_4972 LITERAL1 188 | 189 | MT6701I2CPolarityPWM LITERAL1 190 | MT6701I2_PWM_POLARITY_HIGH LITERAL1 191 | MT6701I2_PWM_POLARITY_LOW LITERAL1 192 | 193 | MT6701I2COutputMode LITERAL1 194 | MT6701I2_OUTPUT_MODE_ANALOG LITERAL1 195 | MT6701I2_OUTPUT_MODE_PWM LITERAL1 196 | 197 | MT6701I2C_DEFAULT_REPORT_ERROR LITERAL1 198 | MT6701I2C_DEFAULT_REPORT_OK LITERAL1 199 | 200 | MT6701I2C_MODE_I2C_SSI LITERAL1 201 | MT6701I2C_MODE_UVW_ABZ LITERAL1 -------------------------------------------------------------------------------- /library.properties: -------------------------------------------------------------------------------- 1 | name=MT6701 2 | version=1.3 3 | author=Roman Sklyar S-LAB 4 | maintainer=Roman Sklyar 5 | sentence=API for a 14-Bit Hall Based Angle Position Encoder Sensor 6 | paragraph=Implements I2C interface MagnTek MT6701 7 | category=Sensors 8 | url=https://github.com/S-LABc/MT6701-Arduino-Library 9 | architectures=* 10 | includes=MT6701_I2C.h -------------------------------------------------------------------------------- /src/MT6701_I2C.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | * Класс для Arduino IDE реализующий множество методов 3 | * взаимодействия с бесконтактным датчиком положения 4 | * MT6701 от компании MagnTek http://www.magntek.com.cn/en/index.htm 5 | * 6 | * Документация к датчику: 7 | ** http://www.magntek.com.cn/en/list/177/559.htm 8 | ** http://www.magntek.com.cn/upload/MT6701_Rev.1.5.pdf 9 | * 10 | * Контакты: 11 | ** GitHub - https://github.com/S-LABc 12 | ** Gmail - romansklyar15@gmail.com 13 | * 14 | * Copyright (C) 2022. v1.2 / License MIT / Скляр Роман S-LAB 15 | */ 16 | 17 | #include "MT6701_I2C.h" 18 | 19 | // ########## CONSTRUCTOR ########## 20 | /* 21 | * @brief: использовать только интерфейс I2C 22 | * @param _twi: доступ к методам объекта Wire 23 | */ 24 | MT6701I2C::MT6701I2C(TwoWire* _twi) : _wire_(_twi ? _twi : &Wire) { 25 | // Ничего 26 | } 27 | /* 28 | * @brief: запросить один байт данных из буфера 29 | * @param _reg_addr: 1 байт адреса регистра 30 | * @return: значение байта из регистра, который был запрошен 31 | * @note: использовать для одиночного регистра, например 0x29 32 | */ 33 | uint8_t MT6701I2C::MT_RequestSingleRegister(uint8_t _reg_addr) { 34 | uint8_t single_byte = 0; 35 | 36 | // Начать передачу по адресу 37 | _wire_->beginTransmission(MT6701_I2C_ADDRESS); 38 | // Отправить байт регистра 39 | _wire_->write(_reg_addr); 40 | // Завершить соединение 41 | _wire_->endTransmission(); 42 | 43 | // Запросить байт данных по адресу 44 | _wire_->requestFrom(MT6701_I2C_ADDRESS, (uint8_t)1); 45 | // Прочитать данные из буфера 46 | if (_wire_->available() >= 1 ) { 47 | single_byte = _wire_->read(); 48 | } 49 | // Завершить соединение 50 | _wire_->endTransmission(); 51 | 52 | return single_byte; 53 | } 54 | /* 55 | * @brief: записать значение размером 1 байт в произвольный регистр размером 1 байт 56 | * @param _reg_addr: 1 байт адреса регистра 57 | * @param _payload: 1 байт полезных данных 58 | */ 59 | void MT6701I2C::MT_WriteOneByte(uint8_t _reg_addr, uint8_t _payload) { 60 | // Начать передачу по адресу для прередачи байта данных в регистр 61 | _wire_->beginTransmission(MT6701_I2C_ADDRESS); 62 | _wire_->write(_reg_addr); 63 | _wire_->write(_payload); 64 | // Завершить соединение 65 | _wire_->endTransmission(); 66 | } 67 | 68 | // ########## PUBLIC ########## 69 | /* 70 | * @brief: вызов метода Wire.begin() 71 | * @note: использовать, если действие не было выполнено ранее 72 | */ 73 | void MT6701I2C::begin(void) { 74 | _wire_->begin(); 75 | } 76 | /* 77 | * @brief: вызов метода Wire.begin(SDA, SCL) с указанием выводов 78 | * @param _sda_pin: пользовательский контакт SDA 79 | * @param _scl_pin: пользовательский контакт SCL 80 | * @note: использовать, если действие не было выполнено ранее. 81 | * Применимо для платформ на базе ESP8266 и ESP32 82 | */ 83 | #if defined(ESP8266) || defined(ESP32) 84 | void MT6701I2C::begin(int8_t _sda_pin, int8_t _scl_pin) { 85 | _wire_->begin(_sda_pin, _scl_pin); 86 | } 87 | #endif 88 | 89 | #if defined(ARDUINO_ARCH_STM32) 90 | void MT6701I2C::begin(int8_t _sda_pin, int8_t _scl_pin) { 91 | _wire_->setSDA(_sda_pin); 92 | _wire_->setSCL(_scl_pin); 93 | _wire_->begin(); 94 | } 95 | #endif 96 | /* 97 | * @brief: настройка произвольной частоты шины I2C (по умолчанию 400кГц) 98 | * @note: использовать, если частота шины меняется из-за разных устройств 99 | */ 100 | void MT6701I2C::setClock(uint32_t _clock) { 101 | _wire_->setClock(_clock); 102 | } 103 | /* 104 | * @brief: сохраняет данные в EEPROM памяти датчика 105 | * @note: назначение каждой команды не описано в документации, порядок команд описан в 7.2 EEPROM Programming 106 | * рекомендуется выполнять эту операцию при напряжении питания от 4.5В до 5.5В 107 | */ 108 | void MT6701I2C::saveNewValues(void) { 109 | // Начать передачу по адресу 110 | _wire_->beginTransmission(MT6701_I2C_ADDRESS); 111 | // Отправить 0x09 112 | _wire_->write(MT6701_I2C_EEPROM_PROG_KEY_REG); 113 | // Отправить 0xB3 114 | _wire_->write(MT6701_I2C_EEPROM_PROG_KEY_VALUE); 115 | // Завершить соединение 116 | _wire_->endTransmission(); 117 | 118 | // Начать передачу по адресу 119 | _wire_->beginTransmission(MT6701_I2C_ADDRESS); 120 | // Отправить 0x0A 121 | _wire_->write(MT6701_I2C_EEPROM_PROG_CMD_REG); 122 | // Отправить 0x05 123 | _wire_->write(MT6701_I2C_EEPROM_PROG_CMD_VALUE); 124 | // Завершить соединение 125 | _wire_->endTransmission(); 126 | } 127 | /* 128 | * @brief: узнать подкючен ли датчик к линии I2C 129 | * @note: используется алгоритм стандартного поиска устройств на шина I2C 130 | * @return: 131 | * MT6701I2C_DEFAULT_REPORT_ERROR - не подключен 132 | * MT6701I2C_DEFAULT_REPORT_OK - подключен 133 | */ 134 | bool MT6701I2C::isConnected(void) { 135 | // Начать передачу по адресу 136 | _wire_->beginTransmission(MT6701_I2C_ADDRESS); 137 | return (!_wire_->endTransmission(MT6701_I2C_ADDRESS)) ? MT6701I2C_DEFAULT_REPORT_OK : MT6701I2C_DEFAULT_REPORT_ERROR; 138 | } 139 | /* 140 | * @brief: назначить контакт микроконтроллера для управления режимом интерфейса 141 | * @param _pin_mode: контакт микроконтроллера к которому подключен контакт MODE датчика 142 | */ 143 | void MT6701I2C::attachModePin(byte _pin_mode) { 144 | _pin_mode_ = _pin_mode; 145 | pinMode(_pin_mode_, OUTPUT); 146 | } 147 | /* 148 | * @brief: освоободить назначенный контакт микроконтроллера для управления режимом интерфейса 149 | */ 150 | void MT6701I2C::detachModePin(void) { 151 | pinMode(_pin_mode_, INPUT); 152 | _pin_mode_ = -1; 153 | } 154 | /* 155 | * @brief: включить интерфейс I2C/SSI 156 | */ 157 | void MT6701I2C::enableI2CorSSI(void) { 158 | digitalWrite(_pin_mode_, MT6701I2C_MODE_I2C_SSI); 159 | } 160 | /* 161 | * @brief: включить интерфейс UVW/ABZ 162 | */ 163 | void MT6701I2C::enableUVWorABZ(void) { 164 | digitalWrite(_pin_mode_, MT6701I2C_MODE_UVW_ABZ); 165 | } 166 | /* 167 | * @brief: получить чистое значение угла из Angle Data Register(13:0) 168 | * @return: 169 | * 0 - 16383 170 | */ 171 | word MT6701I2C::getRawAngle(void) { 172 | uint8_t high_byte = MT_RequestSingleRegister(MT6701_I2C_ANGLE_DATA_REG_H); 173 | uint8_t low_byte = MT_RequestSingleRegister(MT6701_I2C_ANGLE_DATA_REG_L); 174 | return (word)(high_byte << 6) | (low_byte >> 2); 175 | } 176 | /* 177 | * @brief: получить значение угла в градусах 178 | * @return: 179 | * 0.00 - 359.98 180 | */ 181 | float MT6701I2C::getDegreesAngle(void) { 182 | return ((float)getRawAngle() * 360) / 16384; 183 | } 184 | /* 185 | * @brief: получить значение угла в радианах 186 | * @return: 187 | * 0.00 - 6.28319 188 | */ 189 | float MT6701I2C::getRadiansAngle(void) { 190 | return (getDegreesAngle() * M_PI) / 180; 191 | } 192 | /* 193 | * @brief: получить тип конфигурации выходного интерфейса 194 | * @note: только для корпуса QFN 195 | * @return: 196 | * MT6701I2_OUTPUT_TYPE_A_B_Z 197 | * MT6701I2_OUTPUT_TYPE_UVW 198 | */ 199 | MT6701I2CConfigurationOutputType MT6701I2C::getConfigurationOutputType(void) { 200 | return (MT6701I2CConfigurationOutputType)((MT_RequestSingleRegister(MT6701_I2C_EEPROM_UVW_MUX_REG) >> MT6701_I2C_EEPROM_UVW_MUX_BIT) & 0x01); 201 | } 202 | /* 203 | * @brief: установить тип конфигурации выходного интерфейса -A-B-Z 204 | * @note: только для корпуса QFN 205 | */ 206 | void MT6701I2C::setConfigurationOutputTypeABZ(void) { 207 | uint8_t bkup = MT_RequestSingleRegister(MT6701_I2C_EEPROM_UVW_MUX_REG); 208 | bkup &= ~(1 << MT6701_I2C_EEPROM_UVW_MUX_BIT); 209 | MT_WriteOneByte(MT6701_I2C_EEPROM_UVW_MUX_REG, bkup); 210 | } 211 | /* 212 | * @brief: установить тип конфигурации выходного интерфейса -A-B-Z с проверкой 213 | * @note: только для корпуса QFN 214 | * @return: 215 | * MT6701I2C_DEFAULT_REPORT_ERROR - не установлено 216 | * MT6701I2C_DEFAULT_REPORT_OK - установлено 217 | */ 218 | bool MT6701I2C::setConfigurationOutputTypeABZVerify(void) { 219 | setConfigurationOutputTypeABZ(); 220 | return getConfigurationOutputType() ? MT6701I2C_DEFAULT_REPORT_ERROR : MT6701I2C_DEFAULT_REPORT_OK; 221 | } 222 | /* 223 | * @brief: установить тип конфигурации выходного интерфейса UVW 224 | * @note: только для корпуса QFN 225 | */ 226 | void MT6701I2C::setConfigurationOutputTypeUVW(void) { 227 | uint8_t bkup = MT_RequestSingleRegister(MT6701_I2C_EEPROM_UVW_MUX_REG); 228 | bkup |= 1 << MT6701_I2C_EEPROM_UVW_MUX_BIT; 229 | MT_WriteOneByte(MT6701_I2C_EEPROM_UVW_MUX_REG, bkup); 230 | } 231 | /* 232 | * @brief: установить тип конфигурации выходного интерфейса UVW с проверкой 233 | * @note: только для корпуса QFN 234 | * @return: 235 | * MT6701I2C_DEFAULT_REPORT_ERROR - не установлено 236 | * MT6701I2C_DEFAULT_REPORT_OK - установлено 237 | */ 238 | bool MT6701I2C::setConfigurationOutputTypeUVWVerify(void) { 239 | setConfigurationOutputTypeUVW(); 240 | return getConfigurationOutputType() ? MT6701I2C_DEFAULT_REPORT_OK : MT6701I2C_DEFAULT_REPORT_ERROR; 241 | } 242 | /* 243 | * @brief: получить значение типа выходного интерфейса 244 | * @return: 245 | * MT6701I2_OUTPUT_TYPE_ABZ 246 | * MT6701I2_OUTPUT_TYPE_UVW 247 | */ 248 | MT6701I2COutputType MT6701I2C::getOutputType(void) { 249 | return (MT6701I2COutputType)((MT_RequestSingleRegister(MT6701_I2C_EEPROM_ABZ_MUX_REG) >> MT6701_I2C_EEPROM_ABZ_MUX_BIT) & 0x01); 250 | } 251 | /* 252 | * @brief: установить тип выходного интерфейса ABZ 253 | */ 254 | void MT6701I2C::setOutputTypeABZ(void) { 255 | uint8_t bkup = MT_RequestSingleRegister(MT6701_I2C_EEPROM_ABZ_MUX_REG); 256 | bkup &= ~(1 << MT6701_I2C_EEPROM_ABZ_MUX_BIT); 257 | MT_WriteOneByte(MT6701_I2C_EEPROM_ABZ_MUX_REG, bkup); 258 | } 259 | /* 260 | * @brief: установить тип выходного интерфейса ABZ с проверкой 261 | * @return: 262 | * MT6701I2C_DEFAULT_REPORT_ERROR - не установлено 263 | * MT6701I2C_DEFAULT_REPORT_OK - установлено 264 | */ 265 | bool MT6701I2C::setOutputTypeABZVerify(void) { 266 | setOutputTypeABZ(); 267 | return getOutputType() ? MT6701I2C_DEFAULT_REPORT_ERROR : MT6701I2C_DEFAULT_REPORT_OK; 268 | } 269 | /* 270 | * @brief: установить тип выходного интерфейса UVW 271 | */ 272 | void MT6701I2C::setOutputTypeUVW(void) { 273 | uint8_t bkup = MT_RequestSingleRegister(MT6701_I2C_EEPROM_ABZ_MUX_REG); 274 | bkup |= 1 << MT6701_I2C_EEPROM_ABZ_MUX_BIT; 275 | MT_WriteOneByte(MT6701_I2C_EEPROM_ABZ_MUX_REG, bkup); 276 | } 277 | /* 278 | * @brief: установить тип выходного интерфейса UVW с проверкой 279 | * @return: 280 | * MT6701I2C_DEFAULT_REPORT_ERROR - не установлено 281 | * MT6701I2C_DEFAULT_REPORT_OK - установлено 282 | */ 283 | bool MT6701I2C::setOutputTypeUVWVerify(void) { 284 | setOutputTypeUVW(); 285 | return getOutputType() ? MT6701I2C_DEFAULT_REPORT_OK : MT6701I2C_DEFAULT_REPORT_ERROR; 286 | } 287 | /* 288 | * @brief: получить значение положительного направления вращения 289 | * @return: 290 | * MT6701I2_DIRECTION_COUNTERCLOCKWISE 291 | * MT6701I2_DIRECTION_CLOCKWISE 292 | */ 293 | MT6701I2CDirection MT6701I2C::getOutputRotationDirection(void) { 294 | return (MT6701I2CDirection)((MT_RequestSingleRegister(MT6701_I2C_EEPROM_DIR_REG) >> MT6701_I2C_EEPROM_DIR_BIT) & 0x01); 295 | } 296 | /* 297 | * @brief: установить положительное направление вращения против часовой стрелки 298 | */ 299 | void MT6701I2C::setOutputRotationDirectionCounterclockwise(void) { 300 | uint8_t bkup = MT_RequestSingleRegister(MT6701_I2C_EEPROM_DIR_REG); 301 | bkup &= ~(1 << MT6701_I2C_EEPROM_DIR_BIT); 302 | MT_WriteOneByte(MT6701_I2C_EEPROM_DIR_REG, bkup); 303 | } 304 | /* 305 | * @brief: установить положительное направление вращения против часовой стрелки с проверкой 306 | * @return: 307 | * MT6701I2C_DEFAULT_REPORT_ERROR - не установлено 308 | * MT6701I2C_DEFAULT_REPORT_OK - установлено 309 | */ 310 | bool MT6701I2C::setOutputRotationDirectionCounterclockwiseVerify(void) { 311 | setOutputRotationDirectionCounterclockwise(); 312 | return getOutputRotationDirection() ? MT6701I2C_DEFAULT_REPORT_ERROR : MT6701I2C_DEFAULT_REPORT_OK; 313 | } 314 | /* 315 | * @brief: установить положительное направление вращения по часовой стрелке 316 | */ 317 | void MT6701I2C::setOutputRotationDirectionClockwise(void) { 318 | uint8_t bkup =MT_RequestSingleRegister(MT6701_I2C_EEPROM_DIR_REG); 319 | bkup |= 1 << MT6701_I2C_EEPROM_DIR_BIT; 320 | MT_WriteOneByte(MT6701_I2C_EEPROM_DIR_REG, bkup); 321 | } 322 | /* 323 | * @brief: установить положительное направление вращения по часовой стрелке с проверкой 324 | * @return: 325 | * MT6701I2C_DEFAULT_REPORT_ERROR - не установлено 326 | * MT6701I2C_DEFAULT_REPORT_OK - установлено 327 | */ 328 | bool MT6701I2C::setOutputRotationDirectionClockwiseVerify(void) { 329 | setOutputRotationDirectionClockwise(); 330 | return getOutputRotationDirection() ? MT6701I2C_DEFAULT_REPORT_OK : MT6701I2C_DEFAULT_REPORT_ERROR; 331 | } 332 | /* 333 | * @brief: получить значение выходного разрешения в режиме UVW 334 | * @return: 335 | * 1 - 16 336 | */ 337 | byte MT6701I2C::getOutputResolutionUVW(void) { 338 | return ((MT_RequestSingleRegister(MT6701_I2C_EEPROM_UVW_RES_REG) >> MT6701_I2C_EEPROM_UVW_MUX_BIT_S) & 0x0F) + 1; // 0x0F = 0b00001111, +1 для смещения в диапазон 1-16 339 | } 340 | /* 341 | * @brief: установить значение выходного разрешения в режиме UVW 342 | * @param _resolution: 343 | * 1 - 16 344 | */ 345 | void MT6701I2C::setOutputResolutionUVW(byte _resolution) { 346 | uint8_t bkup = MT_RequestSingleRegister(MT6701_I2C_EEPROM_UVW_RES_REG); 347 | bkup |= (_resolution - 1) << MT6701_I2C_EEPROM_UVW_MUX_BIT_S; // -1 для смещения в диапазон 0-15 348 | MT_WriteOneByte(MT6701_I2C_EEPROM_UVW_RES_REG, bkup); 349 | } 350 | /* 351 | * @brief: установить значение выходного разрешения в режиме UVW с проверкой 352 | * @param _resolution: 353 | * 1 - 16 354 | * @return: 355 | * MT6701I2C_DEFAULT_REPORT_ERROR - не установлено 356 | * MT6701I2C_DEFAULT_REPORT_OK - установлено 357 | */ 358 | bool MT6701I2C::setOutputResolutionUVWVerify(byte _resolution) { 359 | setOutputResolutionUVW(_resolution); 360 | return getOutputResolutionUVW() == _resolution ? MT6701I2C_DEFAULT_REPORT_OK : MT6701I2C_DEFAULT_REPORT_ERROR; 361 | } 362 | /* 363 | * @brief: получить значение выходного разрешения в режиме ABZ 364 | * @return: 365 | * 1 - 1024 366 | */ 367 | word MT6701I2C::getOutputResolutionABZ(void) { 368 | uint8_t reg_h = MT_RequestSingleRegister(MT6701_I2C_EEPROM_ABZ_RES_REG_H) & 0x03; // 0x03 = 0b00000011 369 | return (word)((reg_h << 8) | MT_RequestSingleRegister(MT6701_I2C_EEPROM_ABZ_RES_REG_L)) + 1; // +1 для смещения в диапазон 1-1024 370 | } 371 | /* 372 | * @brief: установить значение выходного разрешения в режиме ABZ 373 | * @param _resolution: 374 | * 1 - 1024 375 | */ 376 | void MT6701I2C::setOutputResolutionABZ(word _resolution) { 377 | uint8_t reg_l = (_resolution - 1) & 0xFF; 378 | uint8_t reg_h = MT_RequestSingleRegister(MT6701_I2C_EEPROM_ABZ_RES_REG_H); 379 | reg_h &= ~0x03; // исправление от dRon 380 | reg_h |= ((_resolution - 1) >> 8) & 0x03; 381 | MT_WriteOneByte(MT6701_I2C_EEPROM_ABZ_RES_REG_H, reg_h); 382 | MT_WriteOneByte(MT6701_I2C_EEPROM_ABZ_RES_REG_L, reg_l); 383 | } 384 | /* 385 | * @brief: установить значение выходного разрешения в режиме ABZ с проверкой 386 | * @param _resolution: 387 | * 1 - 1024 388 | * @return: 389 | * MT6701I2C_DEFAULT_REPORT_ERROR - не установлено 390 | * MT6701I2C_DEFAULT_REPORT_OK - установлено 391 | */ 392 | bool MT6701I2C::setOutputResolutionABZVerify(word _resolution) { 393 | setOutputResolutionABZ(_resolution); 394 | return getOutputResolutionABZ() == _resolution ? MT6701I2C_DEFAULT_REPORT_OK : MT6701I2C_DEFAULT_REPORT_ERROR; 395 | } 396 | 397 | 398 | /* 399 | * @brief: получить значение ширины импульса Z в режиме ABZ 400 | * @return: 401 | * MT6701I2_Z_PULSE_WIDTH_1LSB 402 | * MT6701I2_Z_PULSE_WIDTH_2LSB 403 | * MT6701I2_Z_PULSE_WIDTH_4LSB 404 | * MT6701I2_Z_PULSE_WIDTH_8LSB 405 | * MT6701I2_Z_PULSE_WIDTH_12LSB 406 | * MT6701I2_Z_PULSE_WIDTH_16LSB 407 | * MT6701I2_Z_PULSE_WIDTH_180DEG 408 | * MT6701I2_Z_PULSE_WIDTH_1LSB_2 409 | */ 410 | MT6701I2CZPulseWidth MT6701I2C::getZPulseWidth(void) { 411 | return (MT6701I2CZPulseWidth)((MT_RequestSingleRegister(MT6701_I2C_EEPROM_Z_PULSE_WIDTH_REG) >> MT6701_I2C_EEPROM_Z_PULSE_WIDTH_BIT_S) & 0x07); // 0x07 = 0b00000111 412 | } 413 | /* 414 | * @brief: установить ширину импульса Z 1LSB 415 | */ 416 | void MT6701I2C::setZPulseWidth1LSB(void) { 417 | uint8_t bkup = MT_RequestSingleRegister(MT6701_I2C_EEPROM_Z_PULSE_WIDTH_REG); 418 | bkup |= MT6701I2_Z_PULSE_WIDTH_1LSB << MT6701_I2C_EEPROM_Z_PULSE_WIDTH_BIT_S; 419 | MT_WriteOneByte(MT6701_I2C_EEPROM_Z_PULSE_WIDTH_REG, bkup); 420 | } 421 | /* 422 | * @brief: установить ширину импульса Z 1LSB с проверкой 423 | * @return: 424 | * MT6701I2C_DEFAULT_REPORT_ERROR - не установлено 425 | * MT6701I2C_DEFAULT_REPORT_OK - установлено 426 | */ 427 | bool MT6701I2C::setZPulseWidth1LSBVerify(void) { 428 | setZPulseWidth1LSB(); 429 | return getZPulseWidth() == MT6701I2_Z_PULSE_WIDTH_1LSB ? MT6701I2C_DEFAULT_REPORT_OK : MT6701I2C_DEFAULT_REPORT_ERROR; 430 | } 431 | /* 432 | * @brief: установить ширину импульса Z 2LSB 433 | */ 434 | void MT6701I2C::setZPulseWidth2LSB(void) { 435 | uint8_t bkup = MT_RequestSingleRegister(MT6701_I2C_EEPROM_Z_PULSE_WIDTH_REG); 436 | bkup |= MT6701I2_Z_PULSE_WIDTH_2LSB << MT6701_I2C_EEPROM_Z_PULSE_WIDTH_BIT_S; 437 | MT_WriteOneByte(MT6701_I2C_EEPROM_Z_PULSE_WIDTH_REG, bkup); 438 | } 439 | /* 440 | * @brief: установить ширину импульса Z 2LSB с проверкой 441 | * @return: 442 | * MT6701I2C_DEFAULT_REPORT_ERROR - не установлено 443 | * MT6701I2C_DEFAULT_REPORT_OK - установлено 444 | */ 445 | bool MT6701I2C::setZPulseWidth2LSBVerify(void) { 446 | setZPulseWidth2LSB(); 447 | return getZPulseWidth() == MT6701I2_Z_PULSE_WIDTH_2LSB ? MT6701I2C_DEFAULT_REPORT_OK : MT6701I2C_DEFAULT_REPORT_ERROR; 448 | } 449 | /* 450 | * @brief: установить ширину импульса Z 4LSB 451 | */ 452 | void MT6701I2C::setZPulseWidth4LSB(void) { 453 | uint8_t bkup = MT_RequestSingleRegister(MT6701_I2C_EEPROM_Z_PULSE_WIDTH_REG); 454 | bkup |= MT6701I2_Z_PULSE_WIDTH_4LSB << MT6701_I2C_EEPROM_Z_PULSE_WIDTH_BIT_S; 455 | MT_WriteOneByte(MT6701_I2C_EEPROM_Z_PULSE_WIDTH_REG, bkup); 456 | } 457 | /* 458 | * @brief: установить ширину импульса Z 4LSB с проверкой 459 | * @return: 460 | * MT6701I2C_DEFAULT_REPORT_ERROR - не установлено 461 | * MT6701I2C_DEFAULT_REPORT_OK - установлено 462 | */ 463 | bool MT6701I2C::setZPulseWidth4LSBVerify(void) { 464 | setZPulseWidth1LSB(); 465 | return getZPulseWidth() == MT6701I2_Z_PULSE_WIDTH_4LSB ? MT6701I2C_DEFAULT_REPORT_OK : MT6701I2C_DEFAULT_REPORT_ERROR; 466 | } 467 | /* 468 | * @brief: установить ширину импульса Z 8LSB 469 | */ 470 | void MT6701I2C::setZPulseWidth8LSB(void) { 471 | uint8_t bkup = MT_RequestSingleRegister(MT6701_I2C_EEPROM_Z_PULSE_WIDTH_REG); 472 | bkup |= MT6701I2_Z_PULSE_WIDTH_8LSB << MT6701_I2C_EEPROM_Z_PULSE_WIDTH_BIT_S; 473 | MT_WriteOneByte(MT6701_I2C_EEPROM_Z_PULSE_WIDTH_REG, bkup); 474 | } 475 | /* 476 | * @brief: установить ширину импульса Z 8LSB с проверкой 477 | * @return: 478 | * MT6701I2C_DEFAULT_REPORT_ERROR - не установлено 479 | * MT6701I2C_DEFAULT_REPORT_OK - установлено 480 | */ 481 | bool MT6701I2C::setZPulseWidth8LSBVerify(void) { 482 | setZPulseWidth8LSB(); 483 | return getZPulseWidth() == MT6701I2_Z_PULSE_WIDTH_8LSB ? MT6701I2C_DEFAULT_REPORT_OK : MT6701I2C_DEFAULT_REPORT_ERROR; 484 | } 485 | /* 486 | * @brief: установить ширину импульса Z 12LSB 487 | */ 488 | void MT6701I2C::setZPulseWidth12LSB(void) { 489 | uint8_t bkup = MT_RequestSingleRegister(MT6701_I2C_EEPROM_Z_PULSE_WIDTH_REG); 490 | bkup |= MT6701I2_Z_PULSE_WIDTH_12LSB << MT6701_I2C_EEPROM_Z_PULSE_WIDTH_BIT_S; 491 | MT_WriteOneByte(MT6701_I2C_EEPROM_Z_PULSE_WIDTH_REG, bkup); 492 | } 493 | /* 494 | * @brief: установить ширину импульса Z 12LSB с проверкой 495 | * @return: 496 | * MT6701I2C_DEFAULT_REPORT_ERROR - не установлено 497 | * MT6701I2C_DEFAULT_REPORT_OK - установлено 498 | */ 499 | bool MT6701I2C::setZPulseWidth12LSBVerify(void) { 500 | setZPulseWidth12LSB(); 501 | return getZPulseWidth() == MT6701I2_Z_PULSE_WIDTH_12LSB ? MT6701I2C_DEFAULT_REPORT_OK : MT6701I2C_DEFAULT_REPORT_ERROR; 502 | } 503 | /* 504 | * @brief: установить ширину импульса Z 16LSB 505 | */ 506 | void MT6701I2C::setZPulseWidth16LSB(void) { 507 | uint8_t bkup = MT_RequestSingleRegister(MT6701_I2C_EEPROM_Z_PULSE_WIDTH_REG); 508 | bkup |= MT6701I2_Z_PULSE_WIDTH_16LSB << MT6701_I2C_EEPROM_Z_PULSE_WIDTH_BIT_S; 509 | MT_WriteOneByte(MT6701_I2C_EEPROM_Z_PULSE_WIDTH_REG, bkup); 510 | } 511 | /* 512 | * @brief: установить ширину импульса Z 16LSB с проверкой 513 | * @return: 514 | * MT6701I2C_DEFAULT_REPORT_ERROR - не установлено 515 | * MT6701I2C_DEFAULT_REPORT_OK - установлено 516 | */ 517 | bool MT6701I2C::setZPulseWidth16LSBVerify(void) { 518 | setZPulseWidth16LSB(); 519 | return getZPulseWidth() == MT6701I2_Z_PULSE_WIDTH_16LSB ? MT6701I2C_DEFAULT_REPORT_OK : MT6701I2C_DEFAULT_REPORT_ERROR; 520 | } 521 | /* 522 | * @brief: установить ширину импульса Z 180 градусов 523 | */ 524 | void MT6701I2C::setZPulseWidth180DEG(void) { 525 | uint8_t bkup = MT_RequestSingleRegister(MT6701_I2C_EEPROM_Z_PULSE_WIDTH_REG); 526 | bkup |= MT6701I2_Z_PULSE_WIDTH_180DEG << MT6701_I2C_EEPROM_Z_PULSE_WIDTH_BIT_S; 527 | MT_WriteOneByte(MT6701_I2C_EEPROM_Z_PULSE_WIDTH_REG, bkup); 528 | } 529 | /* 530 | * @brief: установить ширину импульса Z 180 градусов с проверкой 531 | * @return: 532 | * MT6701I2C_DEFAULT_REPORT_ERROR - не установлено 533 | * MT6701I2C_DEFAULT_REPORT_OK - установлено 534 | */ 535 | bool MT6701I2C::setZPulseWidth180DEGVerify(void) { 536 | setZPulseWidth180DEG(); 537 | return getZPulseWidth() == MT6701I2_Z_PULSE_WIDTH_180DEG ? MT6701I2C_DEFAULT_REPORT_OK : MT6701I2C_DEFAULT_REPORT_ERROR; 538 | } 539 | /* 540 | * @brief: получить значение нулевого положения 541 | * @note: СМОТРЕТЬ ТАБЛИЦУ В ДОКУМЕНТАЦИИ 542 | * @return: 543 | * 0 - 4095 544 | */ 545 | word MT6701I2C::getZeroDegreePositionData(void) { 546 | uint8_t reg_h = MT_RequestSingleRegister(MT6701_I2C_EEPROM_ZERO_REG_H) & 0x0F; // 0x0F = 0b00001111 547 | return (word)((reg_h << 8) | MT_RequestSingleRegister(MT6701_I2C_EEPROM_ZERO_REG_L)); 548 | } 549 | /* 550 | * @brief: установить значение нулевого положения 551 | * @note: СМОТРЕТЬ ТАБЛИЦУ В ДОКУМЕНТАЦИИ 552 | * @param _zero_position_data: 553 | * 0 - 4095 554 | */ 555 | void MT6701I2C::setZeroDegreePositionData(word _zero_position_data) { 556 | uint8_t bkup = MT_RequestSingleRegister(MT6701_I2C_EEPROM_ZERO_REG_H) & 0xF0; // 0xF0 = 0b11110000 557 | uint8_t reg_l = _zero_position_data & 0xFF; 558 | bkup |= _zero_position_data >> 8; 559 | MT_WriteOneByte(MT6701_I2C_EEPROM_ZERO_REG_H, bkup); 560 | MT_WriteOneByte(MT6701_I2C_EEPROM_ZERO_REG_L, reg_l); 561 | } 562 | /* 563 | * @brief: установить значение нулевого положения с проверкой 564 | * @note: СМОТРЕТЬ ТАБЛИЦУ В ДОКУМЕНТАЦИИ 565 | * @param _zero_position_data: 566 | * 0 - 4095 567 | * @return: 568 | * MT6701I2C_DEFAULT_REPORT_ERROR - не установлено 569 | * MT6701I2C_DEFAULT_REPORT_OK - установлено 570 | */ 571 | bool MT6701I2C::setZeroDegreePositionDataVerify(word _zero_position_data) { 572 | setZeroDegreePositionData(_zero_position_data); 573 | return getZeroDegreePositionData() == _zero_position_data ? MT6701I2C_DEFAULT_REPORT_OK : MT6701I2C_DEFAULT_REPORT_ERROR; 574 | } 575 | /* 576 | * @brief: получить значение частоты ШИМ 577 | * @return: 578 | * MT6701I2_PWM_FREQUENCY_9944 579 | * MT6701I2_PWM_FREQUENCY_4972 580 | */ 581 | MT6701I2CFrequencyPWM MT6701I2C::getFrequencyPWM(void) { 582 | return (MT6701I2CFrequencyPWM)((MT_RequestSingleRegister(MT6701_I2C_EEPROM_PWM_FREQ_REG) >> MT6701_I2C_EEPROM_PWM_FREQ_BIT) & 0x01); 583 | } 584 | /* 585 | * @brief: установить значение частоты ШИМ 994.4Гц 586 | */ 587 | void MT6701I2C::setFrequencyPWM9944(void) { 588 | uint8_t bkup = MT_RequestSingleRegister(MT6701_I2C_EEPROM_PWM_FREQ_REG); 589 | bkup &= ~(1 << MT6701_I2C_EEPROM_PWM_FREQ_BIT); 590 | MT_WriteOneByte(MT6701_I2C_EEPROM_PWM_FREQ_REG, bkup); 591 | } 592 | /* 593 | * @brief: установить значение частоты ШИМ 994.4Гц с проверкой 594 | * @return: 595 | * MT6701I2C_DEFAULT_REPORT_ERROR - не установлено 596 | * MT6701I2C_DEFAULT_REPORT_OK - установлено 597 | */ 598 | bool MT6701I2C::setFrequencyPWM9944Verify(void) { 599 | setFrequencyPWM9944(); 600 | return getFrequencyPWM() == MT6701I2_PWM_FREQUENCY_9944 ? MT6701I2C_DEFAULT_REPORT_OK : MT6701I2C_DEFAULT_REPORT_ERROR; 601 | } 602 | /* 603 | * @brief: установить значение частоты ШИМ 497.2Гц 604 | */ 605 | void MT6701I2C::setFrequencyPWM4972(void) { 606 | uint8_t bkup = MT_RequestSingleRegister(MT6701_I2C_EEPROM_PWM_FREQ_REG); 607 | bkup |= 1 << MT6701_I2C_EEPROM_PWM_FREQ_BIT; 608 | MT_WriteOneByte(MT6701_I2C_EEPROM_PWM_FREQ_REG, bkup); 609 | } 610 | /* 611 | * @brief: установить значение частоты ШИМ 497.2Гц с проверкой 612 | * @return: 613 | * MT6701I2C_DEFAULT_REPORT_ERROR - не установлено 614 | * MT6701I2C_DEFAULT_REPORT_OK - установлено 615 | */ 616 | bool MT6701I2C::setFrequencyPWM4972Verify(void) { 617 | setFrequencyPWM4972(); 618 | return getFrequencyPWM() == MT6701I2_PWM_FREQUENCY_4972 ? MT6701I2C_DEFAULT_REPORT_OK : MT6701I2C_DEFAULT_REPORT_ERROR; 619 | } 620 | /* 621 | * @brief: получить значение полярности ШИМ 622 | * @return: 623 | * MT6701I2_PWM_POLARITY_HIGH 624 | * MT6701I2_PWM_POLARITY_LOW 625 | */ 626 | MT6701I2CPolarityPWM MT6701I2C::getPolarityPWM(void) { 627 | return (MT6701I2CPolarityPWM)((MT_RequestSingleRegister(MT6701_I2C_EEPROM_PWM_POL_REG) >> MT6701_I2C_EEPROM_PWM_POL_BIT) & 0x01); 628 | } 629 | /* 630 | * @brief: установить значение полярности ШИМ HIGH 631 | */ 632 | void MT6701I2C::setPolarityPWMHigh(void) { 633 | uint8_t bkup = MT_RequestSingleRegister(MT6701_I2C_EEPROM_PWM_POL_REG); 634 | bkup &= ~(1 << MT6701_I2C_EEPROM_PWM_POL_BIT); 635 | MT_WriteOneByte(MT6701_I2C_EEPROM_PWM_POL_REG, bkup); 636 | } 637 | /* 638 | * @brief: установить значение полярности ШИМ HIGH с проверкой 639 | * @return: 640 | * MT6701I2C_DEFAULT_REPORT_ERROR - не установлено 641 | * MT6701I2C_DEFAULT_REPORT_OK - установлено 642 | */ 643 | bool MT6701I2C::setPolarityPWMHighVerify(void) { 644 | setPolarityPWMHigh(); 645 | return getPolarityPWM() == MT6701I2_PWM_POLARITY_HIGH ? MT6701I2C_DEFAULT_REPORT_OK : MT6701I2C_DEFAULT_REPORT_ERROR; 646 | } 647 | /* 648 | * @brief: установить значение полярности ШИМ LOW 649 | */ 650 | void MT6701I2C::setPolarityPWMLow(void) { 651 | uint8_t bkup = MT_RequestSingleRegister(MT6701_I2C_EEPROM_PWM_POL_REG); 652 | bkup |= 1 << MT6701_I2C_EEPROM_PWM_POL_BIT; 653 | MT_WriteOneByte(MT6701_I2C_EEPROM_PWM_POL_REG, bkup); 654 | } 655 | /* 656 | * @brief: установить значение полярности ШИМ LOW с проверкой 657 | * @return: 658 | * MT6701I2C_DEFAULT_REPORT_ERROR - не установлено 659 | * MT6701I2C_DEFAULT_REPORT_OK - установлено 660 | */ 661 | bool MT6701I2C::setPolarityPWMLowVerify(void) { 662 | setPolarityPWMLow(); 663 | return getPolarityPWM() == MT6701I2_PWM_POLARITY_LOW ? MT6701I2C_DEFAULT_REPORT_OK : MT6701I2C_DEFAULT_REPORT_ERROR; 664 | } 665 | 666 | /* 667 | * @brief: получить режима выхода 668 | * @return: 669 | * MT6701I2_OUTPUT_MODE_ANALOG 670 | * MT6701I2_OUTPUT_MODE_PWM 671 | */ 672 | MT6701I2COutputMode MT6701I2C::getOutputMode(void) { 673 | return (MT6701I2COutputMode)((MT_RequestSingleRegister(MT6701_I2C_EEPROM_OUT_MODE_REG) >> MT6701_I2C_EEPROM_OUT_MODE_BIT) & 0x01); 674 | } 675 | /* 676 | * @brief: установить режим выхода Аналог 677 | */ 678 | void MT6701I2C::setOutputModeAnalog(void) { 679 | uint8_t bkup = MT_RequestSingleRegister(MT6701_I2C_EEPROM_OUT_MODE_REG); 680 | bkup &= ~(1 << MT6701_I2C_EEPROM_OUT_MODE_BIT); 681 | MT_WriteOneByte(MT6701_I2C_EEPROM_OUT_MODE_REG, bkup); 682 | } 683 | /* 684 | * @brief: установить режим выхода Аналог с проверкой 685 | * @return: 686 | * MT6701I2C_DEFAULT_REPORT_ERROR - не установлено 687 | * MT6701I2C_DEFAULT_REPORT_OK - установлено 688 | */ 689 | bool MT6701I2C::setOutputModeAnalogVerify(void) { 690 | setOutputModeAnalog(); 691 | return getOutputMode() == MT6701I2_OUTPUT_MODE_ANALOG ? MT6701I2C_DEFAULT_REPORT_OK : MT6701I2C_DEFAULT_REPORT_ERROR; 692 | } 693 | /* 694 | * @brief: установить режим выхода ШИМ 695 | */ 696 | void MT6701I2C::setOutputModePWM(void) { 697 | uint8_t bkup = MT_RequestSingleRegister(MT6701_I2C_EEPROM_OUT_MODE_REG); 698 | bkup |= 1 << MT6701_I2C_EEPROM_OUT_MODE_BIT; 699 | MT_WriteOneByte(MT6701_I2C_EEPROM_OUT_MODE_REG, bkup); 700 | } 701 | /* 702 | * @brief: установить режим выхода ШИМ с проверкой 703 | * @return: 704 | * MT6701I2C_DEFAULT_REPORT_ERROR - не установлено 705 | * MT6701I2C_DEFAULT_REPORT_OK - установлено 706 | */ 707 | bool MT6701I2C::setOutputModePWMVerify(void) { 708 | setOutputModePWM(); 709 | return getOutputMode() == MT6701I2_OUTPUT_MODE_PWM ? MT6701I2C_DEFAULT_REPORT_OK : MT6701I2C_DEFAULT_REPORT_ERROR; 710 | } 711 | -------------------------------------------------------------------------------- /src/MT6701_I2C.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Класс для Arduino IDE реализующий множество методов 3 | * взаимодействия с бесконтактным датчиком положения 4 | * MT6701 от компании MagnTek http://www.magntek.com.cn/en/index.htm 5 | * 6 | * Документация к датчику: 7 | ** http://www.magntek.com.cn/en/list/177/559.htm 8 | ** http://www.magntek.com.cn/upload/MT6701_Rev.1.5.pdf 9 | * 10 | * Контакты: 11 | ** GitHub - https://github.com/S-LABc 12 | ** Gmail - romansklyar15@gmail.com 13 | * 14 | * Copyright (C) 2022. v1.2 / License MIT / Скляр Роман S-LAB 15 | */ 16 | 17 | #pragma once 18 | #include "Arduino.h" 19 | #include "Wire.h" 20 | 21 | /*=== Настройки шины I2C датчика ===*/ 22 | const uint32_t MT6701_I2C_CLOCK_100KHZ = 100000; 23 | const uint32_t MT6701_I2C_CLOCK_400KHZ = 400000; 24 | const uint32_t MT6701_I2C_CLOCK_1MHZ = 1000000; 25 | const uint8_t MT6701_I2C_ADDRESS = 0x06; 26 | 27 | /*=== Выводы MODE на разных платах (зависит от ядра) ===*/ 28 | #define STM32_MT6701_MODE_PIN PC13 29 | #define ESP8266_MT6701_MODE_PIN 2 30 | #define ESP32_MT6701_MODE_PIN 4 31 | #define ARDUINO_MT6701_MODE_PIN 3 32 | 33 | /*=== Адреса регистров датчика ===*/ 34 | // Angle Data Register 35 | const uint8_t MT6701_I2C_ANGLE_DATA_REG_H = 0x03; 36 | const uint8_t MT6701_I2C_ANGLE_DATA_REG_L = 0x04; 37 | // UVW_MUX только для корпуса QFN 38 | const uint8_t MT6701_I2C_EEPROM_UVW_MUX_REG = 0x25; 39 | const uint8_t MT6701_I2C_EEPROM_UVW_MUX_BIT = 7; 40 | // ABZ_MUX 41 | const uint8_t MT6701_I2C_EEPROM_ABZ_MUX_REG = 0x29; 42 | const uint8_t MT6701_I2C_EEPROM_ABZ_MUX_BIT = 6; 43 | // DIR 44 | const uint8_t MT6701_I2C_EEPROM_DIR_REG = 0x29; 45 | const uint8_t MT6701_I2C_EEPROM_DIR_BIT = 1; 46 | // UVW_RES 47 | const uint8_t MT6701_I2C_EEPROM_UVW_RES_REG = 0x30; 48 | const uint8_t MT6701_I2C_EEPROM_UVW_MUX_BIT_S = 4; 49 | // ABZ_RES 50 | const uint8_t MT6701_I2C_EEPROM_ABZ_RES_REG_H = 0x30; 51 | const uint8_t MT6701_I2C_EEPROM_ABZ_RES_REG_L = 0x31; 52 | const uint8_t MT6701_I2C_EEPROM_ABZ_MUX_BIT_S = 0; 53 | // HYST 54 | const uint8_t MT6701_I2C_EEPROM_HYST_REG_H = 0x32; 55 | const uint8_t MT6701_I2C_EEPROM_HYST_REG_L = 0x34; 56 | // Z_PULSE_WIDTH 57 | const uint8_t MT6701_I2C_EEPROM_Z_PULSE_WIDTH_REG = 0x32; 58 | const uint8_t MT6701_I2C_EEPROM_Z_PULSE_WIDTH_BIT_S = 4; 59 | // ZERO 60 | const uint8_t MT6701_I2C_EEPROM_ZERO_REG_H = 0x32; 61 | const uint8_t MT6701_I2C_EEPROM_ZERO_REG_L = 0x33; 62 | // PWM_FREQ 63 | const uint8_t MT6701_I2C_EEPROM_PWM_FREQ_REG = 0x38; 64 | const uint8_t MT6701_I2C_EEPROM_PWM_FREQ_BIT = 7; 65 | // PWM_POL 66 | const uint8_t MT6701_I2C_EEPROM_PWM_POL_REG = 0x38; 67 | const uint8_t MT6701_I2C_EEPROM_PWM_POL_BIT = 6; 68 | // OUT_MODE 69 | const uint8_t MT6701_I2C_EEPROM_OUT_MODE_REG = 0x38; 70 | const uint8_t MT6701_I2C_EEPROM_OUT_MODE_BIT = 5; 71 | // A_START 72 | const uint8_t MT6701_I2C_EEPROM_A_START_REG_H = 0x3E; 73 | const uint8_t MT6701_I2C_EEPROM_A_START_REG_L = 0x3F; 74 | // A_STOP 75 | const uint8_t MT6701_I2C_EEPROM_A_STOP_REG_H = 0x3E; 76 | const uint8_t MT6701_I2C_EEPROM_A_STOP_REG_L = 0x40; 77 | const uint8_t MT6701_I2C_EEPROM_A_STOP_BIT_S = 4; 78 | // 7.2 EEPROM Programming 79 | const uint8_t MT6701_I2C_EEPROM_PROG_KEY_REG = 0x09; 80 | const uint8_t MT6701_I2C_EEPROM_PROG_KEY_VALUE = 0xB3; 81 | const uint8_t MT6701_I2C_EEPROM_PROG_CMD_REG = 0x0A; 82 | const uint8_t MT6701_I2C_EEPROM_PROG_CMD_VALUE = 0x05; 83 | 84 | /*=== Вспомогательные значения ===*/ 85 | // Тип конфигурации выходного интерфейса (только для корпуса QFN) 86 | enum MT6701I2CConfigurationOutputType { 87 | MT6701I2_CONFIG_OUTPUT_TYPE_UVW, 88 | MT6701I2_CONFIG_OUTPUT_TYPE_A_B_Z, 89 | }; 90 | // Тип выходного интерфейса 91 | enum MT6701I2COutputType { 92 | MT6701I2_OUTPUT_TYPE_ABZ, 93 | MT6701I2_OUTPUT_TYPE_UVW, 94 | }; 95 | // Положительное направление вращения 96 | enum MT6701I2CDirection { 97 | MT6701I2_DIRECTION_COUNTERCLOCKWISE, // Против часовй стрелки 98 | MT6701I2_DIRECTION_CLOCKWISE, // По часовой стрелке 99 | }; 100 | // Ширина импульса Z 101 | enum MT6701I2CZPulseWidth { 102 | MT6701I2_Z_PULSE_WIDTH_1LSB, 103 | MT6701I2_Z_PULSE_WIDTH_2LSB, 104 | MT6701I2_Z_PULSE_WIDTH_4LSB, 105 | MT6701I2_Z_PULSE_WIDTH_8LSB, 106 | MT6701I2_Z_PULSE_WIDTH_12LSB, 107 | MT6701I2_Z_PULSE_WIDTH_16LSB, 108 | MT6701I2_Z_PULSE_WIDTH_180DEG, 109 | MT6701I2_Z_PULSE_WIDTH_1LSB_2, 110 | }; 111 | // Частота ШИМ 112 | enum MT6701I2CFrequencyPWM { 113 | MT6701I2_PWM_FREQUENCY_9944, 114 | MT6701I2_PWM_FREQUENCY_4972, 115 | }; 116 | // Полярность ШИМ 117 | enum MT6701I2CPolarityPWM { 118 | MT6701I2_PWM_POLARITY_HIGH, 119 | MT6701I2_PWM_POLARITY_LOW, 120 | }; 121 | // Режим выхода 122 | enum MT6701I2COutputMode { 123 | MT6701I2_OUTPUT_MODE_ANALOG, 124 | MT6701I2_OUTPUT_MODE_PWM, 125 | }; 126 | // Ответы стандартного вида успех/ошибка 127 | const uint8_t MT6701I2C_DEFAULT_REPORT_ERROR = 0; 128 | const uint8_t MT6701I2C_DEFAULT_REPORT_OK = 1; 129 | // Выбор интерфейсов датчика 130 | const uint8_t MT6701I2C_MODE_I2C_SSI = 0; 131 | const uint8_t MT6701I2C_MODE_UVW_ABZ = 1; 132 | 133 | 134 | class MT6701I2C { 135 | private: 136 | TwoWire* _wire_; // Объект для использования методов I2C 137 | int8_t _pin_mode_ = -1; // Контакт микроконтроллера к которому подключен вывод MODE датчика 138 | 139 | protected: 140 | uint8_t MT_RequestSingleRegister(uint8_t _reg_addr); // Запрос значения регистра размером 1 байт 141 | void MT_WriteOneByte(uint8_t _reg_addr, uint8_t _payload); // Запись одного байта в однобайтовый регистр 142 | 143 | public: 144 | MT6701I2C(TwoWire* _twi); // Конструктор с использованием только интерфейса I2C 145 | 146 | void begin(void); // Вызов Wire.begin() 147 | #if defined(ESP8266) || defined(ESP32) || defined(ARDUINO_ARCH_STM32) 148 | void begin(int8_t _sda_pin, int8_t _scl_pin); // Вызов Wire.begin(SDA, SCL) с указанием выводов 149 | #endif 150 | void setClock(uint32_t _clock = MT6701_I2C_CLOCK_400KHZ); // Настройка частоты на 100кГц, 400кГц, 1МГц, или пользовательское значение (по умолчанию 400кГц) 151 | 152 | void saveNewValues(void); // Метод производителя для сохранения значений в памяти EEPROM. Рекомендуется выполнять при напряжение питания от 4.5В до 5.5В 153 | 154 | bool isConnected(void); // Проверка по стандартному алгоритму поиска устройств на линии I2C 155 | 156 | void attachModePin(byte _pin_mode); // Назначить контакт микроконтроллера для управления режимом интерфейса 157 | void detachModePin(void); // Освоободить назначенный контакт микроконтроллера для управления режимом интерфейса 158 | 159 | void enableI2CorSSI(void); // Включить интерфейс I2C/SSI. MT6701I2C_MODE_I2C_SSI 160 | void enableUVWorABZ(void); // Включить интерфейс UVW/ABZ. MT6701I2C_MODE_UVW_ABZ 161 | 162 | word getRawAngle(void); // Получить угол в чистом виде. 0 - 16383 163 | float getDegreesAngle(void); // Получить угол в градусах. 0.00 - 359.98 164 | float getRadiansAngle(void); // Получить угол в радианах. 0.00 - 6.28 165 | 166 | MT6701I2CConfigurationOutputType getConfigurationOutputType(void); // Получить тип конфигурации выходного интерфейса (только для корпуса QFN). MT6701I2_CONFIG_OUTPUT_TYPE_UVW, MT6701I2_CONFIG_OUTPUT_TYPE_A_B_Z 167 | void setConfigurationOutputTypeABZ(void); // Установить тип конфигурации выходного интерфейса -A-B-Z (только для корпуса QFN) 168 | bool setConfigurationOutputTypeABZVerify(void); // То же самое, но с подтверждением (только для корпуса QFN) 169 | void setConfigurationOutputTypeUVW(void); // Установить тип конфигурации выходного интерфейса UVW (только для корпуса QFN) 170 | bool setConfigurationOutputTypeUVWVerify(void); // То же самое, но с подтверждением (только для корпуса QFN) 171 | 172 | MT6701I2COutputType getOutputType(void); // Получить тип выходного интерфейса. MT6701I2_OUTPUT_TYPE_ABZ, MT6701I2_OUTPUT_TYPE_UVW 173 | void setOutputTypeABZ(void); // Установить тип выходного интерфейса ABZ 174 | bool setOutputTypeABZVerify(void); // То же самое, но с подтверждением 175 | void setOutputTypeUVW(void); // Установить тип выходного интерфейса UVW 176 | bool setOutputTypeUVWVerify(void); // То же самое, но с подтверждением 177 | 178 | MT6701I2CDirection getOutputRotationDirection(void); // Получить направление вращения. MT6701I2_DIRECTION_COUNTERCLOCKWISE, MT6701I2_DIRECTION_CLOCKWISE 179 | void setOutputRotationDirectionCounterclockwise(void); // Установить направление вращения против часовой 180 | bool setOutputRotationDirectionCounterclockwiseVerify(void); // То же самое, но с подтверждением 181 | void setOutputRotationDirectionClockwise(void); // Установить направление вращения по часовой 182 | bool setOutputRotationDirectionClockwiseVerify(void); // То же самое, но с подтверждением 183 | 184 | byte getOutputResolutionUVW(void); // Получить значение выходного разрешения в режиме UVW. 1 - 16 185 | void setOutputResolutionUVW(byte _resolution); // Установить значение выходного разрешения в режиме UVW. 1 - 16 186 | bool setOutputResolutionUVWVerify(byte _resolution); // То же самое, но с подтверждением 187 | 188 | word getOutputResolutionABZ(void); // Получить значение выходного разрешения в режиме ABZ. 1 - 1024 189 | void setOutputResolutionABZ(word _resolution); // Установить значение выходного разрешения в режиме ABZ. 1 - 1024 190 | bool setOutputResolutionABZVerify(word _resolution); // То же самое, но с подтверждением 191 | 192 | MT6701I2CZPulseWidth getZPulseWidth(void); // Получить значение ширины импульса на контакте Z в режиме ABZ. MT6701I2_Z_PULSE_WIDTH_1LSB, MT6701I2_Z_PULSE_WIDTH_2LSB, 193 | // MT6701I2_Z_PULSE_WIDTH_4LSB, MT6701I2_Z_PULSE_WIDTH_8LSB, MT6701I2_Z_PULSE_WIDTH_12LSB, MT6701I2_Z_PULSE_WIDTH_16LSB, MT6701I2_Z_PULSE_WIDTH_180DEG, MT6701I2_Z_PULSE_WIDTH_1LSB_2, 194 | void setZPulseWidth1LSB(void); // Установить ширину импульса 1LSB 195 | bool setZPulseWidth1LSBVerify(void); // То же самое, но с подтверждением 196 | void setZPulseWidth2LSB(void); // Установить ширину импульса 2LSB 197 | bool setZPulseWidth2LSBVerify(void); // То же самое, но с подтверждением 198 | void setZPulseWidth4LSB(void); // Установить ширрину импульса 4LSB 199 | bool setZPulseWidth4LSBVerify(void); // То же самое, но с подтверждением 200 | void setZPulseWidth8LSB(void); // Установить ширину импульса 8LSB 201 | bool setZPulseWidth8LSBVerify(void); // То же самое, но с подтверждением 202 | void setZPulseWidth12LSB(void); // Установить ширину импульса 12LSB 203 | bool setZPulseWidth12LSBVerify(void); // То же самое, но с подтверждением 204 | void setZPulseWidth16LSB(void); // Установить ширину импульса 16LSB 205 | bool setZPulseWidth16LSBVerify(void); // То же самое, но с подтверждением 206 | void setZPulseWidth180DEG(void); // Установить ширину импульса 180 градсуов 207 | bool setZPulseWidth180DEGVerify(void); // То же самое, но с подтверждением 208 | 209 | word getZeroDegreePositionData(void); // Получить значение нулевого положения. Смотреть таблицу в документации стр 28. 0x000 - 0xFFF 210 | void setZeroDegreePositionData(word _zero_position_data); // Установить значение нулевого положения. Смотреть таблицу в документации 211 | bool setZeroDegreePositionDataVerify(word _zero_position_data); // То же самое, но с подтверждением 212 | 213 | MT6701I2CFrequencyPWM getFrequencyPWM(void); // Получить значение частоты ШИМ. MT6701I2_PWM_FREQUENCY_9944, MT6701I2_PWM_FREQUENCY_4972 214 | void setFrequencyPWM9944(void); // Установить частоту ШИМ 994.4Гц 215 | bool setFrequencyPWM9944Verify(void); // То же самое, но с подтверждением 216 | void setFrequencyPWM4972(void); // Установить частоту ШИМ 497.2Гц 217 | bool setFrequencyPWM4972Verify(void); // То же самое, но с подтверждением 218 | 219 | MT6701I2CPolarityPWM getPolarityPWM(void); // Получить значение полярности ШИМ. MT6701I2_PWM_POLARITY_HIGH, MT6701I2_PWM_POLARITY_LOW 220 | void setPolarityPWMHigh(void); // Установить полярность ШИМ HIGH 221 | bool setPolarityPWMHighVerify(void); // То же самое, но с подтверждением 222 | void setPolarityPWMLow(void); // Установить полярность ШИМ LOW 223 | bool setPolarityPWMLowVerify(void); // То же самое, но с подтверждением 224 | 225 | MT6701I2COutputMode getOutputMode(void); // Получить режима выхода. MT6701I2_OUTPUT_MODE_ANALOG, MT6701I2_OUTPUT_MODE_PWM 226 | void setOutputModeAnalog(void); // Установить режим выхода Аналог 227 | bool setOutputModeAnalogVerify(void); // То же самое, но с подтверждением 228 | void setOutputModePWM(void); // Установить режим выхода ШИМ 229 | bool setOutputModePWMVerify(void); // То же самое, но с подтверждением 230 | }; 231 | --------------------------------------------------------------------------------