Thông báo

Collapse
No announcement yet.

[help] hiển sỗ xung của encoder lên LCD

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

  • #16
    để put data ra lcd có thể đơn giản là dùng thư viện stdio.h nếu không chú trọng đến thời gian xử lí.
    val: biến data cần hiển thị.
    buff_size: số kí tự tối đa cần hiển thị lên lcd, nếu data val cần hiển thị là char thì nó là 3, int là 5.

    uchar buff[buff_size];
    sprintf(buff,"%d",val);
    lcd_gotoxy(x,y); // trỏ đến chỗ nào mà ban muốn hiển thị.
    lcd_puts(buff);

    thế là xong. tuy nhiên sẽ tốn tí thời gian cho dòng lênh sprintf.

    Comment


    • #17
      Nguyên văn bởi soulasylum Xem bài viết
      thui vậy, các bác bầy cho em cách điều chỉnh động cơ đi thẳng
      điều chế xung bằng nhau hay hỗ trợ cho nhau?
      thuật toán ntn?
      để cho robot đi thẳng dựa vào cái encoder thì bạn phải làm phần cơ khí thật chuẩn, đường kính của 2 bánh xe phải bằng nhau. gắn 2 encoder trên 2 bánh.
      để điều khiển tốc độ động cơ thì bạn có thể nghiên cứu về pid.
      còn nếu đơn giản thì bạn đọc về số xung encoder trên 2 bánh/1 đơn vị thời gian (có thể là s, ms tùy thuộc vào tốc độ động cơ mà bạn mong muốn), so sánh 2 số này và thay đổi hệ số điều xung.

      Comment


      • #18
        Nguyên văn bởi soulasylum Xem bài viết
        thui vậy, các bác bầy cho em cách điều chỉnh động cơ đi thẳng
        điều chế xung bằng nhau hay hỗ trợ cho nhau?
        thuật toán ntn?
        Phần điều khiển động cơ mình cũng chưa làm thực tế nên không giúp được bạn rồi. Về nguyên tắc để động cơ đi thẳng bạn phải so sánh xung đưa về từ 2 encoder bánh trái và bánh phải. Thằng nào ít hơn thì tăng dutycycle của cái PWM bánh đó lên. Để điều khiển nhanh ổn định thì nên dùng PID. Mình nghĩ như vậy nhưng thực tế có làm được không thì mình không chắc . Pác nào nhiều kinh nghiệm vào hướng dẫn bạn ấy cái nhỉ
        123...

        Comment


        • #19
          để so sánh phase A va B của encoder xem thằng nào sớm hay muộn pha hơn ta phải làm thể nào?

          Comment


          • #20
            Nguyên văn bởi soulasylum Xem bài viết
            để so sánh phase A va B của encoder xem thằng nào sớm hay muộn pha hơn ta phải làm thể nào?
            để so sánh 2 pha của encoder thì cần biết đến dạng sóng tại chân ngõ ra.



            như vậy bạn chỉ việc dò cạnh của nó là biết ngay mà.
            giả sử bạn dò cạnh lên: nếu cạnh lên pha A trước thì nó sớm pha hơn và ngược lại nếu cạnh lên của pha B trước thì pha B sớm pha hơn.
            phương pháp: cho pha B vào chân ngắt và set cho ngắt cạnh lên, pha A cho vào chân bất kì. khi có ngắt xảy ra thì kiểm tra chân ở pha A xem nó đang ở mức cao hay mức thấp. nếu pha A ở mức cao thì pha A sớm pha hơn pha B và ngược lại nếu pha A đang ở mức thấp thì pha B sớm pha hơn pha A.

            thân!
            Last edited by dt_love; 20-08-2009, 12:01.

            Comment


            • #21
              Nguyên văn bởi dt_love Xem bài viết
              để cho robot đi thẳng dựa vào cái encoder thì bạn phải làm phần cơ khí thật chuẩn, đường kính của 2 bánh xe phải bằng nhau. gắn 2 encoder trên 2 bánh.
              để điều khiển tốc độ động cơ thì bạn có thể nghiên cứu về pid.
              còn nếu đơn giản thì bạn đọc về số xung encoder trên 2 bánh/1 đơn vị thời gian (có thể là s, ms tùy thuộc vào tốc độ động cơ mà bạn mong muốn), so sánh 2 số này và thay đổi hệ số điều xung.
              so sánh 2 encoder này như thế nào hả bác?

              Comment


              • #22
                Nguyên văn bởi soulasylum Xem bài viết
                so sánh 2 encoder này như thế nào hả bác?
                thì giống như bác nbbi3 đã nói ở trên đấy.
                nếu như bạn làm được phần cơ khí chuẩn nghĩa là đường kính tiếp xúc thực của 2 bánh bằng nhau (nghĩa là nếu 2 bánh này quay được một vòng thì quãng đường đi được của 2 bánh là như nhau. lúc này bạn sử dụng 2 encode cùng độ phân giải thì xung trả về trên 2 bánh sẽ tương đương nhau. (nghĩa là khi 2 bánh trả về cùng số xung thì quãng đường đi của 2 bánh sẽ bằng nhau). lúc này bạn chỉ việc đọc encode về và so sánh, nếu bên nào lớn hơn thì giảm D(hệ số điều xung), và bên nào nhỏ hơn thì tăng D của nó, lượng tăng giảm tùy thuộc vào độ sai lệch của encode đọc về, nếu sai lệch lớn thì lượng tăng giảm này lớn và ngược lại. vậy là ok. thời gian đọc encode tùy thuộc vào tốc độ của động cơ bạn làm rồi chọn thời gian cho hợp lí là được.

                cần chú ý nữa là khi thay đổi hệ số điều xung thì bạn cần giới hạn giá trị min và max để tránh bị tràn.

                còn nếu như 2 bánh không đều hoặc encode ko đều thì bạn phải cho nó chạy thực tế và kiểm tra xem khi 2 bánh quay để đi được một đoạn đường bằng nhau thì tỉ lệ encode trả về là bao nhiêu (giả sử khi quay để đi được 5cm, encode trái trả về 100 xung, encode phải trả về 150 xung thì tỉ lệ này là 2:3) và đây là tỉ lệ cân bằng của encode. bạn dựa vào đây để điều khiển động cơ như ở trường hợp trên.

                Comment


                • #23
                  bạn dùng hàm itoa thử xem nào...mất có 4 dòng lệnh à...

                  Comment


                  • #24
                    Nguyên văn bởi HiMas88 Xem bài viết
                    bạn dùng hàm itoa thử xem nào...mất có 4 dòng lệnh à...
                    hàm itoa để làm gì vậy bạn. put data ra LCD ah.

                    ..mất có 4 dòng lệnh à.. là 4 dòng trong C hay trong asm? nếu là trong C thì cần kiểm tra xem 4 dòng đó khi dịch qua bên asm tốn bao nhiêu dòng và cần bao nhiêu ck để thực hiện nó...

                    Comment


                    • #25
                      híc vấn đề lại nảy sinh tiếp;
                      về cách điều khiển cho chạy thẳng thì không còn gì phải bàn nữa
                      típ, nếu dùng atmega128 thì final
                      nhưng dùng atmega8 thì có được không
                      em đọc data sheet nó có 3 timer/counter
                      timer0 có chế độ interrupt overflow và có detect rising hay fall egde(có thể cho tín hiệu từ encoder1 vào đõ để đếm xung)
                      timer1 em cho làm nhiệm vụ PWM cho DC1 và DC2 thông qua OC1A và OC1B
                      đến thằng timer 2 thì có Out put compare và interrupt overflow nhưng nó không detect risng hay falling egde thế thì làm sao đếm xung từ encoder2??
                      híc huhu

                      Comment


                      • #26
                        ặc... đến đây thì hơi mệt rồi nhỉ.
                        có mấy cách giải quyết nếu bạn muốn sử dụng con Mega8 dk 2dco với 2 chân PWM và đếm 2 encode:
                        đếm encode bằng ngắt.và sử dụng timer điều xung.
                        phương pháp này chỉ nên sử dụng khi tần số xung ngắt của bạn tương đối nhỏ, còn nhỏ bao nhiêu thì tùy phần mềm và lượng thông tin cần xử lí trong ctrinh của bạn, vì cứ mỗi lần có xung là bạn phải nhảy vào để tăng biến đếm, nếu như tần số xung lớn thì.. thôi rồi.. con cpu của bạn chỉ có đứng đó mà đếm thôi chứ chẳng xử lí được j đâu. vì khi ngắt thì hình như là nó cần 4ck từ lúc có tác động ngắt để cất vài thông tin trước khi jum, sau đó jum đến dịa chỉ interrupt, thực hiện xong, nó lại mất 4ck để trờ về chỗ đang xử lí dở dang, rồi nó phải xử lí it nhất một lệnh trước khi nhận int kế tiếp. sơ ở trên thì nó đã mất ít nhất 12ck rồi, chưa kể mấy ck xử lí trong interrupt nữa, đó là đang nói đến asm chứ nếu xài C thì.. còn thêm một mớ ck nữa do trình dịch thêm..hic. nếu mà xung encode trả về vài trăm khz thì trong lúc đọc encode chương trình chính của bạn coi như toi.

                        c2: dùng T0 và T1 để đếm encode, dùng T2 để điều xung bằng phần mềm.
                        ở phần này thì tần số PWM sẽ thấp còn chi tiết thế nào thì bạn thử tìm trên diễn đàn xem sao, có mấy toppic cũng đang bàn về cái này đấy. bạn tìm ko ra thì mình giải thích chỗ này sau

                        còn một cách nữa mà mình chưa xài nên ko chắc, nhưng nếu dùng được thì.. chạy êm ru luôn.
                        dùng T1 để PWM, T0 và T2 để counter encode.
                        T0 và T1 thì chắc khỏi cần nhắc lại, còn cái T2 tuy là nó không có chế độ đếm sự kiên ngoài nhưng mà nó có chế độ chạy bởi xung clk bên ngoài ở chế độ bất đồng bộ, mà nó dùng thạch anh 32K giờ bạn thử đưa xung vào chân TOSC1 xem sao. đọc trong datasheet thì mình nghĩ là có thể dùng được.

                        thân!

                        Comment


                        • #27
                          Nguyên văn bởi dt_love Xem bài viết
                          ặc... đến đây thì hơi mệt rồi nhỉ.
                          có mấy cách giải quyết nếu bạn muốn sử dụng con Mega8 dk 2dco với 2 chân PWM và đếm 2 encode:
                          đếm encode bằng ngắt.và sử dụng timer điều xung.
                          phương pháp này chỉ nên sử dụng khi tần số xung ngắt của bạn tương đối nhỏ, còn nhỏ bao nhiêu thì tùy phần mềm và lượng thông tin cần xử lí trong ctrinh của bạn, vì cứ mỗi lần có xung là bạn phải nhảy vào để tăng biến đếm, nếu như tần số xung lớn thì.. thôi rồi.. con cpu của bạn chỉ có đứng đó mà đếm thôi chứ chẳng xử lí được j đâu. vì khi ngắt thì hình như là nó cần 4ck từ lúc có tác động ngắt để cất vài thông tin trước khi jum, sau đó jum đến dịa chỉ interrupt, thực hiện xong, nó lại mất 4ck để trờ về chỗ đang xử lí dở dang, rồi nó phải xử lí it nhất một lệnh trước khi nhận int kế tiếp. sơ ở trên thì nó đã mất ít nhất 12ck rồi, chưa kể mấy ck xử lí trong interrupt nữa, đó là đang nói đến asm chứ nếu xài C thì.. còn thêm một mớ ck nữa do trình dịch thêm..hic. nếu mà xung encode trả về vài trăm khz thì trong lúc đọc encode chương trình chính của bạn coi như toi.

                          c2: dùng T0 và T1 để đếm encode, dùng T2 để điều xung bằng phần mềm.
                          ở phần này thì tần số PWM sẽ thấp còn chi tiết thế nào thì bạn thử tìm trên diễn đàn xem sao, có mấy toppic cũng đang bàn về cái này đấy. bạn tìm ko ra thì mình giải thích chỗ này sau

                          còn một cách nữa mà mình chưa xài nên ko chắc, nhưng nếu dùng được thì.. chạy êm ru luôn.
                          dùng T1 để PWM, T0 và T2 để counter encode.
                          T0 và T1 thì chắc khỏi cần nhắc lại, còn cái T2 tuy là nó không có chế độ đếm sự kiên ngoài nhưng mà nó có chế độ chạy bởi xung clk bên ngoài ở chế độ bất đồng bộ, mà nó dùng thạch anh 32K giờ bạn thử đưa xung vào chân TOSC1 xem sao. đọc trong datasheet thì mình nghĩ là có thể dùng được.

                          thân!
                          hic tuong test được bằng atmega8...nhưng cũng không được bác ah...
                          c1 thì không ổn rùi vì như bác viết em hiểu bác dùng ngắt ngoài..
                          c2 T2 chỉ có một cổng điều xung(PWM)-->không đủ
                          c3 ban đầu em cũng nghĩ như bác nhưng khi sử dụng clk bên ngoài chắc chắn sẽ sai sô xung của encoder nhiều...
                          híc huhu chả nhẽ lại bỏ ra 100k mua hẳn con 128 về ah??
                          mà chỉ test thui thì nhỡ có mệnh hệ gì...thì ...huhu công toi...
                          bác bảo như thế nào cho tiết kiệm bây giờ??

                          Comment


                          • #28
                            Nguyên văn bởi soulasylum Xem bài viết
                            hic tuong test được bằng atmega8...nhưng cũng không được bác ah...
                            c1 thì không ổn rùi vì như bác viết em hiểu bác dùng ngắt ngoài..
                            c2 T2 chỉ có một cổng điều xung(PWM)-->không đủ
                            c3 ban đầu em cũng nghĩ như bác nhưng khi sử dụng clk bên ngoài chắc chắn sẽ sai sô xung của encoder nhiều...
                            híc huhu chả nhẽ lại bỏ ra 100k mua hẳn con 128 về ah??
                            mà chỉ test thui thì nhỡ có mệnh hệ gì...thì ...huhu công toi...
                            bác bảo như thế nào cho tiết kiệm bây giờ??
                            mình nói là điều xung bằng phần mềm... chỉ cần 1 timer bạn muốn chơi ra mấy cái pwm cũng được chứ nói j đến 2 cái.

                            tại sao sử dụng clk ngoài lại bị sai số xung của encode? bạn thử chưa

                            Comment


                            • #29
                              Nguyên văn bởi dt_love Xem bài viết
                              mình nói là điều xung bằng phần mềm... chỉ cần 1 timer bạn muốn chơi ra mấy cái pwm cũng được chứ nói j đến 2 cái.

                              tại sao sử dụng clk ngoài lại bị sai số xung của encode? bạn thử chưa
                              phần mềm gì hả bác??có ngốn ram cua cpu không?
                              bác bầy cho em cách chơi phần mềm với

                              Comment


                              • #30
                                Nguyên văn bởi soulasylum Xem bài viết
                                phần mềm gì hả bác??có ngốn ram cua cpu không?
                                bác bầy cho em cách chơi phần mềm với
                                ram thì tốn thêm vài byte, cpu thì xử lí thêm mớ lệnh nữa. cái này mình có viết trên diễn đàn rồi mà ko nhớ ở toppic nào, để tìm lại đã

                                Comment

                                Về tác giả

                                Collapse

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

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

                                Collapse

                                Đang tải...
                                X