1. THÔNG BÁO TUYỂN ADMIN DIỄN ĐÀN 2013
    Tìm kiếm nhà trọ - Ở ghép
    THÔNG BÁO BÁN ÁO SPKT.NET CHO THÀNH VIÊN DIỄN ĐÀN


    HÃY TÌM KIẾM Ở ĐÂY TRƯỚC KHI ĐẶT CÂU HỎI
    {xen:phrase loading}

Em tự làm quadroto, gặp rắc rối về cảm biến vận tốc góc ! Mong mọi người giúp đỡ.

Thảo luận trong 'Các hoạt động nghiên cứu khoa học' bắt đầu bởi doantrungnghia05, 29 Tháng ba 2013.

  1. doantrungnghia05 New Member

    Số bài viết: 3
    Đã được thích: 0
    Điểm thành tích: 0
    Em chào mọi người, em là sinh viên năm cuối trường HVCNBCVT Hà Nội, hiện tại êm đang làm con quadrotor với phần cứng có sẵn là một kit kk-multicopter, đặc điểm của kit này chỉ có 3 con cảm biến gyro mà không có con cảm biến gia tốc accelerometer nào cả ! Em đã xử lý dữ liệu gyro để đo góc nhưng không trả lại chính xác do hiện tượng "gyro drift", em sợ khả năng là không thể cho con quad này bay được nếu không có một bộ điều khiển xịn :D

    [IMG]


    Con quad của em vẫn chưa thể bay được (chỉ có thể lao lên trời rồi mất thăng bằng thôi ạ) do em chưa tính toán chính xác được giá trị 3 con cảm biến vận tốc góc trên main board. Đây là main board ạ:

    [IMG]
    4. datasheet: http://www.kkmulticopter.com/downloads/resources/KKmulticontroller%20v.5.5.pdf
    5. datasheet cam bien van toc goc: (ENC series) http://www.murata.com/products/catalog/pdf/s42e.pdf
    Đây là video qus trình kiểm tra góc trả về

    [video=youtube;MRSKs7iZbRQ]MRSKs7iZbRQ[/video]

    Ở giá trị cân bằng góc trả về là 360 độ, sau khi quay một hồi thì giá trị góc khi board trở về vị trí cân bằng phải là 360, nhưng thực tế thì không.Có vấn đề gì đó mà kết quả ko được chính xác ???? Cái này gọi là "gyro drift": trôi giá trị gyro, tất nhiên là em chưa khắc phục được ạ.
    Đây là code của em cho con 168pa, nếu mọi người quan tâm

    /************************************************** **********************/
    /* MAIN FUNTION */
    /************************************************** **********************/
    int main(void)
    {
    CLKPR=0x80;
    CLKPR=0x00;

    //----------- system init --------------------
    sei();
    usart_init();
    adc_sensor_init();
    led_init();
    motor_control_init();
    motor_start();
    DDRB|=(1<<PINB3);// measure loop time for cheking
    //-----------------------------------------------------------
    //---------- update the zero value ---------
    adc_sensor_get_value();
    roll_zero=roll_adc;//~=824
    yaw_zero=yaw_adc;//~=816
    pitch_zero=pitch_adc;//~=846
    roll_angle=360;
    yaw_angle=360;
    pitch_angle=360;
    //----------------------------------------------------------
    timer2_start();//start measure system time by timer2
    _delay_ms(2000);
    led_on();
    while(1)
    {
    //-------------- get value in 3 sensors -----------------------
    PORTB^=(1<<PINB3);// toogle this pin per main loop
    adc_sensor_get_value();//

    //-------- just process roll gyro--------------------------------------------------------------
    if(roll_adc<roll_zero)
    {
    roll_rate=(roll_zero-roll_adc)/sensitivity;//tinh toc do goc theo phuong roll [degree/s]
    roll_angle-=roll_rate*dtime/1000;//tra ve gia tri degree theo phuong roll [degree]
    }

    if(roll_adc>roll_zero)
    {
    roll_rate=(roll_adc-roll_zero)/sensitivity;//tinh toc do goc theo phuong roll [degree/s]
    roll_angle+=roll_rate*dtime/1000;//tra ve gia tri degree theo phuong roll [degree]
    }
    //---------------------------------------------------------------------------------------------

    usart_clr();
    usart_print_nb(roll_angle);//print roll_angle to computer screen

    //----------------------- creat fixed_loop_time= 25ms per loop---------------------------------
    loop_usefull_time=sys_time-last_time;
    if(loop_usefull_time<fixed_loop_time)
    {
    for(i=0;i<(fixed_loop_time-loop_usefull_time);i++)
    {
    _delay_ms(1);
    }
    }
    dtime=sys_time-last_time;//dtime=time per main loop (ms)
    last_time=sys_time;//update the last_time value for the next loop
    //------------------------------------------------------------------------------------------
    }
    }

    ISR(TIMER2_OVF_vect)//when the timer2 over flow we have: sys_time=sys_time +1(ms)
    { // so we can caculate the dtime( time per main loop)
    sys_time+=1;
    TCNT2=130;
    }

    Em mong mọi người có thể giúp em tìm ra cash khắc phục ạ, em xin chân thành cảm ơn.

Chia sẻ trang này