thesis_bldc_controller/Examples/Arduino/a1335_example/a1335_example.ino

145 lines
3.4 KiB
C++

#include <Arduino.h>
#include <SPI.h>
#include "A1335.h"
#define kNOERROR 0
#define kPRIMARYREADERROR 1
#define kEXTENDEDREADTIMEOUTERROR 2
#define kPRIMARYWRITEERROR 3
#define kEXTENDEDWRITETIMEOUTERROR 4
#define kCRCERROR 5
#define kUNABLETOCHANGEPROCESSORSTATE 6
const uint16_t ChipSelectPin = 5;
const uint16_t LEDPin = 13;
const uint32_t WRITE = 0x40;
const uint32_t READ = 0x00;
const uint32_t COMMAND_MASK = 0xC0;
const uint32_t ADDRESS_MASK = 0x3F;
unsigned long nextTime;
bool ledOn = false;
bool includeCRC = false;
void setup() {
uint16_t unused;
uint32_t flags;
uint16_t angle;
uint32_t flagsAndZeroOffset;
SPI.begin();
// put your setup code here, to run once:
Serial.begin(19200);
while (!Serial);
pinMode(SS, OUTPUT);
digitalWrite(SS, HIGH);
// Make sure all of the SPI pins are
// ready by doing a read
//PrimaryRead(ChipSelectPin, 0x0, unused);
// Unlock the device
ExtendedWrite(ChipSelectPin, 0xFFFE, 0x27811F77);
// Make sure the device is unlocked
ExtendedRead(ChipSelectPin, 0x22, flags);
if (!((flags & 0x0022) == 0x0020))
{
Serial.println("Device is not Unlocked");
}
// Zero the angle
// Extended location 0x06 contains flags in the MSW and the Zero Angle values in the LSW
// so get both and zero out ZeroAngle
ExtendedRead(ChipSelectPin, 0x06, flagsAndZeroOffset);
flagsAndZeroOffset = (flagsAndZeroOffset & 0xFFFF0000);
ExtendedWrite(ChipSelectPin, 0x06, flagsAndZeroOffset);
// Get the current angle. It is now without the ZeroAngle correction
PrimaryRead(ChipSelectPin, 0x20, angle);
// Copy the read angle into location 0x5C preserving the flags
flagsAndZeroOffset = (flagsAndZeroOffset & 0xFFFF0000) | ((angle << 4) & 0x0000FFFF);
ExtendedWrite(ChipSelectPin, 0x06, flagsAndZeroOffset);
/* uint16_t angle_read;
Serial.println("Init Complete");
PrimaryRead(ChipSelectPin, 0x20, angle_read);
Serial.print("Angle= ");
Serial.println(angle_read); */
}
void loop() {
uint16_t angle;
uint16_t temperature;
uint16_t fieldStrength;
// Every second, read the angle, temperature and field strength
if (nextTime < millis())
{
if (PrimaryRead(ChipSelectPin, 0x20, angle) == kNOERROR)
{
if (CalculateParity(angle))
{
Serial.print("Angle = ");
Serial.print((float)(angle & 0x0FFF) * 360.0 / 4096.0);
Serial.println(" Degrees");
}
else
{
Serial.println("Parity error on Angle read");
}
}
else
{
Serial.println("Unable to read Angle");
}
if (PrimaryRead(ChipSelectPin, 0x28, temperature) == kNOERROR)
{
Serial.print("Temperature = ");
Serial.print(((float)(temperature & 0x0FFF) / 8.0) - 273.15);
Serial.println(" C");
}
else
{
Serial.println("Unable to read Temperature");
}
if (PrimaryRead(ChipSelectPin, 0x2A, fieldStrength) == kNOERROR)
{
Serial.print("Field Strength = ");
Serial.print(fieldStrength & 0x0FFF);
Serial.println(" Gauss");
}
else
{
Serial.println("Unable to read Field Strength");
}
nextTime = millis() + 500L;
// Blink the LED every half second
if (ledOn)
{
digitalWrite(LEDPin, LOW);
ledOn = false;
}
else
{
digitalWrite(LEDPin, HIGH);
ledOn = true;
}
}
}
}