Example application for X-NUCLEO-IHM07M1 board connected to a 3-phase brushless motor with Hall sensors.

Dependencies:   BLDCmotorDriver RateLimiter mbed

Fork of HelloWorld_IHM07M1 by Antonio Vilei

Getting Started with X-NUCLEO-IHM07M1

This example demonstrates how to use the X-NUCLEO-IHM07M1 component with one of the STM32 Nucleo-64 platforms and a three-phase brushless DC (BLDC) motor with Hall sensors.

HW Prerequisites

  • X-NUCLEO-IHM07M1
  • STM32 Nucleo-64 board
  • external DC power supply
  • low voltage three-phase BLDC motor with Hall sensors

X-NUCLEO-IHM07M1 Jumpers Configuration

/media/uploads/avilei/x-nucleo-ihm07m1_jumpers.jpg
Configure the jumpers of your X-NUCLEO-IHM07M1 board as shown below:

  • JP1 open
  • JP2 open
  • JP3 closed
  • J9 closed
  • J5 closed on 2-3 (single shunt)
  • J6 closed on 2-3 (single shunt)
  • J7 open

For more details please refer to the X-NUCLEO-IHM07M1 user manual.

BLDCmotorDriver Library

This example is based on the BLDCmotorDriver motor control library by the TVZ Mechatronics Team, University of Applied Sciences Zagreb, Professional Study in Mechatronics. The BLDCmotorDriver library is a simple implementation of the six-step algorithm and needs Hall sensors to estimate the correct timing for commutation. If you want to use sensor-less BLDC motors with X-NUCLEO-IHM07M1 or if you want an optimized implementation, you must use a different software package like X-CUBE-SPN7, based on STM32Cube.

The HelloWorld_IHM07M1 application has been tested with the Nanotec DF45M024053-A2 motor, a 24V three-phase brushless motor with Hall sensors. This example implements a temperature check to prevent overheating.
If you use a different motor, please be advised that you may need to tweak the configuration parameters for the BLDCmotorDriver library.

Connecting the Motor

/media/uploads/avilei/wirings.jpg
In the picture above you can see an example setup with the Nanotec DF45M024053-A2 motor and a 24V power supply. If you use the same motor, please connect the brown, grey and yellow phases to the OUT1, OUT2 and OUT3 connectors of the X-NUCLEO-IHM07M1 board respectively. Then connect the blue, green, white, red and black wires for the Hall sensors to the A+/H1, B+/H2, Z+/H3, 5V, GND connectors as shown in the picture. If your motor is different, you must pay attention to connect the motor phases and Hall sensors pins in the correct order otherwise the motor won't spin.

Spinning the Motor

Open a terminal window (baudrate 9600, 8N1) to display the user interface of the HelloWorld_IHM07M1 application.
Press the 'w' character to start spinning the motor and speed it up; press the 's' character to slow it down and turn it off.
/media/uploads/avilei/terminal.png

Note

You need a terminal emulator installed on your PC to perform serial communications with your STM32 Nucleo platform. If you do not have it, please download and install one of the following terminal emulation programs:

Committer:
avilei
Date:
Mon Oct 17 15:17:28 2016 +0000
Revision:
6:0eec4b6e94ba
Parent:
5:3290e8857120
Child:
9:25961e94de0e
Add comments

Who changed what in which revision?

