#include <SPI.h>
static const int CS_PIN = 10; // Chip Select pin for the MT6835
static const uint16_t CMD_READ = 0b0011000000000000;
static const uint16_t CMD_WRITE = 0b0110000000000000;
static const uint16_t CMD_EEPROM = 0b1100000000000000;
static const uint16_t REG_RES_HI = 0x0007;
static const uint16_t REG_RES_LO = 0x0008;
static const uint16_t RES_VALUE = 8191;
static const SPISettings settings6835(50000, MSBFIRST, SPI_MODE3);
void writeRegister8(uint16_t reg, uint8_t value)
{
Serial.print(reg | CMD_WRITE, HEX);
Serial.println(value, HEX);
SPI.beginTransaction(settings6835);
delay(1);
digitalWrite(CS_PIN, LOW);
SPI.transfer16(reg | CMD_WRITE);
SPI.transfer(value);
delay(1);
digitalWrite(CS_PIN, HIGH);
SPI.endTransaction();
}
uint8_t readRegister8(uint16_t reg)
{
Serial.print(reg | CMD_READ, HEX);
SPI.beginTransaction(settings6835);
digitalWrite(CS_PIN, LOW);
delay(1);
SPI.transfer16(reg | CMD_READ);
uint8_t val = SPI.transfer(0x00);
delay(1);
digitalWrite(CS_PIN, HIGH);
SPI.endTransaction();
Serial.println(val, HEX);
return val;
}
uint8_t writeToEeprom()
{
Serial.print(CMD_EEPROM, HEX);
SPI.beginTransaction(settings6835);
digitalWrite(CS_PIN, LOW);
delay(1);
SPI.transfer16(CMD_EEPROM);
uint8_t val = SPI.transfer(0x00);
delay(1);
digitalWrite(CS_PIN, HIGH);
SPI.endTransaction();
Serial.println(val, HEX);
return val == 0x55;
}
void setup()
{
uint8_t res_hi;
uint8_t res_lo;
uint16_t res;
// Initialize Serial (for debugging)
Serial.begin(115200);
while (!Serial) { }
Serial.println("Configuring MT6835");
pinMode(CS_PIN, OUTPUT);
digitalWrite(CS_PIN, HIGH);
// Initialize SPI
SPI.begin();
delay(100); // Allow some startup time for the MT6835
// Read current resolution value
res_hi = readRegister8(REG_RES_HI);
res_lo = readRegister8(REG_RES_LO);
res = (uint16_t)res_hi << 6;
res |= (uint16_t)res_lo >> 2;
Serial.print("Current resolution: ");
Serial.println(res, DEC);
delay(100);
if (res == RES_VALUE)
{
Serial.println("Values match - writing to EEPROM!");
writeToEeprom();
}
else
{
Serial.print("Setting resolution to ");
Serial.print(RES_VALUE, DEC);
Serial.println(" PPR...");
// Write new value to resolution registers
res_hi = (uint8_t)(RES_VALUE >> 6);
res_lo = (uint8_t)((RES_VALUE << 2) & 0xFC);
writeRegister8(REG_RES_HI, res_hi);
writeRegister8(REG_RES_LO, res_lo);
delay(100);
// Read current value again
res_hi = readRegister8(REG_RES_HI);
res_lo = readRegister8(REG_RES_LO);
res = (uint16_t)res_hi << 6;
res |= (uint16_t)res_lo >> 2;
Serial.print("Resolution readback: ");
Serial.println(res, DEC);
if (res == RES_VALUE)
{
Serial.println("Values match - writing to EEPROM!");
writeToEeprom();
}
}
SPI.end();
}
void loop()
{
// Your main code can read angle data or use the incremental outputs.
// For instance, to read the absolute angle from the sensor:
// (This is just a typical pattern; you must adjust for your sensor’s protocol.)
/*
uint16_t angleData = 0;
digitalWrite(CS_PIN, LOW);
// Send read command / address to read angle from sensor
SPI.transfer(0x02); // Example angle register (16-bit)
uint8_t highByte = SPI.transfer(0x00);
uint8_t lowByte = SPI.transfer(0x00);
digitalWrite(CS_PIN, HIGH);
angleData = (highByte << 8) | lowByte;
// angleData is now the raw angle, typically 0 to (2^N - 1) for N-bit resolution.
float angleDeg = ((float)angleData / 4096.0) * 360.0; // If 4096 counts per revolution
Serial.print("Angle: ");
Serial.print(angleDeg, 2);
Serial.println(" deg");
delay(250);
*/
}
Comments
0 B
|👍
/👎
0 B
|0 👍
/0 👎