L6234 Brushless DC Motor Control - Simple Version

Publisher:未来感觉Latest update time:2023-06-20 Source: elecfansKeywords:L6234 Reading articles on mobile phones Scan QR code
Read articles on your mobile phone anytime, anywhere

I wanted to do a source code analysis today, but I don't have a mouse, so I thought that since there are so many screenshots, forget it, I'll just post the code for the motor driver.

SimpleFoc-PTZ motor 2804+AS5600

SimpleFoc-Schematic Diagram (STL6234+INA240)

4c146bc0-c253-11ed-bfe3-dac502259ad0.png

So one output needs two interfaces to control

The L6234 driver has 3 outputs: OUT1, OUT2 and OUT3. Each output is controlled by 2 pins: input (IN) and enable (EN), for example OUT1 is controlled by IN1 and EN1. The following figure shows the control logic of each half-bridge:

4c529ce2-c253-11ed-bfe3-dac502259ad0.png

Logic Level

4c8e104c-c253-11ed-bfe3-dac502259ad0.png

Output Level

4caa23ae-c253-11ed-bfe3-dac502259ad0.png

In addition, look at the left side of this schematic diagram. For convenience, you can directly pull the enable pins low.

4cd17d46-c253-11ed-bfe3-dac502259ad0.png

Using three pins like this is also possible

1. L6234 3-phase motor driver 2.6 x 33k ohm resistors 3.3 x 10k ohm resistors 4.4 x 1 ohm resistors (2 W or higher) 5.2 x 1N4148 diodes 6. 100 uF electrolytic capacitors (16V or higher) 7.1 uF electrolytic capacitors (16V or higher) 8. 220 nF (0.22 uF) ceramic capacitors 9. 100 nF (0.1 uF) ceramic capacitors 10. 10 nF (0.01 uF) ceramic capacitors 11.2 x push buttons 12. 12V power supply Direct connection:

4cf4145a-c253-11ed-bfe3-dac502259ad0.png

#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){ 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() { 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;

}

motor_speed = PWM_START_DUTY;

ACSR |= 0x08; // Enable analog comparator interrupt

while (1)

{

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()

{

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_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

}


I will not explain the code yet, you need to read the ATmega manual to understand it.


Keywords:L6234 Reference address:L6234 Brushless DC Motor Control - Simple Version

Previous article:Integrated Intelligence Part 1: EMI Management
Next article:PLC troubleshooting collection is here!

Latest Embedded Articles
Change More Related Popular Components

EEWorld
subscription
account

EEWorld
service
account

Automotive
development
circle

About Us Customer Service Contact Information Datasheet Sitemap LatestNews


Room 1530, 15th Floor, Building B, No.18 Zhongguancun Street, Haidian District, Beijing, Postal Code: 100190 China Telephone: 008610 8235 0740

Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号