L6234无刷直流电机控制-简易版

发布时间:2023-06-20  

我本来今天想来一发源码分析的,但是我手头没有鼠标,我一想截图那么多就算了,我发一个电机驱动的代码就行。

SimpleFoc-云台电机2804+AS5600

SimpleFoc-原理图(STL6234+INA240)

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

所以一个输出要两个接口控制

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

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

逻辑电平

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

输出电平

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

另外这个原理图看左边,为了方便可以把使能脚直接都拉低

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

这样使用三个引脚模拟也是可以的

1.L6234 三相电机驱动器  2.6 x 33k 欧姆电阻器 3.3 x 10k 欧姆电阻器 4.4 x 1 欧姆电阻器(功率为 2 W 或更高) 5.2 x 1N4148 二极管 6.100 uF 电解电容器(16V 或更高) 7.1 uF 电解电容器(16V 或更高) 8.220 nF (0.22 uF) 陶瓷电容器 9.100 nF (0.1 uF) 陶瓷电容器 10.10 nF (0.01 uF) 陶瓷电容器 11.2 x 按钮 12.12V 电源 直接连接:

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

}

 


代码我就先不解释了,看懂需要看ATmega的书手册


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    何谓电机的电调?看看大疆无人机电调电路板,都有哪些元器件; (点击图片链接进入,了解......
    -100V。 新能源电动车控制器设计实践 电动车控制器硬件原理 1:工作原理介绍。 2:电路设计思想。 3:和普通开源foc驱动的区别。 开源电动车控制器控制板硬件方案 无刷电调和无刷电机......
    单片机PID调速控制直流无刷电机附部分源码;具备知识,stm32基础,了解无刷直流电机原理,pid控制原理 工具: 无刷直流电机:12v电源驱动,50HZ,占空比为5%的pwm波2秒以上解锁电调......
    为三电极、二磁极、内转子无刷电机演示。 无刷电机不是传统的直流电机,模型虽然是直流电池供电,但通过无刷电调之后就转变为了三相交变电流传输到了三个极性上。通过上图可以看出,无刷电机是没有碳刷的,和有......
    则适用于需要更高精度和更精确定位控制的应用领域,例如数字印刷、电子设备、机器人等等。   4. 控制方式   无刷电机通常使用电调器,将电机运行所需的电流和电压进行调节,以达到所需的转速。而伺服电机控制通常通过控制器来实现,在控......
    世平基于灵动微 SPIN560C 的低压无刷电机应用方案;、方案描述 大联大世平集团针对低压无刷电机,推出基于灵动微 MM32SPIN560C 的无刷电机驱动方案。此方......
    无刷电机的电子换向器是通用的吗?;无刷电机电子换向器是一种常用的电子设备,用于控制电机的旋转方向、速度和力矩。这种换向器可通过外部的信号控制,从而实现对电机的无级调速和方向改变。无刷电机电......
    三相直流无刷电机驱动电路图解;三相直流无刷电机是指具有三相的绕组、无电刷和换向器(或集电环)的电机,并采用直流电经过逆变电路进行驱动的电机。 与传统的有刷直流电机相比,直流无刷电机采用了电子换向取代有刷电机......
    因素包括在换向器表面上形成的绝缘,也会导致电流不稳定。 电磁辐射干扰会耦合到电机的电路部分,导致电机电路故障和性能下降,电磁干扰的水平取决于各种因素,如电机的类型(有刷或无刷),驱动波形和负载。通常,有刷电机会比无刷电机......
    启动容易抖动或启动失败。 有刷电机与无刷电机调速方式的区别 实际上两种电机的控制都是调压,只是由于无刷直流采用了电子换向,所以要有数字控制才可以实现了,而有刷直流是通过碳刷换向的,利用可控硅等传统模拟电路......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>