0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

L6234無刷直流電機(jī)控制

jf_78858299 ? 來源:云深之無跡 ? 作者:云深之無跡 ? 2023-04-24 11:20 ? 次閱讀

我本來今天想來一發(fā)源碼分析的,但是我手頭沒有鼠標(biāo),我一想截圖那么多就算了,我發(fā)一個電機(jī)驅(qū)動的代碼就行。

[SimpleFoc-云臺電機(jī)2804+AS5600]

[SimpleFoc-原理圖(STL6234+INA240)]

圖片

所以一個輸出要兩個接口控制

L6234 驅(qū)動器有 3 個輸出:OUT1、OUT2 和 OUT3。每個輸出由 2 個引腳控制:輸入 (IN) 和使能 (EN),例如 OUT1 由 IN1 和 EN1 控制。下圖顯示了每個半橋的控制邏輯:

圖片

邏輯電平

圖片

輸出電平

圖片

另外這個原理圖看左邊,為了方便可以把使能腳直接都拉低

圖片

這樣使用三個引腳模擬也是可以的

1.L6234 三相電機(jī)驅(qū)動器

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 電源

#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的書手冊

這個是ATmega的中文數(shù)據(jù)手冊了:

鏈接:https://pan.baidu.com/s/13Bg6A6KGsjhuScStLKJt9Q 提取碼:3lna
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 電機(jī)驅(qū)動
    +關(guān)注

    關(guān)注

    60

    文章

    1186

    瀏覽量

    86500
  • 源碼
    +關(guān)注

    關(guān)注

    8

    文章

    630

    瀏覽量

    29080
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4700

    瀏覽量

    68117
收藏 人收藏

    評論

    相關(guān)推薦

    直流電機(jī)驅(qū)動電路

    直流電機(jī)中,有有直流電機(jī)直流電機(jī)之分,它們之間各有各的優(yōu)點,有
    發(fā)表于 11-07 11:50 ?5681次閱讀

    L6234直流電機(jī)控制-簡易版

    我本來今天想來一發(fā)源碼分析的,但是我手頭沒有鼠標(biāo),我一想截圖那么多就算了,我發(fā)一個電機(jī)驅(qū)動的代碼就行。
    發(fā)表于 03-15 10:11 ?2610次閱讀

    直流電機(jī)的原理與驅(qū)動

    直流電機(jī)是在有直流電機(jī)的基礎(chǔ)上發(fā)展起來的,它用位置傳感器代替了有
    發(fā)表于 11-02 14:15 ?1908次下載

    基于Matlab/Simulink的直流電機(jī)控制仿真研究

    基于Matlab/Simulink的直流電機(jī)控制仿真研究基于Matlab/Simulink的
    發(fā)表于 12-29 10:32 ?0次下載

    基于DSC的直流電機(jī)的模糊控制

    基于DSC的直流電機(jī)的模糊控制-2007。
    發(fā)表于 04-01 17:21 ?29次下載

    直流電機(jī)轉(zhuǎn)速控制

    基于模糊PID模型的直流電機(jī)轉(zhuǎn)速控制-2010。
    發(fā)表于 04-05 16:45 ?57次下載

    直流電機(jī)的變結(jié)構(gòu)控制

    直流電機(jī)的變結(jié)構(gòu)控制,有需要的下來看看
    發(fā)表于 05-05 13:45 ?13次下載

    直流電機(jī)驅(qū)動控制

    直流電機(jī)驅(qū)動控制板(直流逆變電源)-
    發(fā)表于 07-26 10:53 ?163次下載
    <b class='flag-5'>無</b><b class='flag-5'>刷</b><b class='flag-5'>直流電機(jī)</b>驅(qū)動<b class='flag-5'>控制</b>板

    直流電機(jī)運行原理與基本控制

    直流電機(jī)運行原理與基本控制(電源技術(shù)應(yīng)用 期刊)-
    發(fā)表于 09-15 14:27 ?64次下載
    <b class='flag-5'>無</b><b class='flag-5'>刷</b><b class='flag-5'>直流電機(jī)</b>運行原理與基本<b class='flag-5'>控制</b>

    永磁直流電機(jī)簡介

    永磁直流電機(jī)簡介(通信電源技術(shù) 期刊查稿)-永磁直流電機(jī)簡介,有需要的可以參考!
    發(fā)表于 09-15 16:03 ?16次下載
    永磁<b class='flag-5'>無</b><b class='flag-5'>刷</b><b class='flag-5'>直流電機(jī)</b>簡介

    直流電機(jī)原理

    直流電機(jī)原理(大工18秋電源技術(shù)在線作業(yè)2)-直流電機(jī)原理,有需要的可以參考!
    發(fā)表于 09-15 16:52 ?94次下載
    <b class='flag-5'>無</b><b class='flag-5'>刷</b><b class='flag-5'>直流電機(jī)</b>原理

    直流電機(jī)控制系統(tǒng)是什么

    直流電機(jī)控制系統(tǒng) 直流電機(jī)(BLDC)又被稱
    發(fā)表于 03-06 14:02 ?1513次閱讀

    直流電機(jī)與有直流電機(jī)的區(qū)別

    直流電機(jī)與有電機(jī)在外形、形狀上長著十分的相似,不仔細(xì)區(qū)分的話,很有可能出亂子。那么,如何從外觀上區(qū)別是
    發(fā)表于 03-08 14:51 ?9次下載
    <b class='flag-5'>無</b><b class='flag-5'>刷</b><b class='flag-5'>直流電機(jī)</b>與有<b class='flag-5'>刷</b><b class='flag-5'>直流電機(jī)</b>的區(qū)別

    直流電機(jī)和有直流電機(jī)的區(qū)別

      直流電機(jī)和有直流電機(jī)是兩種不同類型的直流電機(jī)。
    發(fā)表于 03-17 18:20 ?7575次閱讀

    永磁直流電機(jī)控制方法

    永磁直流電機(jī)(BLDCM)因其高效率、高功率密度、低維護(hù)成本等優(yōu)點,在電動汽車、航空航天、工業(yè)自動化等領(lǐng)域得到了廣泛應(yīng)用。為了充分發(fā)揮永磁
    的頭像 發(fā)表于 06-03 18:21 ?1120次閱讀