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}

Cùng thảo luận về cách lập trình ADC trên AVR??

Thảo luận trong 'Robocon 2011' bắt đầu bởi ngoctrai90, 24 Tháng năm 2011.

  1. ngoctrai90 New Member

    Số bài viết: 10
    Đã được thích: 0
    Điểm thành tích: 0
    Rất mong mọi người giúp đỡ !

    Hiện mình đang gặp khó khăn về cách lập trình dò line cho robot , sử dụng các kênh ADC của AVR để lưu các giá trị dò line. Mạch cảm biến chỉ có led phát + quang trở mà thôi. Mình lấy điện áp ra ở quang trở cấp vào các chân ADC của AVR để xử lý ( Mình dùng 8 led để dò line). Mà thực sự mình chưa biết phải lập trình như thế nào cho AVR nữa. Ai có tài liệu gì thì up lên cùng tranh luận được ko?
    Hoặc gửi qua Gmail giúp mình : hongoctrai@gmail.com
    Mình xin chân thành cảm ơn!
  2. ngoctrai90 New Member

    Số bài viết: 10
    Đã được thích: 0
    Điểm thành tích: 0
  3. vth_87 Member

    Số bài viết: 297
    Đã được thích: 2
    Điểm thành tích: 18
    tại sao chúng ta lại không sử dụng PIC nhỉ- bên ngoài bây giờ PIC được ứng dụng rất rộng rãi
  4. thanhkht New Member

    Số bài viết: 156
    Đã được thích: 0
    Điểm thành tích: 0
    Bạn thử chương trình này nha:
    +Cấu trúc của một chương trình
    + Cách viết trên eeprom
    + Chương trình LCD
    + Chương trình ADC
    + Cấu trúc của một câu lệnh
    Nội dung bài học:
    Giới thiệu nội dung chương trinh chạy của ROBOT
    - Chương trình chạy của ROBOT :
    + Đi mù khi không có vạch ở vùng xuất phát và 1 vài vị trí khác trên sân.
    + ROBOT đi theo vạch trắng.
    + ROBOT đi và đếm các vạch ngang.
    + ROBOT thực hiện quá trình rẽ trái, phải.
    + ROBOT thực hiện các thao tác lấy quà và thả quà.
    + Các chiến thuật của ROBOT trên sân, tức là ROBOT
    Linh hoạt đi theo các chiến thuật khác nhau trên sân.
    1, Đi mù khi không có vạch xuất phát:
    Lúc này chúng ta sử dụng 3 biến đó là 1 biến thời gian, 2 biến tốc độ 2 bánh. Để không phải thay đổi chương trình nhiều không phải mất nhiều thời gian nạp lại chip chúng ta đưa 3 biến trên vào 3 biến của bộ nhớ EEPROM để có thể lưu được giá trị của nó khi RESET chương trình hoặc khi tắt nguồn, lúc này nhiệm vụ của chúng ta là phải viết thuật toán để có thể thay đổi được 3 biến này bằng cách sử dụng các phím bấm có bởi phần cứng. với cách sử lý như vậy chúng ta có thể dễ dàng cho ROBOT di chuyển đến những vị trí bất kì mà không cần vạch.
    Ví dụ :
    eeprom unsigned char VA_T=85;
    eeprom unsigned char VB_T=219;
    eeprom unsigned char TG_T=126;
    trên là những tốc độ sau khi đã tinh chỉnh, nhưng ta có thể cho nó giá trị bất kì và sau khi tinh chỉnh xong ta đọc lại giá trị của nó vào chương trình.
    Ví dụ đoạn chương trình SETUP đi mù khu vực xuất phát:

    void SETUP_DM(void)
    {
    lcd_clear();
    lcd_gotoxy(0,0);
    lcd_putsf("toc do 2 banh");
    delay_ms(200);
    lcd_gotoxy(0,0);
    lcd_putsf("VA_T VB_T TG_T");
    lcd_gotoxy(0,1);
    lcd_putnum(VA_T);
    lcd_gotoxy(4,1);
    lcd_putnum(VB_T);
    lcd_gotoxy(10,1);
    lcd_putnum(TG_T);
    delay_ms(200);
    while(1)
    {
    while(!SELECT1) //nut nhan chuong trinh

    {
    lcd_gotoxy(0,0);
    lcd_putsf("toc do VA_T");
    delay_ms(200);
    while(1)
    {
    lcd_gotoxy(0,0);
    lcd_putsf("VA_T VB_T TG_T");
    if(!SELECT1){
    VA_T=VA_T+10 ;
    lcd_gotoxy(0,1);
    lcd_putnum(VA_T);
    delay_ms(200);

    }
    if(!SELECT2){ //nut nhan chuong trinh
    VA_T=VA_T-10;
    lcd_gotoxy(0,1);
    lcd_putnum(VA_T);
    delay_ms(200);
    }

    if(!OK)
    {
    break;
    delay_ms(200);
    }
    delay_ms(200);
    }
    }
    while(!SELECT2)
    {
    lcd_gotoxy(0,0);
    lcd_putsf("toc do VB_T") ;
    delay_ms(200);

    while(1)
    {
    lcd_gotoxy(0,0);
    lcd_putsf("VA_T VB_T TG_T");
    if(!SELECT1){
    VB_T=VB_T+10;
    lcd_gotoxy(4,1);
    lcd_putnum(VB_T);
    delay_ms(200);

    }
    if(!SELECT2){

    VB_T=VB_T-10;
    lcd_gotoxy(4,1);
    lcd_putnum(VB_T);
    delay_ms(200);
    }
    if(!OK)

    break;


    delay_ms(200);
    }
    }
    while(!SELECT)
    {
    lcd_gotoxy(0,0);
    lcd_putsf(" ") ;
    lcd_gotoxy(0,0);
    lcd_putsf("thoi gian di mu") ;
    delay_ms(200);
    while(1)
    {
    lcd_gotoxy(0,0);
    lcd_putsf("VA_T VB_T TG_T");
    if(!SELECT1){
    //if(TG_T++5>240) TG_T=20;
    TG_T=TG_T+1;


    lcd_gotoxy(10,1);
    lcd_putnum(TG_T);

    delay_ms(200);
    }
    if(!SELECT2){
    TG_T=TG_T+1;
    lcd_gotoxy(10,1);
    lcd_putnum(TG_T);
    delay_ms(200);
    }

    if(!OK)
    break;


    delay_ms(200);
    }
    }
    }
    }


    Đoạn chương trình trên chúng ta có thể thấy 3 biến EEPROM :
    -TG_T, VA_T,VB_T tương ứng với các phím bấm có thể thay đổi được khi cần thiết .


    2, ROBOT đi theo vạch trắng :
    Dùng 6 sensor được bố trí ngang phía trước ROBOT , các sensor này được bố trí 2 bên của vạch trắng và dùng thuật toán kiểm tra các sensor này từ đó băm xung điều chỉnh tốc độ các động cơ tương ứng


    void GO_ON(unsigned char VTA_M,unsigned char VTB_M)
    {
    //if(run_mode){
    if(adc_data[1]>adc_level[1]) Senser1 = 0;
    // KIEM TRA NEU CHAM VACH GIA TRI BIT==0
    else Senser1 = 1; // ELSE GIA TRI BIT ==1
    if(adc_data[2]>adc_level[2]) Senser2 = 0;
    else Senser2 = 1;
    if(adc_data[3]>adc_level[3]) Senser3 = 0;
    else Senser3 = 1;
    if(adc_data[4]>adc_level[4]) Senser4 = 0;
    else Senser4 = 1;
    if(adc_data[5]>adc_level[5]) Senser5 = 0;
    else Senser5 = 1;
    if(adc_data[6]>adc_level[6]) Senser6 = 0;
    else Senser6 = 1;
    //--------
    lcd_gotoxy(5,0);
    if(Senser1) lcd_putchar(255);
    else lcd_putchar('-');
    if(Senser2) lcd_putchar(255);
    else lcd_putchar('-');
    if(Senser3) lcd_putchar(255);
    else lcd_putchar('-');
    if(Senser4) lcd_putchar(255);
    else lcd_putchar('-');

    if(Senser5) lcd_putchar(255);
    else lcd_putchar('-');
    if(Senser6) lcd_putchar(255);
    else lcd_putchar('-');
    lcd_count = 0;

    trên là đoạn chương trình gán giá trị sensor từ giá trị số đọc về từ các kênh ta chuyển thành giá trị dạng BIT bang cách kiểm tra : nếu adc_data[x] >= adc_level[x]) thì gán BIT =0 ,
    nếu adc_data[x] <adc_level[x]) thì gán BIT =1.

    VTA_Slow1 = (VTA_M/100)*30; // 40% TOC DO CHAY DONG CO TRAI
    VTA_Slow2 = (VTA_M/100)*10; // 20% TOC DO CHAY DONG CO TRAI
    VTA_Slow3 = 0 ;
    VTB_Slow1 = (VTB_M/100)*30; // 40% TOC DO CHAY DONG CO PHAI
    VTB_Slow2 = (VTB_M/100)*10; // 20% TOC DO CHAY DONG CO PHAI
    VTB_Slow3 = 0 ;

    Trên là đoạn chương trình phân cấp tốc độ cho động cơ
    if((SENSER==0b11111111)|(SENSER==0b10000001)){ // khong cham vach|tren vach ngang

    // di thang
    VT_A = VTA_M;
    VT_B = VTB_M;
    lcd_gotoxy(0,1);
    lcd_putsf("1");

    }else{
    if(!Senser1){ // stop left
    VT_B = VTB_Slow3;
    VT_A = VTA_M;
    lcd_gotoxy(0,1);
    lcd_putsf("2");

    }else
    if(!Senser6){ // stop right
    VT_B = VTB_M;
    VT_A = VTA_Slow3;
    lcd_gotoxy(0,1);
    lcd_putsf("3");

    }else
    if(!Senser2){ // slow2 left
    VT_B = VTB_Slow2;
    VT_A = VTA_M;
    lcd_gotoxy(0,1);
    lcd_putsf("4");

    }else
    if(!Senser5){ // slow2 right
    VT_B = VTB_M;
    VT_A = VTA_Slow2;
    lcd_gotoxy(0,1);
    lcd_putsf("5");
    }else
    if(!Senser3){ // slow1 left
    VT_B = VTB_Slow1;
    VT_A = VTA_M;
    lcd_gotoxy(0,1);
    lcd_putsf("6");

    }else
    if(!Senser4){ // slow1 right
    VT_B = VTB_M;
    VT_A = VTA_Slow1;
    lcd_gotoxy(0,1);
    lcd_putsf("7");
    }

    }
    }
    Đoạn chương trình trên chúng ta có thể thấy chương trình luôn luôn quét các kênh ADC và luôn kiểm tra các sensor và đưa ra các tốc độ hợp lý .
    Bài toán cần giải quyết đó là ROBOT đi thẳng không bị lắc khi đó tuỳ theo tốc độ của động cơ chúng ta phải đưa ra các cấp độ khác nhau .

    3, ROBOT đi và đếm các vạch ngang :
    Chúng ta dùng thuật toán kiểm tra các sensor , bình thường khi ROBOT đi theo vạch trắng thì không có trường hợp nào quá 2 sensor cùng lúc đều chạm vạch chính chúng ta lợi dụng nguyên tắc này để kiểm tra sensor khi đi qua vạch ngang vì lúc này hầu hết các sensor đều chạm vạch .
    thụât toán đếm vạch như sau:




    demvach=0;
    flagvach=1;

    while(demvach<d) // kiem tra so vach < d
    {
    GO_ON(VTA_M,VTB_M) ;
    if((!Senser1)&&(!Senser2)&&(!Senser5)&&(!Senser6)& &(flagvach)) //kiem tra sensor nhan vach
    {
    if((!Senser1)&&(!Senser2)&&(!Senser5)&&(!Senser6))
    { flagvach=0;
    // demvach++;
    GO_ON(VTA_M,VTB_M) ;
    // lcd_gotoxy(5,1) ;
    // lcd_putnum(demvach);
    }
    }
    if((Senser1)&&(Senser2)&&(Senser5)&&(Senser6)&&(!f lagvach) )
    { flagvach=1; //kiem tra thoat vach
    demvach++;
    lcd_gotoxy(5,1) ;
    lcd_putnum(demvach);

    }
    }
    Như đoạn chương trình trên chúng ta kiểm tra 4 sensor ở 2 bên để đếm vạch.
    Nhiệm vụ:
    - Thiết lập được các chế độ vào /ra ứng với các chân điều khiển được thiết kế bởi phần cứng có sẳn.
    - Thiết lập và sử dụng các biến .
    - Thiết lập sử dụng PORTA làm đầu vào của các kênh ADC.
    - Viết chương trình đọc giá trị ADC hiển thị trên LCD .
    - Viết thuật toán tìm giá trị ADCtb (dùng làm ngưỡng cho mỗi kênh).
    - Viết thuật toán đọc giá trị từ bàn phím và lưu giá trị vào biến EEPROM.
    - viết thuật toán phân cấp tốc độ động cơ.
    - Viết chương trình kiểm tra giá trị SENSOR để điều khiển tốc độ động cơ.
    - Viết chương trình cho robot tại vùng xuất phát không vạch.
    - Viết chương trình cho ROBOT rẽ trái , phải.
  5. pro_and_brao Moderator

    Số bài viết: 484
    Đã được thích: 8
    Điểm thành tích: 18
    ủng hộ anh Hài!
    thật khó để so sánh giữa pic va avr em nào tốt hơn.khi mà nhận xét trên cơ sở ứng dụng chung chung nhất.
    tuy nhiên về số lượng và giá cả trên thị trường hiện nay PIC dể mua hơn nhiều so với AVR.
    PIC đa dạng hơn và đặc biệt lập trình dể chịu hơn...
    mới học anh em nên học PIC luôn.
  6. ngoctrai90 New Member

    Số bài viết: 10
    Đã được thích: 0
    Điểm thành tích: 0
    Giúp mình đồ án này với ! Help ! ! !

    chân thành cảm ơn anh thanhkht :D
    em đang vướng phải phần chuyển đổi ADC, khi lấy điện áp ngõ ra ở các quang trở em cấp trực tiếp vào port A.0>>>A.7. và hiện giờ thì em ko biết phải lập trình sao để AVR nhận các giá trị đó và chuyển đổi thành các mức [0] và [1]. sau đó mới viết chương trình dò line cho robot .
    rất mong mọi người bỏ chút thời gian giúp đỡ mình! hic!






    cho em hỏi thêm :kênh ADC của AVr có sử dụng các mức điện áp V ref( do mình cấp vào) và V nội(2.56v), 2 điện áp này đc dùng làm điện áp chuẩn để so sánh. vậy khi lập trình thì mình nên dùng cái nào vậy?

Chia sẻ trang này