Problems with FTM to generate XY2_100 Signals

Hello,
for my Project i need to generate XY2_100 Signals to control a laser galvanometer.
I found this library on github wich should do what i need:
https://github.com/Tuet/XY2_100
Sadly i cant get it to work on my Teensy LC.
Im using the Arduino IDE version 1.8.19 with Teensyduino version 1.56 to compile the code and Programm the Teensy.

The problem i have is that i cant even get the example "BasisTest" from the library to work.
It seems that there is a problem with the timer.
Since with the default frequency of 4MHz defined in the XY2_100.cpp line 67 no signals are being generated by the Teensy.
The probelm for that seems to be that the Programm "stops/hangs" while doing the function setXY() wich is called in the BasicTest during the Setup.
Because if i turn on the LED on the Teensy after the function is done it stays off.
But the Programm still completes the ISR after the DMA is done, this can be verified by the toggle of Pin 9, wich is commented out by default at the start and end of the ISR.
This Pin toggles at a frequency of around 500KHz during my tests, for a frequency value of 4MHz.

IF you lower the Frequency in the XY2_100.cpp line 67 to a value of 20, the Programm "works".
That meaning differential signals are beeing generated. But the clock signal has a frequency of 590Hz.
IF the frequency value is 10 the clock frequency is 1,5kHz.

For a frequency value of 20 the galvanometer reacts to the signals but instead of a rectangle it just results in the laser jumping between multiple positions.
The intended frequency for this protocol is 2Mhz, this could be the reason for not generating a rectangle.
Also if the delay between setSignedXY() calls is 100ms or bigger the programm stops working again, wich is weird.
Does anyone have any idea why the library/programm acts this way and how to fix it.
I have attached the nessesary files but all of them except the XY2_100 protocol pdf can be found in the GitHub repo with more information.

Thanks
Der_Frosti

edit:
I have done more testing and with this code i can kind of control the galvo.
Code:
#include <XY2_100.h>
XY2_100 galvo;

void setup() {
  pinMode(13, OUTPUT);
  galvo.begin();
  galvo.setXY(0,0);
  digitalWriteFast(13, HIGH);
}//65530

void loop() {
  static int32_t max_ = 65530, min_ = 22;
  const uint16_t pause = 15;
  galvo.setXY(min_, min_);
  delay(pause);
  galvo.setXY(min_, max_);
  delay(pause);
  galvo.setXY(max_, max_);
  delay(pause);
  galvo.setXY(max_, min_);
  delay(pause);
}

The frequency in the library is still set to 20.
and the pause value has to be somewhere between 10 and 20.
Also not all values for setXY() work, for example with 10 and 51 as small values the galvo stays still.
But this code controls the laser in 4 different positions, but these have a variance and are not fixed.

So it is still not usable for me and im still confusedwhat even is going on.

Also to add, i can control the Galvo over and external control board and Programm, so i have verified the correct functionality of the scanner.
And i have analyzed the Signal produced by the external control board, and it uses a 2MHz clock and all works fine with it.
 

Attachments

  • XY2_100.h
    1.8 KB · Views: 20
  • XY2_100.cpp
    6.5 KB · Views: 15
  • BasicTest.ino
    1.8 KB · Views: 14
  • Documents_TD_XY2-100_R0703.pdf
    115 KB · Views: 16
Last edited:
Back
Top