[应用相关] 带Arduino和L6234驱动器的无刷直流电机控制

[复制链接]
 楼主| xuanhuanzi 发表于 2024-5-19 16:06 | 显示全部楼层 |阅读模式
这篇文章展示了如何使用 Arduino UNO 板和 L6234 三相电机驱动器控制 PC CD-ROM(或 DVD-ROM)驱动器无传感器 BLDC 电机。这款BLDC电机是CD-ROM驱动器的主轴电机,我之所以选择它,是因为它不消耗高功率,L6234驱动器可以轻松驱动。
关于L6234三相电机驱动器:
L6234是一款DMOS三重半桥驱动器,输入电源电压高达52V,输出电流为
5A。它可以用于非常广泛的应用。
它已在多功率BCD60II技术中实现,该技术允许在同一芯片上将隔离的DMOS
晶体管与CMOS和双极电路组合在一起。它采用 Power DIP 20 (16+2+2)
和 Power SO 20 封装。
所有输入均兼容TTL/CMOS,每个半桥均可由其自己的专用输入
和使能驱动。
DMOS结构具有固有续流体二极管,因此可以避免使用双极性配置
中必需的外部二极管。DMOS结构允许在Vs=42V时具有6.5 mA(典型值)的极低静态
电流,无论负载如何。

https://www.st.com/en/motor-drivers/l6234.html
方框图:
157326649b29456c8e.png

L6234 引脚配置:
L6234 芯片采用 20 引脚 PowerDIP 封装 (16+2+2),在 PowerSO20 中,每个封装都有其引脚配置,如下所示:

920956649b2ace79c4.png
L6234 驱动器有 3 个输出:OUT1、OUT2 和 OUT3。每个输出由 2 个引脚控制:输入 (IN) 和使能 (EN),例如 OUT1 由 IN1 和 EN1 控制。下图显示了每个半桥的控制逻辑:
752116649b2c264e66.png
745026649b2c6e1a8d.png

所需硬件:

  • Arduino板(UNO,NANO ...)
  • CD-ROM无刷直流电机
  • L6234 三相电机驱动器 — 数据表
  • 6 x 33k 欧姆电阻
  • 3 x 10k 欧姆电阻
  • 4 x 1 欧姆电阻(2 W 或更高)
  • 2 x 1N4148 二极管
  • 100 uF电解电容器(16V或更高)
  • 1 uF 电解电容器(16V 或更高)
  • 220 nF (0.22 uF) 陶瓷电容器
  • 100 nF (0.1 uF) 陶瓷电容器
  • 10 nF (0.01 uF) 陶瓷电容器
  • 2 x 按钮
  • 12V电源
  • 面包板
  • 跳线



145106649b2ddcbbf3.png

 楼主| xuanhuanzi 发表于 2024-5-19 16:06 | 显示全部楼层
(所有接地端子连接在一起)

无刷电机的速度由连接到 Arduino A0 和 A1 引脚的两个按钮控制。

