Hi!, i’ve been working with the TLE5012B sensor and library from the manufacture for arduino (TLE5012B - Arduino Reference).
I just follow the doc about supporting new sensor, i create the . h file and cpp file but when i initialize the motor.init(), it crashes and stop working or just restart.
I guess there is an compatibility issue between the TLE5012B library and FOC lib.
Here is the h file:
#include "Arduino.h"
#include <SimpleFOC.h>
class MySensor: public Sensor{
public:
MySensor();
// initialize the sensor hardware
void init();
// Get current shaft angle from the sensor hardware, and
// return it as a float in radians, in the range 0 to 2PI.
// - This method is pure virtual and must be implemented in subclasses.
// Calling this method directly does not update the base-class internal fields.
// Use update() when calling from outside code.
float getSensorAngle();
};
and here the cpp file:
#ifndef MySensor_h
#define MySensor_h
#include <TLE5012-ino.hpp>
#include "MySensor.h"
Tle5012Ino Tle5012Sensor = Tle5012Ino();
errorTypes checkError = NO_ERROR;
extern double d;
MySensor::MySensor(){
}
void MySensor::init(){
checkError = Tle5012Sensor.begin();
}
float MySensor::getSensorAngle(){
Tle5012Sensor.getAngleValue(d);
d = (d + 180);
if ( d + 40.9 > 360 ) {
d = (d + 40.9) - 360;
}
else
d = d + 40.9;
d = d * 0.0174533;
return d;
}
#endif
I must admit I am not sure what is the problem from your description.
The TLE5012 is not directly supported by SimpleFOC, but it looks like you are taking the right kind of steps to get it supported.
I have some TLE5012 boards here waiting to be tested, I will try to get to this over Christmas and create an “official” driver for them if I can get them working.
In the meantime, if you could monitor the SSI communication using a logic analyser or digital oscilloscope, you might find more information to help you debug the problem.
Great @runger !!, i’ve tested this sensor with the stand alone library from infineon and works great, that’s the reason i want to use this sensor with your nice library, i guess the problem is with some clocks/timers initialization within both libraries… maybe at the time FOC configure the timers /clocks the TLE library just cant comunnicate with the sensor may be too fast or too slow…
I will analyze with the osciloscope SPI lines and post the results using FOC and not using it.
#include <SimpleFOC.h>
#include <TLE5012-ino.hpp>
Tle5012Ino Tle5012Sensor = Tle5012Ino();
errorTypes checkError = NO_ERROR;
float readMySensor(){
// read my sensor
// return the angle value in radians in between 0 and 2PI
Tle5012Sensor.getAngleValue(d);
d = (d + 180);
if ( d + 40.9 > 360 ) {
d = (d + 40.9) - 360;
}
else
d = d + 40.9;
d = d * 0.0174533;
return d;
}
void initMySensor(){
// do the init
checkError = Tle5012Sensor.begin();
}
// empty constructor
GenericSensor sensor = GenericSensor(readMySensor, initMySensor);
void setup(){
...
//init sensor and use it further with foc...
sensor.init();
....
}
Hey, actually I have it in front of me right now, I was working on it the last few days.
I have based my solution on this code here:
which was written by another member of this forum.
I’m trying to make it more general, i.e. not use hard-coded pins and SPI instance.
However, this code I’m extending is specific to STM32 MCUs. The library you’re using is for AVR and InfineonXMC…
The problem is that this sensor uses half duplex SPI, an uncommon thing that is not implemented in Arduino framework. So you have to speak to the sensor “outside of” Arduino framework. The Infineon library certainly looks like a comprehensive implementation… they provide a cross-platform SPI3w abstraction to fit Arduino’s concept. :-/ perhaps a bit overkill just for reading the sensor, and its hard to see what’s going on exactly. It looks like they might be using timers.
Which MCU are you using? If you’re on one of the supported architectures, I think Antun’s suggestion is a very good one.
If you’re on STM32, I might have a solution for you in a few days, but no guarantees, its not working for me yet
So, for STM32, I have it working. Its just an initial implementation, you can currently find it here:
For the moment, you could copy the classes to your project if you want to try it out. In the next weeks we’ll probably manage a proper release, but for now it is on this branch in git.
I’ll try to give it some more time in the next weeks, I’d like to get the velocity register working to compare that with the computed velocity we normally use…