Hi guys,
The initial 6pwm support for Teensy 3.x and Teensy LC boards is in the dev branch
For now simplefoc will support one 6PWM driver per Timer (FTMx) so only the boards Teensy 3.5 and Teensy3.6 will be able to support 2 motors.
The support is a preliminary and it would be really cool if you guys can test it and let us know what you think. For the next release we will try to work our way to Teensy 4.x boards and to a more flexible 6pwm implementation.
Supported boards
For now simplefoc supports 6pwm for boards:
- Teensy 3.0 - chip MK20DX128
Teensy 3.1/3.2 - chip MK20DX256 - Teensy 3.5 - chip MK20DX128
- Teensy LC - chip MKL26Z64
- Teensy 3.5 - chip MK64FX512 - two 6pwm drivers
- Teensy 3.6 - chip MK66FX1M0 - two 6pwm drivers
Supported pinouts
We support only the hardware 6PWM mode, meaning that all 6 pins have to belong to the same timer. As all the teensy boards 3.x/LC have at least 6 channels on their timer FTM0, this is a safe and most standard implementation. All these boards have
- FTM0_CH0 - 22
- FTM0_CH1 - 23
- FTM0_CH2 - 9
- FTM0_CH3 - 10
- FTM0_CH4 - 6
- FTM0_CH5 - 20
Boards 3.5/3.6 have 6 channels of the timer FTM3 as well so that can additionally support 6pwm on pins:
- FTM3_CH0 - 2
- FTM3_CH1 - 14
- FTM3_CH2 - 7
- FTM3_CH3 - 8
- FTM3_CH4 - 35
- FTM3_CH5 - 46
Example code
There is an example code in the library examples folder that you can use to start off your applications.
// 6pwm standalone example code for Teensy 3.x boards
#include <SimpleFOC.h>
// BLDC driver instance
// using FTM0 timer
BLDCDriver6PWM driver = BLDCDriver6PWM(22,23, 9,10, 6,20, 8);
// using FTM3 timer - available on Teensy3.5 and Teensy3.6
// BLDCDriver6PWM driver = BLDCDriver6PWM(2,14, 7,8, 35,36, 8);
void setup() {
Serial.begin(115200);
// Enable debugging
// Driver init will show debugging output
SimpleFOCDebug::enable(&Serial);
// pwm frequency to be used [Hz]
driver.pwm_frequency = 30000;
// dead zone percentage of the duty cycle - default 0.02 - 2%
driver.dead_zone=0.02;
// power supply voltage [V]
driver.voltage_power_supply = 12;
// Max DC voltage allowed - default voltage_power_supply
driver.voltage_limit = 12;
// driver init
driver.init();
// enable driver
driver.enable();
_delay(1000);
}
void loop() {
// setting pwm
// phase A: 3V
// phase B: 6V
// phase C: 5V
driver.setPwm(3,6,5);
}
The code has been tested and it outputs proper center-aligned PWM signal as well as correct dead-zone and pwm frequency provided by the driver.dead_zone
and driver.pwm_frequency
.
Let us know what you think.