Thông báo

Collapse
No announcement yet.

điều khiển động cơ DC bằng AVR

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • điều khiển động cơ DC bằng AVR

    anh chào các anh!
    em là dân cơ khí, em đang làm đề tài điều khiển động cơ DC theo encoder cụ thể như sau: khi encoder quay thuận,dc1 quay nghich, dc2 quay thuận. khi encoder quay nghich thì dc quay ngược lại,encoder dừng thì động cơ dừng .em làm với con ATmega32 ,Em đã viết code bằng code avr , chạy mô phỏng bằng protues, kết quả là khi encoder quay thì động cơ quay theo đúng nhưng khi encoder dừng động cơ vẫn quay ,mong các cao thủ chỉ giúp
    đây là đoạn code của em:
    #include <mega32.h>
    #include <delay.h>
    #define xungA PIND.2 //xung a noi vao PIND.2
    #define xungB PIND.3 //xung B noi vao PIND.3
    #define Hight 1 //muc cao
    #define Low 0 //muc thap
    #define thuan 1 // chieu thuan
    #define nghich 0 // chieu nghich
    #define off 0 // khong quay
    #define on 1
    bit start;
    long count=0;
    int speed=0;
    void dc1_quay_thuan(void)
    {
    while(speed<255)
    {
    speed++;
    PORTA=0x01;
    OCR2=speed;
    }
    if(speed>255)OCR2=255;
    }
    void dc1_quay_nghich(void)
    {
    while(speed<255)
    {
    speed++;
    PORTA=0x02;
    OCR2=speed;
    }
    if(speed>255)OCR2=255;
    }
    void dc2_quay_thuan(void)
    {
    PORTB=0x02;
    OCR0=255;
    }
    void dc2_quay_nghich(void)
    {
    PORTB=0x01;
    OCR0=255;
    }
    void dc_control(void)
    {
    while(count++)
    {
    if((xungA==Low)&&(xungB==Low)) // khi ca 2 xung deu muc thap
    {
    start=off;
    }
    if((start==off)&&(xungA==Hight)&&(xungB==Low))
    //trang thai truoc 2 xung deu muc thap
    //xung A tac dong,xung B chua tac dong
    //=> chieu quay theo chieu thuan
    {
    dc2_quay_thuan();// cho motor2 quay thuan
    dc1_quay_nghich();// cho motor1 quay theo chieu nghich
    start=on; // co quay
    }
    if((start==off)&&(xungA==Low)&&(xungB==Hight))
    //trang thai truoc 2 xung deu muc thap
    //xung B tac dong,xung A chua tac dong
    //=> chieu quay theo chieu nghich
    {
    dc2_quay_nghich();//cho motor2 quay nghich
    dc1_quay_thuan(); // cho motor1 quay theo chieu thuan
    start=on; // trang thai dang quay
    }
    if((xungA==Hight)&&(xungB==Hight))
    //neu ca 2 xung deu tac dong cung muc cao
    start=on ; //trang thai nay khong xac dinh chieu quay
    }
    }
    // Declare your global variables here

    void main(void)
    {
    // Declare your local variables here

    // Input/Output Ports initialization
    // Port A initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=Out Func0=Out
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=0 State0=0
    PORTA=0x00;
    DDRA=0x03;

    // Port B initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=Out Func2=In Func1=Out Func0=Out
    // State7=T State6=T State5=T State4=T State3=0 State2=T State1=0 State0=0
    PORTB=0x00;
    DDRB=0x0B;

    // Port C initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
    PORTC=0x00;
    DDRC=0x00;

    // Port D initialization
    // Func7=Out Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
    // State7=0 State6=T State5=T State4=T State3=T State2=T State1=T State0=T
    PORTD=0x00;
    DDRD=0x80;

    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: 250.000 kHz
    // Mode: Phase correct PWM top=FFh
    // OC0 output: Non-Inverted PWM
    TCCR0=0x63;
    TCNT0=0x00;
    OCR0=0x00;

    // Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: Timer 1 Stopped
    // Mode: Normal top=FFFFh
    // OC1A output: Discon.
    // OC1B output: Discon.
    // Noise Canceler: Off
    // Input Capture on Falling Edge
    // Timer 1 Overflow Interrupt: Off
    // Input Capture Interrupt: Off
    // Compare A Match Interrupt: Off
    // Compare B Match Interrupt: Off
    TCCR1A=0x00;
    TCCR1B=0x00;
    TCNT1H=0x00;
    TCNT1L=0x00;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0x00;
    OCR1AL=0x00;
    OCR1BH=0x00;
    OCR1BL=0x00;

    // Timer/Counter 2 initialization
    // Clock source: System Clock
    // Clock value: 250.000 kHz
    // Mode: Phase correct PWM top=FFh
    // OC2 output: Non-Inverted PWM
    ASSR=0x00;
    TCCR2=0x64;
    TCNT2=0x00;
    OCR2=0x00;

    // External Interrupt(s) initialization
    // INT0: Off
    // INT1: Off
    // INT2: Off
    MCUCR=0x00;
    MCUCSR=0x00;

    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x00;

    // Analog Comparator initialization
    // Analog Comparator: Off
    // Analog Comparator Input Capture by Timer/Counter 1: Off
    ACSR=0x80;
    SFIOR=0x00;

    while (1)
    {
    PORTA=0x03;
    PORTB=0x03;
    };
    }
    interrupt[2]void ext_INT0(void)
    {
    dc_control();
    }

  • #2
    Không làm cái hàm dừng động cơ thì nó dừng thế nào đây ? Trạng thái cổng vẫn nguyên như thế

    Comment

    Về tác giả

    Collapse

    tungbk87 Tìm hiểu thêm về tungbk87

    Bài viết mới nhất

    Collapse

    Đang tải...
    X