Arduino代码:
项目代码如下,有关代码的更多信息,请参阅上面的第一个相关项目。
  1. /*
  2. * Sensorless brushless DC (BLDC) motor control with Arduino UNO and L6234 driver.
  3. * This is a free software with NO WARRANTY.
  4. * http://simple-circuit.com/
  5. */


  6. #define SPEED_UP          A0
  7. #define SPEED_DOWN        A1
  8. #define PWM_MAX_DUTY      255
  9. #define PWM_MIN_DUTY      50
  10. #define PWM_START_DUTY    100

  11. byte bldc_step = 0, motor_speed;
  12. unsigned int i;
  13. void setup() {
  14.   DDRD  |= 0x38;           // Configure pins 3, 4 and 5 as outputs
  15.   PORTD  = 0x00;
  16.   DDRB  |= 0x0E;           // Configure pins 9, 10 and 11 as outputs
  17.   PORTB  = 0x31;
  18.   // Timer1 module setting: set clock source to clkI/O / 1 (no prescaling)
  19.   TCCR1A = 0;
  20.   TCCR1B = 0x01;
  21.   // Timer2 module setting: set clock source to clkI/O / 1 (no prescaling)
  22.   TCCR2A = 0;
  23.   TCCR2B = 0x01;
  24.   // Analog comparator setting
  25.   ACSR   = 0x10;           // Disable and clear (flag bit) analog comparator interrupt
  26.   pinMode(SPEED_UP,   INPUT_PULLUP);
  27.   pinMode(SPEED_DOWN, INPUT_PULLUP);
  28. }
  29. // Analog comparator ISR
  30. ISR (ANALOG_COMP_vect) {
  31.   // BEMF debounce
  32.   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) {
  33.     delayMicroseconds(i);
  34.     bldc_move();
  35.     bldc_step++;
  36.     bldc_step %= 6;
  37.     i = i - 20;
  38.   }
  39.   motor_speed = PWM_START_DUTY;
  40.   ACSR |= 0x08;                    // Enable analog comparator interrupt
  41.   while(1) {
  42.     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){
  43.       motor_speed--;
  44.       SET_PWM_DUTY(motor_speed);
  45.       delay(100);
  46.     }
  47.   }
  48. }

  49. void BEMF_A_RISING(){
  50.   ADCSRB = (0 << ACME);    // Select AIN1 as comparator negative input
  51.   ACSR |= 0x03;            // Set interrupt on rising edge
  52. }
  53. void BEMF_A_FALLING(){
  54.   ADCSRB = (0 << ACME);    // Select AIN1 as comparator negative input
  55.   ACSR &= ~0x01;           // Set interrupt on falling edge
  56. }
  57. void BEMF_B_RISING(){
  58.   ADCSRA = (0 << ADEN);   // Disable the ADC module
  59.   ADCSRB = (1 << ACME);
  60.   ADMUX = 2;              // Select analog channel 2 as comparator negative input
  61.   ACSR |= 0x03;
  62. }
  63. void BEMF_B_FALLING(){
  64.   ADCSRA = (0 << ADEN);   // Disable the ADC module
  65.   ADCSRB = (1 << ACME);
  66.   ADMUX = 2;              // Select analog channel 2 as comparator negative input
  67.   ACSR &= ~0x01;
  68. }
  69. void BEMF_C_RISING(){
  70.   ADCSRA = (0 << ADEN);   // Disable the ADC module
  71.   ADCSRB = (1 << ACME);
  72.   ADMUX = 3;              // Select analog channel 3 as comparator negative input
  73.   ACSR |= 0x03;
  74. }
  75. void BEMF_C_FALLING(){
  76.   ADCSRA = (0 << ADEN);   // Disable the ADC module
  77.   ADCSRB = (1 << ACME);
  78.   ADMUX = 3;              // Select analog channel 3 as comparator negative input
  79.   ACSR &= ~0x01;
  80. }

  81. void AH_BL(){
  82.   PORTB  =  0x04;
  83.   PORTD &= ~0x18;
  84.   PORTD |=  0x20;
  85.   TCCR1A =  0;            // Turn pin 11 (OC2A) PWM ON (pin 9 & pin 10 OFF)
  86.   TCCR2A =  0x81;         //
  87. }
  88. void AH_CL(){
  89.   PORTB  =  0x02;
  90.   PORTD &= ~0x18;
  91.   PORTD |=  0x20;
  92.   TCCR1A =  0;            // Turn pin 11 (OC2A) PWM ON (pin 9 & pin 10 OFF)
  93.   TCCR2A =  0x81;         //
  94. }
  95. void BH_CL(){
  96.   PORTB  =  0x02;
  97.   PORTD &= ~0x28;
  98.   PORTD |=  0x10;
  99.   TCCR2A =  0;            // Turn pin 10 (OC1B) PWM ON (pin 9 & pin 11 OFF)
  100.   TCCR1A =  0x21;         //
  101. }
  102. void BH_AL(){
  103.   PORTB  =  0x08;
  104.   PORTD &= ~0x28;
  105.   PORTD |=  0x10;
  106.   TCCR2A =  0;            // Turn pin 10 (OC1B) PWM ON (pin 9 & pin 11 OFF)
  107.   TCCR1A =  0x21;         //
  108. }
  109. void CH_AL(){
  110.   PORTB  =  0x08;
  111.   PORTD &= ~0x30;
  112.   PORTD |=  0x08;
  113.   TCCR2A =  0;            // Turn pin 9 (OC1A) PWM ON (pin 10 & pin 11 OFF)
  114.   TCCR1A =  0x81;         //
  115. }
  116. void CH_BL(){
  117.   PORTB  =  0x04;
  118.   PORTD &= ~0x30;
  119.   PORTD |=  0x08;
  120.   TCCR2A =  0;            // Turn pin 9 (OC1A) PWM ON (pin 10 & pin 11 OFF)
  121.   TCCR1A =  0x81;         //
  122. }

  123. void SET_PWM_DUTY(byte duty){
  124.   if(duty < PWM_MIN_DUTY) duty = PWM_MIN_DUTY; if(duty > PWM_MAX_DUTY)
  125.     duty  = PWM_MAX_DUTY;
  126.   OCR1A  = duty;                   // Set pin 9  PWM duty cycle
  127.   OCR1B  = duty;                   // Set pin 10 PWM duty cycle
  128.   OCR2A  = duty;                   // Set pin 11 PWM duty cycle
  129. }


您需要登录后才可以回帖 登录 | 注册

本版积分规则

183

主题

2307

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部