The code running on esp32 does not work on stmf401

I decided to try the work of the stm and used the code that I used on the esp32 board. Renamed the connection pins. But instead of rotating, I got a hold position

  /**
   * ESP32 position motion control example with encoder
   *
   */
  #include <SimpleFOC.h>
  int S;
  // Motor instance
  BLDCMotor motor = BLDCMotor(15);
  BLDCDriver3PWM driver = BLDCDriver3PWM(PB6, PB7, PB8, PB5);
  
  // encoder instance
  Encoder encoder = Encoder(PA8, PA9, 600, PA10);
  
  // Interrupt routine intialisation
  // channel A and B callbacks
  void doA(){encoder.handleA();}
  void doB(){encoder.handleB();}
  void doI(){encoder.handleIndex();}
  // angle set point variable
  float target_angle = 0;
  // instantiate the commander
  Commander command = Commander(Serial);
  void doTarget(char* cmd) { command.scalar(&target_angle, cmd); }
  
  void setup() {
  
    // initialize encoder sensor hardware
    encoder.init();
    encoder.enableInterrupts(doA, doB, doI);
  
    // link the motor to the sensor
    motor.linkSensor(&encoder);
  
    // driver config
    // power supply voltage [V]
    //driver.enable_active_high = false;
    driver.voltage_power_supply = 24;
    driver.init();
    // link the motor and the driver
    motor.linkDriver(&driver);
  
    // aligning voltage [V]
    motor.voltage_sensor_align = 3;
    // index search velocity [rad/s]
    motor.velocity_index_search = 3;
  
    // set motion control loop to be used
    motor.controller = MotionControlType::velocity;
  
    // contoller configuration
    // default parameters in defaults.h
  
    // velocity PI controller parameters
    motor.PID_velocity.P = 0.2f;
    motor.PID_velocity.I = 0;
    // default voltage_power_supply
    motor.voltage_limit = 6;
    // jerk control using voltage voltage ramp
    // default value is 300 volts per sec  ~ 0.3V per millisecond
    motor.PID_velocity.output_ramp = 1000;
  
    // velocity low pass filtering time constant
    motor.LPF_velocity.Tf = 0.01f;
  
    // angle P controller
    motor.P_angle.P = 100;
    //  maximal velocity of the position control
    motor.velocity_limit = 100;
  
  
    // use monitoring with serial
    Serial.begin(115200);
    // comment out if not needed
    motor.useMonitoring(Serial);
  
    // initialize motor
    motor.init();
    // align encoder and start FOC
    motor.initFOC();
  
    // add target command T
    command.add('T', doTarget, "target angle");
  
    Serial.println(F("Motor ready."));
    Serial.println(F("Set the target angle using serial terminal:"));
    _delay(1000);
  }
  float almost_zero_velocity = 1; // rad/s
  void loop() {
    if(motor.shaft_velocity > almost_zero_velocity){motor.zero_electric_angle = 1.97;}
  else if(motor.shaft_velocity < -almost_zero_velocity){motor.zero_electric_angle =3.16 ;}
  else{ motor.zero_electric_angle = 2.56;}
  S=map(analogRead(PA11), 1895, 0, 0, -42);
    // main FOC algorithm function
    // the faster you run this function the better
    // Arduino UNO loop  ~1kHz
    // Bluepill loop ~10kHz
    motor.loopFOC();
  
    // Motion control function
    // velocity, position or voltage (defined in motor.controller)
    // this function can be run at much lower frequency than loopFOC() function
    // You can also use motor.move() and set the motor.target in the code
    motor.move(S);
  
    // function intended to be used with serial plotter to monitor motor variables
    // significantly slowing the execution down!!!!
    // motor.monitor();
  
    // user communication
    command.run();
  }

Hmmmm, not sure what’s going on there. Your code looks ok at first glance.

Is this on PlatformIO or ArduinoIDE?

Which pins is your serial port using? Do you see the serial output from the F401?

Which F401 board are you using? Is it a BlackPill type board or a Nucleo?

the black pill board, reading the analog input from pin 11 does not occur. I changed to pin 7 and it reads from 0 to 1023. I don’t know why it should be up to 4096. stm32f401cc

PA11 is not an analog pin. You can find that in the variant file from the stm32core.

I think they set analog read to 10 bit for compatibility with arduino
analogReadResolution(12); //in void setup()
will get your wanted result.

I have seen a picture from your steering wheel in another thread. I would like one too. Where are the commands for the motor coming from?

1 Like

Good afternoon. Thank you, it really helped. The signal source is the stm32f407 on which the VNM firmware is installed. It’s better to have it all on one controller, but I’m new to programming

3 Likes