BLDC_v1
BLDC_v1
ADS1115 ADS(0x48);
Wire.begin();
ADS.begin();
}
// Analog comparator ISR
ISR (ANALOG_COMP_vect) {
// BEMF debounce
for(i = 0; i < 10; i++) {
if(bldc_step & 1){
if(!(ACSR & 0x20)) i -= 1;
}
else {
if((ACSR & 0x20)) i -= 1;
}
}
bldc_move();
bldc_step++;
bldc_step %= 6;
}
void bldc_move(){ // BLDC motor commutation function
switch(bldc_step){
case 0:
AH_BL();
BEMF_C_RISING();
break;
case 1:
AH_CL();
BEMF_B_FALLING();
break;
case 2:
BH_CL();
BEMF_A_RISING();
break;
case 3:
BH_AL();
BEMF_C_FALLING();
break;
case 4:
CH_AL();
BEMF_B_RISING();
break;
case 5:
CH_BL();
BEMF_A_FALLING();
break;
}
}
void loop() {
ADS.setGain(0);
SET_PWM_DUTY(pwmDutyCycle);
delay(50);
void BEMF_A_RISING(){
ADCSRB = (0 << ACME); // Select AIN1 as comparator negative input
ACSR |= 0x03; // Set interrupt on rising edge
}
void BEMF_A_FALLING(){
ADCSRB = (0 << ACME); // Select AIN1 as comparator negative input
ACSR &= ~0x01; // Set interrupt on falling edge
}
void BEMF_B_RISING(){
ADCSRA = (0 << ADEN); // Disable the ADC module
ADCSRB = (1 << ACME);
ADMUX = 2; // Select analog channel 2 as comparator negative input
ACSR |= 0x03;
}
void BEMF_B_FALLING(){
ADCSRA = (0 << ADEN); // Disable the ADC module
ADCSRB = (1 << ACME);
ADMUX = 2; // Select analog channel 2 as comparator negative input
ACSR &= ~0x01;
}
void BEMF_C_RISING(){
ADCSRA = (0 << ADEN); // Disable the ADC module
ADCSRB = (1 << ACME);
ADMUX = 3; // Select analog channel 3 as comparator negative input
ACSR |= 0x03;
}
void BEMF_C_FALLING(){
ADCSRA = (0 << ADEN); // Disable the ADC module
ADCSRB = (1 << ACME);
ADMUX = 3; // Select analog channel 3 as comparator negative input
ACSR &= ~0x01;
}
}
void AH_CL(){ //2
PORTD &= ~0x18; // turn pin 4 & 3 off. turn pin 5 on.
PORTD |= 0x20;
TCCR2A = 0; // Turn pin 9 PB1 (OC1A) PWM ON (pin 11 PB3 & pin 10 PB2
OFF)
TCCR1A = 0x81; //
delayMicroseconds(deadTime);
}
void BH_CL(){ //3
PORTD &= ~0x28; //turn pin 4 (PD4) on. Pin 3 (PD3) & 5 (PD5) off.
PORTD |= 0x10;
TCCR2A = 0; // Turn pin 9 (OC1A) PWM ON (pin 10 & pin 11 OFF)
TCCR1A = 0x81; //
delayMicroseconds(deadTime);
}
void BH_AL(){ //4
PORTD &= ~0x28; //turn pin 4 (PD4) on. Pin 3 (PD3) & 5 (PD5) off.
PORTD |= 0x10;
TCCR1A = 0; // Turn pin 11 (OC2A) PWM ON (pin 9 & pin 10 OFF)
TCCR2A = 0x81; //
delayMicroseconds(deadTime);
}
void CH_AL(){ //5
PORTD &= ~0x30; //turn pin 3 (PD3) on. Pin 4 (PD4) & 5 (PD5) off.
PORTD |= 0x08;
TCCR1A = 0; // Turn pin 11 (OC2A) PWM ON (pin 9 & pin 10 OFF)
TCCR2A = 0x81; //
delayMicroseconds(deadTime);
}
void CH_BL(){ //6
PORTD &= ~0x30; // turn pin 3 (PD3) on. Pin 4 (PD4) & 5 (PD5) off.
PORTD |= 0x08;
TCCR2A = 0; // Turn pin 10 (OC1B) PWM ON (pin 9 & pin 11 OFF)
TCCR1A = 0x21; //
delayMicroseconds(deadTime);
}