Quantcast
Channel: Arduino Forum - Latest topics
Viewing all articles
Browse latest Browse all 15914

Problem with analog comparators in the program

$
0
0

Hey guys! I have a problem fixing an error that appears in this program. Its function is to activate and control the speed of a Brushless DC motor.

/*
* Sensorless brushless DC (BLDC) motor control with Arduino UNO and L6234 driver.
* This is a free software with NO WARRANTY.
* http://simple-circuit.com/
*/
#include <Arduino.h>
#include <avr/io.h>
 
#define SPEED_UP          A0
#define SPEED_DOWN        A1
#define PWM_MAX_DUTY      255
#define PWM_MIN_DUTY      50
#define PWM_START_DUTY    100
 
byte bldc_step = 0, motor_speed;
unsigned int i;
void setup() 
{
  DDRD  |= 0x38;           // Configure pins 3, 4 and 5 as outputs
  PORTD  = 0x00;
  DDRB  |= 0x0E;           // Configure pins 9, 10 and 11 as outputs
  PORTB  = 0x31;
  // Timer1 module setting: set clock source to clkI/O / 1 (no prescaling)
  TCCR1A = 0;
  TCCR1B = 0x01;
  // Timer2 module setting: set clock source to clkI/O / 1 (no prescaling)
  TCCR2A = 0;
  TCCR2B = 0x01;
  // Analog comparator setting
  ACSR = 0x10;           // Disable and clear (flag bit) analog comparator interrupt
  pinMode(SPEED_UP,   INPUT_PULLUP);
  pinMode(SPEED_DOWN, INPUT_PULLUP);
}
// 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)
  { 
    switch (0)
    {
      AH_BL(); 
      BEMF_C_RISING(); 
      break;
    }    
    switch (1)
    {
      AH_CL(); 
      BEMF_B_FALLING(); 
      break;  
    }
    switch (2)
    {
      BH_CL(); 
      BEMF_A_RISING(); 
      break;
    }
    switch (3)
    {
      BH_AL(); 
      BEMF_C_FALLING(); 
      break; 
    } 
    switch (4) 
    {
      CH_AL(); 
      BEMF_B_RISING(); 
      break; 
    }
    switch (5)
    {
      CH_BL(); 
      BEMF_A_FALLING(); 
      break; 
    } 
    
  } 
} 

void loop() 
{ 
  SET_PWM_DUTY(PWM_START_DUTY); // Setup starting PWM with duty cycle = PWM_START_DUTY 
  i = 5000; // Motor start while(i > 100) 
  {
    delayMicroseconds(i);
    bldc_move();
    bldc_step++;
    bldc_step %= 6;
    i = i - 20;
  }
while(1) 
  {
    motor_speed = PWM_START_DUTY;
    ACSR |= 0x08;                    // Enable analog comparator interrupt
    while(!(digitalRead(SPEED_UP)) && motor_speed < PWM_MAX_DUTY)
    { 
      motor_speed++; 
      SET_PWM_DUTY(motor_speed); 
      delay(100); 
    } 
    while(!(digitalRead(SPEED_DOWN)) && motor_speed > PWM_MIN_DUTY)
    {
      motor_speed--;
      SET_PWM_DUTY(motor_speed);
      delay(100);
    }
  }
}

void BEMF_A_RISING()
{
  ACSRB = (0 << ACME);    // Select AIN1 as comparator negative input
  ACSR |= 0x03;            // Set interrupt on rising edge
}

void BEMF_A_FALLING() 
{
  ACSRB = (0 << ACME);    // Select AIN1 as comparator negative input
  ACSR = ~0x01;           // Set interrupt on falling edge
}

void BEMF_B_RISING() 
{
  ACSRA = (0 << ADEN);   // Disable the ADC module
  ACSRB = (1 << ACME);
  ADMUX = 2;              // Select analog channel 2 as comparator negative input
  ACSR |= 0x03;
}

void BEMF_B_FALLING() 
{
  ACSRA = (0 << ADEN);   // Disable the ADC module
  ACSRB = (1 << ACME);
  ADMUX = 2;              // Select analog channel 2 as comparator negative input
  ACSR = ~0x01;
}

void BEMF_C_RISING() 
{
  ACSRA = (0 << ADEN);   // Disable the ADC module
  ACSRB = (1 << ACME);
  ADMUX = 3;              // Select analog channel 3 as comparator negative input
  ACSR |= 0x03;
}

void BEMF_C_FALLING() 
{
  ACSRA = (0 << ADEN);   // Disable the ADC module
  ACSRB = (1 << ACME);
  ADMUX = 3;              // Select analog channel 3 as comparator negative input
  ACSR = ~0x01;
}
 
void AH_BL() 
{
  PORTB  =  0x04;
  PORTD &= ~0x18;
  PORTD |=  0x20;
  TCCR1A =  0;            // Turn pin 11 (OC2A) PWM ON (pin 9 & pin 10 OFF)
  TCCR2A =  0x81;         
}

void AH_CL() 
{
  PORTB  =  0x02;
  PORTD &= ~0x18;
  PORTD |=  0x20;
  TCCR1A =  0;            // Turn pin 11 (OC2A) PWM ON (pin 9 & pin 10 OFF)
  TCCR2A =  0x81;         
}

void BH_CL() 
{
  PORTB  =  0x02;
  PORTD &= ~0x28;
  PORTD |=  0x10;
  TCCR2A =  0;            // Turn pin 10 (OC1B) PWM ON (pin 9 & pin 11 OFF)
  TCCR1A =  0x21;         
}

void BH_AL() 
{
  PORTB  =  0x08;
  PORTD &= ~0x28;
  PORTD |=  0x10;
  TCCR2A =  0;            // Turn pin 10 (OC1B) PWM ON (pin 9 & pin 11 OFF)
  TCCR1A =  0x21;         
}

void CH_AL() 
{
  PORTB  =  0x08;
  PORTD &= ~0x30;
  PORTD |=  0x08;
  TCCR2A =  0;            // Turn pin 9 (OC1A) PWM ON (pin 10 & pin 11 OFF)
  TCCR1A =  0x81;         
}

void CH_BL() {
  PORTB  =  0x04;
  PORTD &= ~0x30;
  PORTD |=  0x08;
  TCCR2A =  0;            // Turn pin 9 (OC1A) PWM ON (pin 10 & pin 11 OFF)
  TCCR1A =  0x81;         
}

void SET_PWM_DUTY(byte duty) {
  if(duty < PWM_MIN_DUTY) duty = PWM_MIN_DUTY; 
  if(duty > PWM_MAX_DUTY) duty  = PWM_MAX_DUTY;
  OCR1A  = duty;                   // Set pin 9  PWM duty cycle
  OCR1B  = duty;                   // Set pin 10 PWM duty cycle
  OCR2A  = duty;                   // Set pin 11 PWM duty cycle
}

When checking, the following message appear:

Compilation error: 'ACSRB' was not declared in this scope

Does anyone have an idea what could be happening in this case?

Thanks!

4 posts - 4 participants

Read full topic


Viewing all articles
Browse latest Browse all 15914

Latest Images

Trending Articles



Latest Images