bldc sensorless control using arduino

Photo of author

By Jackson Taylor

more data will publish after one month reference – 
  • microchip an970
  • http://ww1.microchip.com/downloads/en/AppNotes/00857B.pdf
program #define hall_blue 5 //hall sensor not used #define hall_yellow 7 #define hall_green 6 #define timout_bemf 5000 //order G Y B #define bemf_blue 8 #define bemf_yellow 9 #define bemf_green 10 #define blue_high  A1 #define blue_low   A0 #define yellow_high  A3 #define yellow_low   A2 #define green_high  A5 #define green_low   A4 int blue, green, yellow; int count; int state; void setup() {   Serial.begin(115200);   pinMode(bemf_blue, INPUT);   pinMode(bemf_yellow, INPUT);   pinMode(bemf_green, INPUT);   hall_sensor_init();   motor_pin_init();   off_all();   on_low_side_mosfet_and_charge_bootstrap();   Serial.println(“haiu”);   off_all();   count = 0;   while (count < 2)   {     run_motor_without_sensor_anti_clock ();     count++;   }   off_all();  delay(1); } void loop() {   motor_run_clockwise_using_back_emf(); } void run_motor_without_sensor_anti_clock(void) {     off_all();    digitalWrite(yellow_high, HIGH);   digitalWrite(green_low, HIGH);   off_all_delay();   digitalWrite(yellow_high, HIGH);   digitalWrite(blue_low, HIGH);   off_all_delay();   digitalWrite(green_high, HIGH);   digitalWrite(blue_low, HIGH);   off_all_delay();   digitalWrite(green_high, HIGH);   digitalWrite(yellow_low, HIGH);   off_all_delay();    digitalWrite(blue_high, HIGH);   digitalWrite(yellow_low, HIGH);   off_all_delay();   digitalWrite(blue_high, HIGH);   digitalWrite(green_low, HIGH);   off_all_delay();  // } void run_motor_without_sensor (void) {   off_all_delay();   digitalWrite(blue_high, HIGH);   digitalWrite(yellow_low, HIGH);   // off_all_delay();   ///digitalWrite(blue_high, HIGH);   // digitalWrite(green_low, HIGH);   off_all_delay();   digitalWrite(yellow_high, HIGH);   digitalWrite(green_low, HIGH);   // off_all_delay();   // digitalWrite(yellow_high, HIGH);   // digitalWrite(blue_low, HIGH);   read_hall_sensors();   off_all_delay();   digitalWrite(green_high, HIGH);   digitalWrite(blue_low, HIGH);   off_all_delay();   // digitalWrite(green_high, HIGH);   // digitalWrite(yellow_low, HIGH);   off_all(); } void motor_run_clockwise_using_back_emf(void) {   read_bemf_sensors(); off_all();   count = 0;   while (blue == 1 && yellow == 0 && green == 1 && count < timout_bemf) //101   {     digitalWrite(blue_high, HIGH);     digitalWrite(yellow_low, HIGH);     read_bemf_sensors(); count++;   }   off_all(); count = 0;   while (blue == 1 && yellow == 0 && green == 0 && count < timout_bemf) //100 -byg   {     digitalWrite(blue_high, HIGH);     digitalWrite(green_low, HIGH);     read_bemf_sensors(); count++;   }   off_all(); count = 0;   while (blue == 1 && yellow == 1 && green == 0 && count < timout_bemf) //110   {     digitalWrite(yellow_high, HIGH);     digitalWrite(green_low, HIGH);     read_bemf_sensors(); count++;   }   off_all(); count = 0;   while (blue == 0 && yellow == 1 && green == 0 && count < timout_bemf) //010   {     digitalWrite(yellow_high, HIGH);     digitalWrite(blue_low, HIGH);     read_bemf_sensors(); count++;   }   off_all(); count = 0;   while (blue == 0 && yellow == 1 && green == 1 && count < timout_bemf) //011   {     digitalWrite(green_high, HIGH);     digitalWrite(blue_low, HIGH);     read_bemf_sensors(); count++;   }   off_all(); count = 0;   while (blue == 0 && yellow == 0 && green == 1 && count < timout_bemf) //001   {     digitalWrite(green_high, HIGH);     digitalWrite(yellow_low, HIGH);     read_bemf_sensors(); count++;   } } void off_all_delay(void) {   delayMicroseconds(2000);  PORTC = 0;   /*     digitalWrite(blue_low, LOW);     digitalWrite(blue_high, LOW);     digitalWrite(yellow_low, LOW);     digitalWrite(yellow_high, LOW);     digitalWrite(green_low, LOW);     digitalWrite(green_high, LOW);     //delayMicroseconds(1);   */ } void read_bemf_sensors(void) {   blue = digitalRead(bemf_blue);   yellow = digitalRead(bemf_yellow);   green = digitalRead(bemf_green);   //display_sensor_data();   //Serial.println(PINB & 7); } void motor_run_clockwise(void) {   off_all(); read_hall_sensors();   while (blue == 1 && yellow == 0 && green == 1)//101   {     digitalWrite(blue_high, HIGH);     digitalWrite(yellow_low, HIGH);     read_hall_sensors();   }   off_all();   while (blue == 1 && yellow == 0 && green == 0) //100 -byg   {     digitalWrite(blue_high, HIGH);     digitalWrite(green_low, HIGH);     read_hall_sensors();   }   off_all();   while (blue == 1 && yellow == 1 && green == 0) //110   {     digitalWrite(yellow_high, HIGH);     digitalWrite(green_low, HIGH);     read_hall_sensors();   }   off_all();   while (blue == 0 && yellow == 1 && green == 0) //010   {     digitalWrite(yellow_high, HIGH);     digitalWrite(blue_low, HIGH);     read_hall_sensors();   }   off_all();   while (blue == 0 && yellow == 1 && green == 1)//011   {     digitalWrite(green_high, HIGH);     digitalWrite(blue_low, HIGH);     read_hall_sensors();   }   off_all();   while (blue == 0 && yellow == 0 && green == 1)//001   {     digitalWrite(green_high, HIGH);     digitalWrite(yellow_low, HIGH);     read_hall_sensors();   }   off_all(); } void fault(void) {   //—————————fault————————————-   if (blue == 1 && yellow == 1 && green == 1) //000   {     off_all();     do     {       Serial.println(“fault!!!!!”);       read_hall_sensors(); display_sensor_data();     } while (blue == 1 && yellow == 1 && green == 1);   }   else if (blue == 0 && yellow == 0 && green == 0) //111   {     off_all();     do     {       Serial.println(“fault!!!!!”);       read_hall_sensors(); display_sensor_data();     } while (blue == 0 && yellow == 0 && green == 0);   }   //—————————fault————————————- } void off_all(void) {   PORTC = 0;   /*     digitalWrite(blue_low, LOW);     digitalWrite(blue_high, LOW);     digitalWrite(yellow_low, LOW);     digitalWrite(yellow_high, LOW);     digitalWrite(green_low, LOW);     digitalWrite(green_high, LOW);     //delayMicroseconds(1);   */ } void read_hall_sensors(void) {   blue = !digitalRead(hall_blue);   yellow = !digitalRead(hall_yellow);   green = !digitalRead(hall_green);   // recharge_boot();   //display_sensor_data(); } void delay_for_phase(void) {   // Serial.write(‘a’);   // delayMicroseconds(10); } void recharge_boot(void) { delayMicroseconds(10);   PORTC = 0;   delayMicroseconds(1);   digitalWrite(blue_low, HIGH);   digitalWrite(yellow_low, HIGH);   digitalWrite(green_low, HIGH);   delayMicroseconds(1);   PORTC = 0; } void on_low_side_mosfet_and_charge_bootstrap(void) {   digitalWrite(blue_low, HIGH);   digitalWrite(yellow_low, HIGH);   digitalWrite(green_low, HIGH);   delay(1000); off_all(); delay(1); } void motor_pin_init(void) {   pinMode(blue_high, OUTPUT);   pinMode(blue_low, OUTPUT);   pinMode(yellow_high, OUTPUT);   pinMode(yellow_low, OUTPUT);   pinMode(green_high, OUTPUT);   pinMode(green_low, OUTPUT); } void display_sensor_data(void) {   //Serial.print(“b-“);   Serial.print(blue);   //Serial.print(“-y=”);   Serial.print(yellow);   //Serial.print(“-g=”);   Serial.println(green); } void hall_sensor_init(void) {   pinMode(hall_blue, INPUT_PULLUP);   pinMode(hall_yellow, INPUT_PULLUP);   pinMode(hall_green, INPUT_PULLUP); } void test_fan_driver(void) {   off_all();   digitalWrite(blue_low, HIGH);   digitalWrite(yellow_low, HIGH);   digitalWrite(green_low, HIGH);   delayMicroseconds(1000); off_all();   digitalWrite(blue_high, HIGH);   digitalWrite(yellow_high, HIGH);   digitalWrite(green_high, HIGH);   delayMicroseconds(1000); }
See also
LCD ARDUINO