UserRevisionLine numberNew contents of line
avilei 2:4ae769d0b112 1 /* mbed Microcontroller Library
avilei 2:4ae769d0b112 2 * Copyright (c) 2006-2016 ARM Limited
avilei 2:4ae769d0b112 3 *
avilei 2:4ae769d0b112 4 * Licensed under the Apache License, Version 2.0 (the "License");
avilei 2:4ae769d0b112 5 * you may not use this file except in compliance with the License.
avilei 2:4ae769d0b112 6 * You may obtain a copy of the License at
avilei 2:4ae769d0b112 7 *
avilei 2:4ae769d0b112 8 * http://www.apache.org/licenses/LICENSE-2.0
avilei 2:4ae769d0b112 9 *
avilei 2:4ae769d0b112 10 * Unless required by applicable law or agreed to in writing, software
avilei 2:4ae769d0b112 11 * distributed under the License is distributed on an "AS IS" BASIS,
avilei 2:4ae769d0b112 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
avilei 2:4ae769d0b112 13 * See the License for the specific language governing permissions and
avilei 2:4ae769d0b112 14 * limitations under the License.
avilei 2:4ae769d0b112 15 */
avilei 2:4ae769d0b112 16
avilei 2:4ae769d0b112 17 // This example is based on the BLDCmotorDriver motor control library
avilei 2:4ae769d0b112 18 // by the TVZ Mechatronics Team, University of Applied Sciences Zagreb,
avilei 2:4ae769d0b112 19 // Professional Study in Mechatronics:
avilei 2:4ae769d0b112 20 // https://developer.mbed.org/teams/TVZ-Mechatronics-Team/code/BLDCmotorDriver/
avilei 2:4ae769d0b112 21
avilei 2:4ae769d0b112 22 #include <stdio.h>
mslovic 0:24b227524f2d 23 #include "mbed.h"
mslovic 0:24b227524f2d 24 #include "RateLimiter.h"
avilei 2:4ae769d0b112 25 #include "SPN7Driver.h"
avilei 2:4ae769d0b112 26 // Pin definitions for X-NUCLEO-IHM070M1 with STM32 Nucleo boards
avilei 2:4ae769d0b112 27 #include "x_nucleo_ihm07m1_targets.h"
mslovic 0:24b227524f2d 28
avilei 2:4ae769d0b112 29 // Instance of the motor driver
avilei 2:4ae769d0b112 30 SPN7Driver M(
avilei 2:4ae769d0b112 31 P_IN1, P_IN2, P_IN3, // Logic input pins
avilei 2:4ae769d0b112 32 P_EN1, P_EN2, P_EN3, // Enable channel pins
avilei 2:4ae769d0b112 33 P_HALL1, P_HALL2, P_HALL3, // Hall sensors pins
avilei 2:4ae769d0b112 34 P_FAULT // Fault LED
avilei 2:4ae769d0b112 35 );
avilei 5:3290e8857120 36
avilei 5:3290e8857120 37 // Pin to check temperature on the X-NUCLEO-IHM07M1 board
avilei 5:3290e8857120 38 AnalogIn temperature(PC_2);
avilei 5:3290e8857120 39
avilei 5:3290e8857120 40 void checkTemperature()
avilei 5:3290e8857120 41 {
avilei 5:3290e8857120 42 float t = temperature.read()* 100.0f;
avilei 5:3290e8857120 43
avilei 6:0eec4b6e94ba 44 if (temperature.read() > 0.55f){
avilei 5:3290e8857120 45 printf("Overheating... Turning off now\n\r");
avilei 5:3290e8857120 46 M.setDutyCycle(0);
avilei 5:3290e8857120 47 M.coast();
avilei 5:3290e8857120 48 }
avilei 5:3290e8857120 49 }
mslovic 0:24b227524f2d 50
mslovic 0:24b227524f2d 51 int main() {
avilei 2:4ae769d0b112 52 printf("Press 'w' to speed up, 's' to speed down\n\r");
avilei 3:4c71d3475814 53
avilei 4:3f63eed73ad1 54 // Duty cycle value to be used for speed control
avilei 4:3f63eed73ad1 55 float dc = 0.0f;
avilei 5:3290e8857120 56
avilei 5:3290e8857120 57 Ticker ticker;
avilei 5:3290e8857120 58 ticker.attach(checkTemperature, 1); // Periodic overheating check
avilei 3:4c71d3475814 59
mslovic 0:24b227524f2d 60 while(true) {
mslovic 0:24b227524f2d 61
avilei 2:4ae769d0b112 62 char c = getchar();
avilei 2:4ae769d0b112 63 if((c == 'w') && (dc < 0.9f)) {
avilei 2:4ae769d0b112 64 dc += 0.1f;
avilei 2:4ae769d0b112 65 M.setDutyCycle(dc);
mslovic 0:24b227524f2d 66 }
avilei 2:4ae769d0b112 67 if((c == 's') && (dc > -0.9f)) {
avilei 2:4ae769d0b112 68 dc -= 0.1f;
avilei 2:4ae769d0b112 69 M.setDutyCycle(dc);
avilei 2:4ae769d0b112 70 }
avilei 2:4ae769d0b112 71
avilei 2:4ae769d0b112 72 printf("Duty Cycle: %1.2f, Sector: %d\n\r",dc, M.getSector());
avilei 2:4ae769d0b112 73
mslovic 0:24b227524f2d 74 }
mslovic 0:24b227524f2d 75 }