亚洲综合图片区自拍_思思91精品国产综合在线观看_一区二区三区欧美_欧美黑人又粗又大_亚洲人成精品久久久久桥本

L6234無刷直流電機控制-簡易版 全球焦點

2023-03-15 10:23:54 來源:云深之無跡

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


(資料圖片僅供參考)

SimpleFoc-云臺電機2804+AS5600

SimpleFoc-原理圖(STL6234+INA240)

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

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

邏輯電平

輸出電平

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

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

1.L6234 三相電機驅(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 100bytebldc_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;    // Analogcomparator setting    ACSR = 0x10; // Disable and clear (flag bit) analog comparator interrupt    pinMode(SPEED_UP, INPUT_PULLUP);    pinMode(SPEED_DOWN, INPUT_PULLUP);}// Analog comparator ISRISR(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 interruptwhile (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的書手冊

審核編輯:湯梓紅

標簽:

上一篇:
下一篇: