Hello again
I tried another sketch and have the same result. Can be a encoders problem. I see it lost ticks when it reach at this speed. It doesn't matter if I wanna read 4096 ticks per revolution or 1024. In the first case I use the code posted in the previous post, and in the second only an interrups reading the rising of the channel A. Here is the second code(the numbers in the loop are in accordance to coil position):
inline void digitalWriteDirect(int pin, boolean val){
if(val) g_APinDescription[pin].pPort -> PIO_SODR = g_APinDescription[pin].ulPin;
else g_APinDescription[pin].pPort -> PIO_CODR = g_APinDescription[pin].ulPin;
}
inline int digitalReadDirect(int pin){
return !!(g_APinDescription[pin].pPort -> PIO_PDSR & g_APinDescription[pin].ulPin);
}
const int a = 2;
const int z = 10;
volatile int tick=1;
volatile int ticklect=1;
void setup() {
pinMode(33, OUTPUT);
pinMode(31, OUTPUT);
pinMode(35, OUTPUT);
digitalWrite(31, LOW);
digitalWrite(35, LOW);
digitalWrite(33, LOW);
pinMode(a, INPUT);
pinMode(z, INPUT);
digitalWrite(a, LOW);
digitalWrite(z, LOW);
attachInterrupt(z, zrising, RISING);
attachInterrupt(a, acount, RISING);
}
void loop() {
for (tick==5; tick<23; tick=ticklect){
digitalWriteDirect(33, LOW);
digitalWriteDirect(31, LOW);
digitalWriteDirect(35, HIGH);
}
for (tick==33; tick<52; tick=ticklect){
digitalWriteDirect(35, LOW);
digitalWriteDirect(31, LOW);
digitalWriteDirect(33, HIGH);
}
for (tick==61; tick<81; tick=ticklect){
digitalWriteDirect(35, LOW);
digitalWriteDirect(33, LOW);
digitalWriteDirect(31, HIGH);
}
for (tick==91; tick<109; tick=ticklect){
digitalWriteDirect(33, LOW);
digitalWriteDirect(31, LOW);
digitalWriteDirect(35, HIGH);
}
for (tick==119; tick<138; tick=ticklect){
digitalWriteDirect(35, LOW);
digitalWriteDirect(31, LOW);
digitalWriteDirect(33, HIGH);
}
for (tick==147; tick<164; tick=ticklect){
digitalWriteDirect(35, LOW);
digitalWriteDirect(33, LOW);
digitalWriteDirect(31, HIGH);
}
for (tick==175; tick<195; tick=ticklect){
digitalWriteDirect(33, LOW);
digitalWriteDirect(31, LOW);
digitalWriteDirect(35, HIGH);
}
for (tick==204; tick<223; tick=ticklect){
digitalWriteDirect(35, LOW);
digitalWriteDirect(31, LOW);
digitalWriteDirect(33, HIGH);
}
for (tick==232; tick<252; tick=ticklect){
digitalWriteDirect(35, LOW);
digitalWriteDirect(33, LOW);
digitalWriteDirect(31, HIGH);
}
if (ticklect==256){
ticklect=1;
tick=1;
}
}
void zrising() {
ticklect=1;
}
void acount(){
ticklect++;
}
The both codes gives the same speed.
I think the calculation is correct because it start so fast but when arrive at 100-120RPM don't speed up more, and the counter starts to lose tics.
A encoder can seem ok when driving it by hand, but count wrong when it speeds up?
I'm little suprised because it seems that the due can handle this code more than easy. Some suggestion?