JCalvert

MT6835 resolution

Mar 19th, 2025 (edited)
794
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.82 KB | None | 0 0
  1. #include <SPI.h>
  2.  
  3. static const int CS_PIN = 10;   // Chip Select pin for the MT6835
  4. static const uint16_t CMD_READ    = 0b0011000000000000;
  5. static const uint16_t CMD_WRITE   = 0b0110000000000000;
  6. static const uint16_t CMD_EEPROM  = 0b1100000000000000;
  7. static const uint16_t REG_RES_HI = 0x0007;
  8. static const uint16_t REG_RES_LO = 0x0008;
  9. static const uint16_t RES_VALUE = 8191;
  10. static const SPISettings settings6835(50000, MSBFIRST, SPI_MODE3);
  11.  
  12. void writeRegister8(uint16_t reg, uint8_t value)
  13. {
  14.   Serial.print(reg | CMD_WRITE, HEX);
  15.   Serial.println(value, HEX);
  16.   SPI.beginTransaction(settings6835);
  17.   delay(1);
  18.   digitalWrite(CS_PIN, LOW);
  19.   SPI.transfer16(reg | CMD_WRITE);
  20.   SPI.transfer(value);
  21.   delay(1);
  22.   digitalWrite(CS_PIN, HIGH);
  23.   SPI.endTransaction();
  24. }
  25.  
  26. uint8_t readRegister8(uint16_t reg)
  27. {
  28.   Serial.print(reg | CMD_READ, HEX);
  29.   SPI.beginTransaction(settings6835);
  30.   digitalWrite(CS_PIN, LOW);
  31.   delay(1);
  32.   SPI.transfer16(reg | CMD_READ);
  33.   uint8_t val = SPI.transfer(0x00);
  34.   delay(1);
  35.   digitalWrite(CS_PIN, HIGH);
  36.   SPI.endTransaction();
  37.   Serial.println(val, HEX);
  38.   return val;
  39. }
  40.  
  41. uint8_t writeToEeprom()
  42. {
  43.   Serial.print(CMD_EEPROM, HEX);
  44.   SPI.beginTransaction(settings6835);
  45.   digitalWrite(CS_PIN, LOW);
  46.   delay(1);
  47.   SPI.transfer16(CMD_EEPROM);
  48.   uint8_t val = SPI.transfer(0x00);
  49.   delay(1);
  50.   digitalWrite(CS_PIN, HIGH);
  51.   SPI.endTransaction();
  52.   Serial.println(val, HEX);
  53.   return val == 0x55;
  54. }
  55.  
  56. void setup()
  57. {
  58.   uint8_t res_hi;
  59.   uint8_t res_lo;
  60.   uint16_t res;
  61.   // Initialize Serial (for debugging)
  62.   Serial.begin(115200);
  63.   while (!Serial) { }
  64.   Serial.println("Configuring MT6835");
  65.  
  66.   pinMode(CS_PIN, OUTPUT);
  67.   digitalWrite(CS_PIN, HIGH);
  68.  
  69.   // Initialize SPI
  70.   SPI.begin();
  71.  
  72.   delay(100);  // Allow some startup time for the MT6835
  73.  
  74.   // Read current resolution value
  75.   res_hi = readRegister8(REG_RES_HI);
  76.   res_lo = readRegister8(REG_RES_LO);
  77.   res = (uint16_t)res_hi << 6;
  78.   res |= (uint16_t)res_lo >> 2;
  79.   Serial.print("Current resolution: ");
  80.   Serial.println(res, DEC);
  81.  
  82.   delay(100);
  83.  
  84.   if (res == RES_VALUE)
  85.   {
  86.     Serial.println("Values match - writing to EEPROM!");
  87.     writeToEeprom();
  88.   }
  89.   else
  90.   {
  91.     Serial.print("Setting resolution to ");
  92.     Serial.print(RES_VALUE, DEC);
  93.     Serial.println(" PPR...");
  94.     // Write new value to resolution registers
  95.     res_hi = (uint8_t)(RES_VALUE >> 6);
  96.     res_lo = (uint8_t)((RES_VALUE << 2) & 0xFC);
  97.     writeRegister8(REG_RES_HI, res_hi);
  98.     writeRegister8(REG_RES_LO, res_lo);
  99.  
  100.     delay(100);
  101.  
  102.     // Read current value again
  103.     res_hi = readRegister8(REG_RES_HI);
  104.     res_lo = readRegister8(REG_RES_LO);
  105.     res = (uint16_t)res_hi << 6;
  106.     res |= (uint16_t)res_lo >> 2;
  107.     Serial.print("Resolution readback: ");
  108.     Serial.println(res, DEC);
  109.  
  110.     if (res == RES_VALUE)
  111.     {
  112.       Serial.println("Values match - writing to EEPROM!");
  113.       writeToEeprom();
  114.     }
  115.   }
  116.  
  117.   SPI.end();
  118. }
  119.  
  120. void loop()
  121. {
  122.   // Your main code can read angle data or use the incremental outputs.
  123.   // For instance, to read the absolute angle from the sensor:
  124.   // (This is just a typical pattern; you must adjust for your sensor’s protocol.)
  125.   /*
  126.     uint16_t angleData = 0;
  127.     digitalWrite(CS_PIN, LOW);
  128.  
  129.     // Send read command / address to read angle from sensor
  130.     SPI.transfer(0x02);  // Example angle register (16-bit)
  131.    
  132.     uint8_t highByte = SPI.transfer(0x00);
  133.     uint8_t lowByte  = SPI.transfer(0x00);
  134.  
  135.     digitalWrite(CS_PIN, HIGH);
  136.  
  137.     angleData = (highByte << 8) | lowByte;
  138.     // angleData is now the raw angle, typically 0 to (2^N - 1) for N-bit resolution.
  139.  
  140.     float angleDeg = ((float)angleData / 4096.0) * 360.0; // If 4096 counts per revolution
  141.     Serial.print("Angle: ");
  142.     Serial.print(angleDeg, 2);
  143.     Serial.println(" deg");
  144.  
  145.     delay(250);
  146.   */
  147. }
  148.  
Advertisement