Remora - ethernet NVEM / EC300 / EC500 cnc board
- frayja2002
- Offline
- Premium Member
-
Less
More
- Posts: 159
- Thank you received: 13
28 Feb 2026 12:27 #343649
by frayja2002
Replied by frayja2002 on topic Remora - ethernet NVEM / EC300 / EC500 cnc board
Hi all
I was thinking to add a diode laser (10w 450nm style) to my cnc.
I have an EC500 box and the laser is driven with a 5v pwm signal.
How can I setup a PWM output. I did a lot of reading but didn't really find a good answer.
Which pins are capable of outputting a PWM signal.
If anyone has some example config they could share or if they could point me in the right direction I would appreciate it.
Thanks
Alex
I was thinking to add a diode laser (10w 450nm style) to my cnc.
I have an EC500 box and the laser is driven with a 5v pwm signal.
How can I setup a PWM output. I did a lot of reading but didn't really find a good answer.
Which pins are capable of outputting a PWM signal.
If anyone has some example config they could share or if they could point me in the right direction I would appreciate it.
Thanks
Alex
Please Log in or Create an account to join the conversation.
- Felsenbart
- Offline
- New Member
-
Less
More
- Posts: 3
- Thank you received: 0
28 Feb 2026 20:28 - 28 Feb 2026 23:06 #343668
by Felsenbart
Replied by Felsenbart on topic Remora - ethernet NVEM / EC300 / EC500 cnc board
For several days now I’ve been getting the error “Motor 0 position error” whenever I try to move Motor 0 (X-axis). At the moment, only this motor is connected.The setup uses a DM556Y driver with a NEMA 23 motor.
I’ve attached the .hal and .ini files.
I hope someone can help me figure this out.
thanks everyone
[/code][/code]
I’ve attached the .hal and .ini files.
I hope someone can help me figure this out.
thanks everyone
[/code][/code]
Attachments:
Last edit: 28 Feb 2026 23:06 by Felsenbart.
Please Log in or Create an account to join the conversation.
- Jaragua
- Offline
- New Member
-
Less
More
- Posts: 2
- Thank you received: 0
15 Mar 2026 23:50 #344327
by Jaragua
Replied by Jaragua on topic Remora - ethernet NVEM / EC300 / EC500 cnc board
Também estou com o mesmo problema.aparentemente precisa editar o arquivo .hal no LinuxCNC. Conseguiu resolver?
Please Log in or Create an account to join the conversation.
- tommylight
-
- Away
- Moderator
-
Less
More
- Posts: 21594
- Thank you received: 7374
16 Mar 2026 00:27 #344329
by tommylight
Replied by tommylight on topic Remora - ethernet NVEM / EC300 / EC500 cnc board
Did you try to lower the jog velocity to something really slow and jog?
Please Log in or Create an account to join the conversation.
- Felsenbart
- Offline
- New Member
-
Less
More
- Posts: 3
- Thank you received: 0
21 Mar 2026 17:08 #344579
by Felsenbart
Replied by Felsenbart on topic Remora - ethernet NVEM / EC300 / EC500 cnc board
I get it to work finally. Idk what im doing wrong. After flashing newest beta its working
Please Log in or Create an account to join the conversation.
- Felsenbart
- Offline
- New Member
-
Less
More
- Posts: 3
- Thank you received: 0
21 Mar 2026 17:12 #344580
by Felsenbart
Replied by Felsenbart on topic Remora - ethernet NVEM / EC300 / EC500 cnc board
Which version of Remora did you flash? Luckily, it worked with the latest beta. I've attached some files that work for me. Would you also like the pinout for the DM556Y drivers for the EC500?
Please Log in or Create an account to join the conversation.
- BIBIGUL
- Offline
- New Member
-
Less
More
- Posts: 9
- Thank you received: 0
19 Apr 2026 13:17 - 19 Apr 2026 13:31 #345733
by BIBIGUL
You're thinking along the right lines, and this can definitely be improved.
Interrupts break determinism and can introduce jitter into the system. The jitter might be small, but it's still there because the core has to stop processing, handle the ISR, and then resume the program.
We need to get rid of interrupts entirely for this.
Configure the timer like this:
TIM4->SMCR = (TIM_SMCR_SMS_0 | TIM_SMCR_SMS_1); // ENCODER MODE (TI1 & TI2)
TIM4->DIER = 0; // NO INTERRUPTS
TIM4->CCMR1 = (TIM_CCMR1_CC1S_0 | // (CH-A) CC1S = 01 (TI1FP1 --> TI1). CH1
TIM_CCMR1_IC1F | // F SAMPLING. CH1
TIM_CCMR1_CC2S_0 | // (CH-
CC2S = 01 (TI2FP2 --> TI2). CH2
TIM_CCMR1_IC2F); // F SAMPLING. CH2
TIM4->CCMR2 = (TIM_CCMR2_CC3S_0 | // (CH-Z) CC3S = 01 (TI2FP3 --> TI3). CH3
TIM_CCMR2_IC3F); // F SAMPLING. CH3
TIM4->CCER |= TIM_CCER_CC3E; // Capture/Compare enable CH3
TIM4->PSC = 0; // PRESCALER = 0
TIM4->ARR = 0xFFFF; // 65535
The timer will operate as an encoder counter (Channels 1 & 2) and **simultaneously** Channel 3 will be configured for **Input Capture mode**. The Index pulse (Z-channel) is connected to Channel 3.
**What do we get from this?**
* `TIM4->CNT`: The current raw encoder count.
* `TIM4->CCR3`: The **exact hardware state** of `CNT` latched at the moment of the rising or falling edge of the Index pulse.
This gives us an extremely accurate hardware snapshot of the counter at the exact moment the index pulse occurs.
**Next Steps:**
We just need to extend the communication protocol and send both `CNT` and `CCR3` for each encoder.
Then, on the **LinuxCNC side**, `CCR3` should be processed similarly to how the Mesa driver handles `CNT`.
When Motion sets `index_enable` in the driver, we simply do:
if(CCR3 != CCR3_prev) {
// HURRAY, THIS IS THE TRUE INDEX!
// Now we can correct the raw counter based on the current CCR3 value.
}
Result: We get precise index homing without needing to send an `index_enable` request down to the STM32. Everything is handled cleanly on the LinuxCNC side.
Hope that makes sense.
Replied by BIBIGUL on topic Remora - ethernet NVEM / EC300 / EC500 cnc board
"tuxcnc" I feel like when I calling Microsoft customer's support... "We dont know what is your problem, but it works with us..." I know how Linuxcnc does the threading, and know why it is acceptable with LPT and not acceptable with devices using ethernet link. LPT uses base_thread, ethernet uses servo_thread, so LPT can be ten times faster. I told you few posts ago, the servo_thread=1000000 (1 ms period) can make delay that can produce 18 degrees positon error at spindle rotates 3000 rpm. 3000 rpm => 50 rps => 20 ms per revolution. It is mathematics, everyone can make this calculations. The solution is not send the extended index in hope the Linuxcnc see it, and resets position to zero when received it. The solution is send raw_count latched at every real encoder's index edge. We can restore encoder's index (if we need) from (old != new) at the component. And we can reset position not to zero, but to real position captured at index edge. We can be confused, because we use "index" word for different meanings (encoder's output, program variable, hal pin) but we can not change this. Detailed explanation: Let's assume the encoder's index edge occurs at 1000 raw_counts. Time goes, counter counts A/B signals. The component requests data. At this moment raw_counts is 1050. We send both values, counted and latched. The component knows, the index was 50 counts ago and sets position to 50/scale not to zero. (of course only when hal index_enable pin is set) What don't you understand?You're thinking along the right lines, and this can definitely be improved.
Interrupts break determinism and can introduce jitter into the system. The jitter might be small, but it's still there because the core has to stop processing, handle the ISR, and then resume the program.
We need to get rid of interrupts entirely for this.
Configure the timer like this:
TIM4->SMCR = (TIM_SMCR_SMS_0 | TIM_SMCR_SMS_1); // ENCODER MODE (TI1 & TI2)
TIM4->DIER = 0; // NO INTERRUPTS
TIM4->CCMR1 = (TIM_CCMR1_CC1S_0 | // (CH-A) CC1S = 01 (TI1FP1 --> TI1). CH1
TIM_CCMR1_IC1F | // F SAMPLING. CH1
TIM_CCMR1_CC2S_0 | // (CH-
TIM_CCMR1_IC2F); // F SAMPLING. CH2
TIM4->CCMR2 = (TIM_CCMR2_CC3S_0 | // (CH-Z) CC3S = 01 (TI2FP3 --> TI3). CH3
TIM_CCMR2_IC3F); // F SAMPLING. CH3
TIM4->CCER |= TIM_CCER_CC3E; // Capture/Compare enable CH3
TIM4->PSC = 0; // PRESCALER = 0
TIM4->ARR = 0xFFFF; // 65535
The timer will operate as an encoder counter (Channels 1 & 2) and **simultaneously** Channel 3 will be configured for **Input Capture mode**. The Index pulse (Z-channel) is connected to Channel 3.
**What do we get from this?**
* `TIM4->CNT`: The current raw encoder count.
* `TIM4->CCR3`: The **exact hardware state** of `CNT` latched at the moment of the rising or falling edge of the Index pulse.
This gives us an extremely accurate hardware snapshot of the counter at the exact moment the index pulse occurs.
**Next Steps:**
We just need to extend the communication protocol and send both `CNT` and `CCR3` for each encoder.
Then, on the **LinuxCNC side**, `CCR3` should be processed similarly to how the Mesa driver handles `CNT`.
When Motion sets `index_enable` in the driver, we simply do:
if(CCR3 != CCR3_prev) {
// HURRAY, THIS IS THE TRUE INDEX!
// Now we can correct the raw counter based on the current CCR3 value.
}
Result: We get precise index homing without needing to send an `index_enable` request down to the STM32. Everything is handled cleanly on the LinuxCNC side.
Hope that makes sense.
Last edit: 19 Apr 2026 13:31 by BIBIGUL.
Please Log in or Create an account to join the conversation.
- BIBIGUL
- Offline
- New Member
-
Less
More
- Posts: 9
- Thank you received: 0
19 Apr 2026 21:26 #345747
by BIBIGUL
Replied by BIBIGUL on topic Remora - ethernet NVEM / EC300 / EC500 cnc board
I have a few questions regarding the Remora ETH source code. I understand it's built on the lwIP stack.
Does lwIP significantly impact the servo cycle timing? Does it cause noticeable lag/jitter?
Has anyone attempted to implement their own custom stack with Zero-Copy support? I suspect this would yield a decent performance improvement.
How is the time domain problem solved between the PC's servo cycle and the STM32's time domain? Or does the system simply operate in a fast response mode — processing commands immediately upon arrival from the PC?
If the time domain mismatch isn't handled properly, you simply cannot achieve precise velocity and acceleration control, especially when dealing with position feedback from the encoder.
Thanks.
Does lwIP significantly impact the servo cycle timing? Does it cause noticeable lag/jitter?
Has anyone attempted to implement their own custom stack with Zero-Copy support? I suspect this would yield a decent performance improvement.
How is the time domain problem solved between the PC's servo cycle and the STM32's time domain? Or does the system simply operate in a fast response mode — processing commands immediately upon arrival from the PC?
If the time domain mismatch isn't handled properly, you simply cannot achieve precise velocity and acceleration control, especially when dealing with position feedback from the encoder.
Thanks.
Please Log in or Create an account to join the conversation.
- jtrantow
- Offline
- Premium Member
-
Less
More
- Posts: 145
- Thank you received: 25
20 Apr 2026 01:21 #345750
by jtrantow
Replied by jtrantow on topic Remora - ethernet NVEM / EC300 / EC500 cnc board
I have a working laser config at github.com/JTrantow/configs/tree/main/router3 This directory also works as router so look at laser.hal and laser.ini.
motion.analog-out-00 is the laser output pin from the gcode. I use a mesa card with pwm but I've also used the linux pwm with no problems.
If you use F360 the following post processor will work for simple laser cuts and is compatible with lightburn generated gcode.
github.com/JTrantow/LinuxCNC-F360-Cutting-Post-Processor
motion.analog-out-00 is the laser output pin from the gcode. I use a mesa card with pwm but I've also used the linux pwm with no problems.
If you use F360 the following post processor will work for simple laser cuts and is compatible with lightburn generated gcode.
github.com/JTrantow/LinuxCNC-F360-Cutting-Post-Processor
Please Log in or Create an account to join the conversation.
- nighteagle
- Offline
- Premium Member
-
Less
More
- Posts: 80
- Thank you received: 8
25 Apr 2026 11:33 - 27 Apr 2026 11:59 #345912
by nighteagle
Replied by nighteagle on topic Remora - ethernet NVEM / EC300 / EC500 cnc board
Hello,
I'm trying to connect a Novusun NVEM with an STM32F207 CPU to LinuxCNC on a small PC (not a Raspberry Pi) for a mini lathe – just the X and Z axes, no limit switches, etc. Very simple.
I'm using just two TB6600 stepper drivers with 1.8 degree and 1.8A stepper motors, connected according to the many wiring diagrams I've found online.
So, Pulse+ and Dir+ are connected together to COM+ on the NVEM, and then Pulse- and Dir- are connected to the corresponding NVEM pins.
Everything is powered with 24V, including the stepper drivers and the NVEM.
All the LEDs are lit, so everything is receiving power.
What I've done so far:
1. Installed LinuxCNC on the PC
2. Flashed the Remora firmware for the NVEM
>> Source DOC: remora-docs.readthedocs.io/en/latest/har...ml#controller-boards
>> Firmware for STM32F207:
3. LinuxCNC Ethernet configured on 10.10.10.100/24
>> Ping to the NVEM is running
4. As per the source DOC, the following steps were performed to get Remora from GitHub onto the PC:
>> I noticed that some things were missing, including the basic configuration file "remora-nvem-basic" and the component file "Remora-nv".
I then copied these files to the appropriate folders on my PC.
5. Installing the components with halcompile:
>> It was noticed that "Remora-nv" was missing, so I installed it again:
6. I copied the example configurations into the LinuxCNC folder, along with "remora-nvem-basic".
>> After starting LinuxCNC, I can select various Remora configurations to start.
7. Uploading the configuration to the NVEM - for this, I had to install TFTP:
- via a workaround involving the installation of pip3, etc., since some things are not installed by default in LinuxCNC.
>> When I run the upload script, I'm in the same folder as the simple config.txt file from "remora-nvem-basic":
>> This seems to be working so far.
8. Starting LinuxCNC and selecting NVEM Basic, which should match the Config.txt file. Everything starts without an error message.
I can move the axis - looks like i can get further to calibrate steppers and other stuff.
Now i look for the correct way to adapt inputs in my hal.
Hope other people will help this to bring the NVEM to live with LinuxCNC.
Regards,
I'm trying to connect a Novusun NVEM with an STM32F207 CPU to LinuxCNC on a small PC (not a Raspberry Pi) for a mini lathe – just the X and Z axes, no limit switches, etc. Very simple.
I'm using just two TB6600 stepper drivers with 1.8 degree and 1.8A stepper motors, connected according to the many wiring diagrams I've found online.
So, Pulse+ and Dir+ are connected together to COM+ on the NVEM, and then Pulse- and Dir- are connected to the corresponding NVEM pins.
Everything is powered with 24V, including the stepper drivers and the NVEM.
All the LEDs are lit, so everything is receiving power.
What I've done so far:
1. Installed LinuxCNC on the PC
2. Flashed the Remora firmware for the NVEM
>> Source DOC: remora-docs.readthedocs.io/en/latest/har...ml#controller-boards
>> Firmware for STM32F207:
https://github.com/scottalford75/Remora-NVEM/blob/main/Remora-NVEM-STM32/Release/Remora-NVEM.bin3. LinuxCNC Ethernet configured on 10.10.10.100/24
>> Ping to the NVEM is running
4. As per the source DOC, the following steps were performed to get Remora from GitHub onto the PC:
pi@raspberry:~ $ mkdir ~/linuxcncpi@raspberry:~ $ cd ~/linuxcncpi@raspberry:~ $ git clone https://github.com/scottalford75/Remorapi@raspberry:~ $ cd Remora/LinuxCNC/ComponentsI then copied these files to the appropriate folders on my PC.
5. Installing the components with halcompile:
pi@raspberry:~ $ sudo halcompile --install ./Remora-eth/remora-eth-3.0.cpi@raspberry:~ $ sudo halcompile --install ./Remora-spi/remora-spi.cpi@raspberry:~ $ sudo halcompile --install ./Remora/remora_lpc.cpi@raspberry:~ $ sudo halcompile --install ./NVMPG/nvmpg.cpi@raspberry:~ $ sudo halcompile --install ./PIDcontroller/PIDcontroller.cpi@raspberry:~ $ sudo halcompile --install ./PRUencoder/PRUencoder.c>> It was noticed that "Remora-nv" was missing, so I installed it again:
sudo halcompile --install ./Remora-nv/Remora-nv.c6. I copied the example configurations into the LinuxCNC folder, along with "remora-nvem-basic".
>> After starting LinuxCNC, I can select various Remora configurations to start.
7. Uploading the configuration to the NVEM - for this, I had to install TFTP:
pip3 install tftpy- via a workaround involving the installation of pip3, etc., since some things are not installed by default in LinuxCNC.
>> When I run the upload script, I'm in the same folder as the simple config.txt file from "remora-nvem-basic":
python3 upload_config.py config.txt>> This seems to be working so far.
8. Starting LinuxCNC and selecting NVEM Basic, which should match the Config.txt file. Everything starts without an error message.
I can move the axis - looks like i can get further to calibrate steppers and other stuff.
Now i look for the correct way to adapt inputs in my hal.
Hope other people will help this to bring the NVEM to live with LinuxCNC.
Regards,
Last edit: 27 Apr 2026 11:59 by nighteagle.
Please Log in or Create an account to join the conversation.
Time to create page: 0.964 seconds