/* Sensorless brushless DC (BLDC) motor control with Arduino UNO (Arduino DIY ESC).
This is a free software with NO WARRANTY.
https://simple-circuit.com/
*/
#include <Arduino.h>
#include "utils.h"
#define PWM_3_W 34
#define PWM_2_V 35
#define PWM_1_U 32
#define EN_3_W 33
#define EN_2_V 25
#define EN_1_U 26
#define COMP_1_W 14
#define COMP_2_V 12
#define COMP_3_U 13
#define CH_PWM 0
#define FREQ_PWM 7900
void IRAM_ATTR isr_comp_w();
void IRAM_ATTR isr_comp_v();
void IRAM_ATTR isr_comp_u();
void setup()
{
Serial.begin(9600);
// PWM pins
pinMode(PWM_3_W, OUTPUT);
pinMode(PWM_2_V, OUTPUT);
pinMode(PWM_1_U, OUTPUT);
Serial.println("PWM pins ... done");
// transistonrs enable pins
pinMode(EN_3_W, OUTPUT);
pinMode(EN_2_V, OUTPUT);
pinMode(EN_1_U, OUTPUT);
Serial.println("EN pins ... done");
// comparator pins (sensorless rotation detection)
pinMode(COMP_1_W, INPUT);
pinMode(COMP_2_V, INPUT);
pinMode(COMP_3_U, INPUT);
Serial.println("Comparators pins ... done");
// interupts for external comparator outpus
attachInterrupt(COMP_1_W, isr_comp_w, RISING);
attachInterrupt(COMP_2_V, isr_comp_v, RISING);
attachInterrupt(COMP_3_U, isr_comp_u, RISING);
Serial.println("Interrupts ... done");
// PWM chanel
ledcSetup(CH_PWM, FREQ_PWM, 10);
ledcAttachPin(PWM_3_W, CH_PWM);
Serial.println("PWM channel ... done");
}
void loop()
{
static long i = 0;
if (i < 1024) {
++i;
} else {
i = 0;
}
ledcWrite(CH_PWM, i);
delay(2);
}
void IRAM_ATTR isr_comp_w()
{
Serial.println("Interrupt W");
ledcAttachPin(PWM_3_W, CH_PWM);
digitalWrite(EN_3_W, HIGH);
digitalWrite(EN_2_V, LOW);
digitalWrite(EN_1_U, LOW);
}
void IRAM_ATTR isr_comp_v()
{
Serial.println("Interrupt V");
ledcAttachPin(PWM_2_V, CH_PWM);
digitalWrite(EN_2_V, HIGH);
digitalWrite(EN_1_U, LOW);
digitalWrite(EN_3_W, LOW);
}
void IRAM_ATTR isr_comp_u()
{
Serial.println("Interrupt U");
ledcAttachPin(PWM_1_U, CH_PWM);
digitalWrite(EN_1_U, HIGH);
digitalWrite(EN_2_V, LOW);
digitalWrite(EN_3_W, LOW);
}