Link
On this page

Test Your Driver

⏱️ ~10 minutes

Once your sensor is working, test that your motor driver can initialize and output PWM signals correctly.

Standalone Driver Test

First, test the driver without a motor connected (safest approach).

Select Your Driver Type

3PWM BLDC Driver 6PWM BLDC Driver 2PWM Stepper Driver 4PWM Stepper Driver

#include <SimpleFOC.h>

// BLDCDriver3PWM(pwmA, pwmB, pwmC, (en optional))
BLDCDriver3PWM driver = BLDCDriver3PWM(TODO,TODO,TODO, TODO); // set your pins

void setup() {
  
  // use monitoring with serial 
  Serial.begin(115200);
  // enable more verbose output for debugging
  // comment out if not needed
  SimpleFOCDebug::enable(&Serial);
  
  // power supply voltage [V]
  driver.voltage_power_supply = TODO;
  // Max DC voltage allowed - default voltage_power_supply
  driver.voltage_limit = TODO;

  // driver init
  if (!driver.init()){
    Serial.println("Driver init failed!");
    return;
  }

  // enable driver
  driver.enable();
  Serial.println("Driver ready!");
  _delay(1000);
}

void loop() {
    // setting pwm
    // phase A: 3V
    // phase B: 6V
    // phase C: 5V
    driver.setPwm(3,6,5);
}
#include <SimpleFOC.h>

// BLDCDriver6PWM(pwmAh, pwmAl, pwmBh, pwmBl, pwmCh, pwmCl, (en optional))
BLDCDriver6PWM driver = BLDCDriver6PWM(TODO, TODO, TODO, TODO, TODO, TODO, TODO); // set your pins

void setup() {

  // use monitoring with serial 
  Serial.begin(115200);
  // enable more verbose output for debugging
  // comment out if not needed
  SimpleFOCDebug::enable(&Serial);
  
  // power supply voltage [V]
  driver.voltage_power_supply = TODO;
  // Max DC voltage allowed - default voltage_power_supply
  driver.voltage_limit = TODO;
  // dead_zone [0,1] - default 0.02f - 2%
  driver.dead_zone = 0.05f;

  // driver init
  if (!driver.init()){
    Serial.println("Driver init failed!");
    return;
  }

  // enable driver
  driver.enable();
  Serial.println("Driver ready!");
  _delay(1000);
}

void loop() {
    // setting pwm
    // phase A: 3V
    // phase B: 6V
    // phase C: 5V
    driver.setPwm(3,6,5);
}
#include <SimpleFOC.h>

// StepperDriver2PWM(pwm1, dir1, pwm2, dir2,(en1, en2 optional))
StepperDriver2PWM driver = StepperDriver2PWM(TODO, TODO, TODO, TODO, TODO, TODO); // set your pins

void setup() {
  
  // use monitoring with serial 
  Serial.begin(115200);
  // enable more verbose output for debugging
  // comment out if not needed
  SimpleFOCDebug::enable(&Serial);
  
  // power supply voltage [V]
  driver.voltage_power_supply = TODO;
  // Max DC voltage allowed - default voltage_power_supply
  driver.voltage_limit = TODO;
  
  // driver init
  if (!driver.init()){
    Serial.println("Driver init failed!");
    return;
  }

  // enable driver
  driver.enable();
  Serial.println("Driver ready!");
  _delay(1000);
}

void loop() {
    // setting pwm
    // phase A: 3V
    // phase B: 6V
    driver.setPwm(3,6);
}
#include <SimpleFOC.h>

// StepperDriver4PWM(ph1A, ph1B, ph2A, ph2B, (en1, en2 optional))
StepperDriver4PWM driver = StepperDriver4PWM(TODO, TODO, TODO, TODO, TODO, TODO); // set your pins

void setup() {
  
  // use monitoring with serial 
  Serial.begin(115200);
  // enable more verbose output for debugging
  // comment out if not needed
  SimpleFOCDebug::enable(&Serial);
  
  // power supply voltage [V]
  driver.voltage_power_supply = TODO;
  // Max DC voltage allowed - default voltage_power_supply
  driver.voltage_limit = TODO;
  
  // driver init
  if (!driver.init()){
    Serial.println("Driver init failed!");
    return;
  }

  // enable driver
  driver.enable();
  Serial.println("Driver ready!");
  _delay(1000);
}

void loop() {
    // setting pwm
    // phase A: 3V
    // phase B: 6V
    driver.setPwm(3,6);
}

Setup Steps

  1. Copy the code for your driver type
  2. Update pin numbers to match your setup:
    • implement TODOs in the code
    • PWM pins for each phase
    • Enable pin (optional but recommended)
  3. Set power supply voltage to match your hardware
  4. Upload and open Serial Monitor (115200 baud)

Verify Driver Initialization

✓ What to expect

You should see:

  • Driver ready! message in the serial terminal
  • PWM signals on all phase pins (even if no motor connected)
  • No Driver init failed! error

Check PWM Outputs

You can verify without a multimeter or by connecting small LEDs between each phase and ground. They should light up with different brightness levels.

If you connect LEDs you can do a quick test by changing the PWM values in the loop() function and observing the brightness change.

float angle = 0;
float set_voltage = 3; // Start at 3V
void loop() {
    // setting pwm
    angle = fmod(angle + 0.01, TWO_PI); // Rotate angle
    float pwmA = set_voltage*(sin(angle) + 1) / 2 ;              // Sinusoidal pattern for testing          
    float pwmB = set_voltage*(sin(angle + TWO_PI/3) + 1) / 2 ;   // Phase shifted by 120 degrees
    float pwmC = set_voltage*(sin(angle + 2*TWO_PI/3) + 1) / 2 ; // Phase shifted by 240 degrees
    driver.setPwm(pwmA, pwmB, pwmC);
    delay(100);
}

Alternatively you could even connect your motor and observe it rotating, just make sure to set the voltage set_voltage to a very low value (e.g., 1V) to prevent damage.

Troubleshooting

Driver init failed?

  • Verify pin numbers match your hardware
  • Check power supply is connected and powered on
  • Ensure pins you’re using support PWM (check your MCU datasheet)
  • See Choosing PWM Pins guide

Wrong driver class selected?

Dead zone parameter?

  • Only needed for 6PWM drivers
  • Prevents overlapping phase switching; default is usually fine
  • Increase if you hear buzzing

Next Step

Once driver initializes successfully, proceed to

Motor + Driver Test