I was perusing trough the parts catalog offered by JLCPCB for their assembly service and found this awesome micro controller STM32H750VB it is quite an upgrade over the good old F407 part. It runs newer Cortex-M7 ARM core, it has double precision FP unit and can run at sweet 480MHz. Best of all it was mostly pin compatible with the F407. I had to re-route one side of the pins, but it was fairly quick.
The only down side is that the build-in flash is a bit limited – 128KB, but I think I can work with that. I’ll order some boards with that processor once the factories in China are bully back in business.
The updated design is on my github page in the “new_cpu” branch.
Here is a picture of the driver boards. I tested all of them and they worked flawlessly out of the box.
These are the semi-assembled controllers. I use semi-assembled, because only the SMT components were populated and I have to spin my soldering robot to work on the thru hole connectors.
Next I tested the sensorless homing capability of the TMC2209 drivers. After some tuning of the sensitivity parameter is works very well. You can see one linear rail axis homing with no sensors in this video:
I also decided to work on improving the mounting of the drivers to the board. The driver boards were not very stable in the PCI Express slots and I designed these little plastic holders to fix them in place.
They are bolted to the bottom of the controller PCB. The drivers are very well affixed in place.
While I was trying to get my 2004 LCD panel to work with the controller, I found that not all “standard” EXP1 and EXP2 connectors have the same orientation. At first I though that the SKR 1.3 board, just has them backwards, but I then found this article on the RepRap discussion forum. It appears that the original schematics had an error and now some boards/displays are just backwards. I quickly flipped the connector on my 2004 display and with worked, but this can be quite frustrating.
I made a small PCB that one can use to flip the polarity of the connectors. “To flip or not to flip” seems to be ongoing question.
I tried to do some thermal testing on the TMC2660 drivers. First I tried running my puny motor at 2A with a 60cm 5V fan blowing at the driver. This kept the driver quite cool, which was a not interesting.
I was planning to run all 3 axis at the same time, but my heat sink was just a bit too tall and was touching the other driver :-(. I ordered slightly shorter ones, but they have to swim trough the pacific ocean first.
While I was enjoying torturing the poor motor at it’s rated limit. The thermal camera picked an unusual hot spot on the board. The reverse protection diode was cooking quite a bit. Serves me right for being lazy and not doing the reverse protection the proper way. Even with only one motor running, the diode was dissipating quite a bit of heat. I can’t imagine in what world this part is rated for 10A continuous current. Maybe it needs a small refrigerator attached.
Anyway I changed the schematics to use a proper P-channel MOSFET and a zener.
I added a small cooling pad on the PCB to help the transistor cool off. Hopefully this will not overheat with full 10A load.
I also decided to test one of the last remaining circuits on the board – the servo connectors. This proved to be quite the challenge. There was a serious contention for Timer #7 on the micro controller.
First Marlin’s temperature control was set to use Timer 7. This was not making the Servo module happy. I moved the temperature module to use Timer 8. Then I found that the SoftwareSerial code was also trying to hijack Timer 7. Moved that to Timer 12.
Finally the servo was working properly. I was able to set the position with the M280 command. I decided to quit while I was ahead.
First my woes with the TMC2209 driver boards are ongoing. The company making the PCBs called that they could not complete my last two prototype designs. The issue was that I didn’t pay attention to the fabrication capabilities and used the wrong design rules.
Long story short I had to re-wire part of the board to meet their spec and submit another order. Alas that meant I have to wait another two weeks for the boards to appear 🙁
In the mean time I was trying to test what I can with the rev1 prototype I had. I tested the heaters and thermistors are working. Now it was turn to my old nemesis – the LCD panel.
The software for these LCD panels is remarkably convoluted and not at all supported on STM32 series of MCUs. I had to write two more drivers for the U8G library, but finally some good progress:
I got the FYSETC mini 12864 panel to work. To finish the week, I also verified the SD-card interface is working.
Reflecting on the PrntrBoard V1, there are many good things that I managed to accomplish:
all 3 versions of the board (2130, 2660 and 2209) were functional
the board features were good
driver cooling was excellent
When I started 2 years ago, there were very few 32-bit boards with comparable features. Now there is quite a bit of them. I was trying to find what makes one design more popular than the other and in addition to the board features it comes down to flexibility.
In PrntrBoard V1 I was trying to provide superior cooling solution compared to the tiny replaceable driver board used everywhere. However that choice came at the expense of a monolithic design, which was expensive to make and costly to evolve. Every time I wanted to use a different driver chip I had to re-design the whole board from scratch. It was not going to be sustainable in the long run.
Announcing the PrntrBoardV2: combining all lessons learned and expanding the versatility of the design.
First major change is that the motor drivers are no longer part of the board. Because I still find the original Pololu driver form factor very limiting, I designed the motor driver carried boards to use PCIe slots instead of pin headers.
Here is what the carrier board looks like
The board has 32-bit Arm micro controller – my favorite STM32F407. There are 6 stepper motor slots, with support for 6 thermistors or 6 thermocouples (vie external boards).
There are 4 power MOSFET outputs (1 bed and 3 heaters) and 5 low power MOSFET outputs for fans or LEDs.
Connectivity is via traditional USB, micro-sd card. There are 2 more serial ports for a smart LCD controller and WiFi extension.
I have the traditional RAMPS LCD expansion headers, which should support a variety of LCD screen designs.
Last but not least there are 8 end stops and the ability to route the stall detection signal from the steppers to individual end stops or a global “Alarm” signal.
Drivers are on separate boards with PCIe card edge connectors. This is what the TMC2660 version looks like
And this is what the TMC2209 version looks like
I added some mounting holes next to the PCIe slots so the drivers would not wiggle out of the slot with extensive vibrations.
These driver boards are much larger than the Pololu drivers, which would allow for superior cooling and the ability to have more board real estate for complex designs and or big driver ICs.
In addition the driver boards are mounted vertically on the carrier board, which saves space on the carrier board and allow for excellent air flow trough the drivers with a pair of 40mm fans.
Last but not least because of the reduced requirements on the carrier board, I can use 2 layer instead of 4 layer board, which makes the cost even lower.
I can’t wait to make a few of these and run them trough some tests.
I did some simple thermal tests on the TMC2209 board. In theory these driver chips can supply up to 2A RMS current to the motors. Silent StepSticks with the same drivers are rated around 1.2 to 1.4A depending on the manufacturer.
The test setup
I used all passive cooling. Ambient temperature was 25C. I used a small 9x9x12mm heatsink on top of the driver chip. These are commonly used on the TMC2209 StepStick boards from China (FYSETC or BIGTREETECH). These are not great, but that is what I could fit in the space. I’ll try to move some of the capacitors to make space for a larger heatsink.
On the bottom I used a 20x14x6 heatsink. Not ideal, but that is what I had laying around. There is enough space for a much larger one (25x25x8 for example).
I used a Seek thermal camera “mounted” on a small microscope stand and connected to my old Nexus 5X phone.
First I tested it at 1A RMS current. I use several very slow speed motion commands (G1 Y250 F50 followed by G1 Y0). I found that slow speed motion is much more challenging to the driver heat wise.
After about 20 minutes it board heated to about 47C on the top:
The heatsink was barely warm to the touch. In my experiments the top of the drivers always heats up more than the bottom, probably because of the relatively large thermal mass of the PCB itself.
Next I ran the board at 1.4A RMS. This was more challenging test for the heat dissipation. It took a while for the temperature to stop rising. It stabilized at around 64C on the top:
And around 55C on the bottom:
In the picture the heatsink looks “cool” because the camera can not compensate for the different emissivity of the bare aluminum.
Both top and bottom heatsinks were considerably hot to the touch. Not “burn your fingers” hot, but “I cant keep my fingers longer that 5 seconds” type of hot.
In both cases I did not get any over-temperature warnings from Marlin. I would say 1.4A is the limit on convection heat dissipation of this board in this configuration.
The Seek camera has around +/ – 5C accuracy.
I did one last test at 1.8A RMS. This was on the extreme side of the capabilities of the board. The temperature of the driver kept climbing slowly. Once it reached around 75C on the top I got an overheat alarm in Marlin, so I turned the power off.
I’m confident with some active cooling the driver would be able to run at this setting, because it took quite some time to get to the alarm.
Good news first: I managed to get one motor moving with a simple Arduino sketch.
I’m starting to hate QFN packages with a passion. I spent a whole afternoon trying to re-work two pesky drivers. The chips would not communicate via the UART port, no matter what I tried. Finally traced the issue to a bad solder joint on the QFN package and boy these are hard to spot. Simply re-heating the drivers and re-positioning was not enough, I had to remove the chip, add more solder paste, melt it, then re-insert the chip, wipe the excess solder with a soldering iron and finally re-flow the chip one more time. Complete and total PITA.
To top it off this destroys any near by plastic connectors, so now I have the drivers in-place but have to re-solder the connectors back. This would be an endeavor for the next week.
Now all 5 steppers are communicating with the MCU reliably. I had to add support for half-duplex mode to the stm32duino core. The proposed changes are still pending, but I verified that the TMCStepper library is able to communicate with the drivers.
This took me whole day. Working with QFN drivers is plain PITA. It does look good though. I just hope it works.
I finally figured out how to wash most of the flux from the board. It is still not perfect, but looks really good.
I have another revision with 3 fuses. I figured that one fuse for both motors and extruder heaters may be too taxing. In my latest design I have one 15A fuse for the heated bed; one 10A fuse for the extruder heaters and one more 10A fuse for the rest of the electronics.
I maintain a separate fork of Marlin with some tweak that enabled features specifically for the PRNTRBoard. The code is located in github.com .
Last weekend I spent some time adding some minor, but useful updates. First I finally got to enable support for the sd-card reader on the Nucleo-F407 board. It took a while because typically Marlin uses SPI to communicate with the sd-card. However the STM32 has much better hardware module (SDIO) which allows excellent transfer speed.
So it took some time to research what is the simplest way to add SDIO support to the Marlin firmware. There was already support for the STM32F1 series CPU, but it was written using a deprecated library (libmaple). Long story short it is working fine now. The code is in the f407 branch.
The second feature I wanted to enable is the ability to store the printer settings. Usually this is accomplished using I2C or SPI EEPROM chip. Alas I did not add one to the Nucleo-F407 board. I added an SPI flash instead.
The difference is small but significant. EEPROM chips are small, but can sustain millions of data re-writes. In contrast SPI flash chips are relatively large (the one I use is 2MB), but can only support around 100k re-write cycles.
There were two possible approaches, one use the sd-card as storage. This was already supported in the Marlin firmware, so I simply ported to code. The disadvantage is that it depends on the presence of an sd-card in the slot.
The second approach is called wear leveling – using the fact that I have relatively large storage and spread the writing operations across many locations in the chip. This way if I spread the write operation evenly across 100 separate locations I’ll achieve 10 million re-write cycles.
The error leveling code is relatively simple. For the curious you can find the changes here.
Next I finally decider to make a converter board for RAMPS style LCD controller modules. The files are checked in the main PRNTRBoard github repository. I placed and order for a few prototypes – they should be arriving in a week or so.