Thông báo

Collapse
No announcement yet.

Tìm sư phụ FPGA...

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

  • Tìm sư phụ FPGA...

    Thân chào tất cả các member của dientuvietnam.
    Qua một thời gian nghiên cứu và làm việc với VĐK trong lĩnh vực điều khiển tự động IRF540 nhận thấy rằng có rất nhiều ứng dụng không thể giải quyết được chỉ bằng VĐK cho dù sử dụng VĐK chạy với tốc độ rất cao. Qua tìm hiểu IRF540 nhận thấy rằng FPGA là cái IRF540 cần học để giải quyết những ứng dụng mình đang ấp ủ. Vì IRF540 không phải chỉ nghiên cứu FPGA mà muốn ứng dụng FPGA vào xử lý những vấn đề mình đang vấp phải phục vụ cho các thiêt bị tự động sử dụng trong công nghiệp vì vậy IRF540 muốn tiếp cận FPGA thật nhanh chóng. Qua tìm hiểu IRF540 cũng biết trên diễn đàn mình cũng có rất nhiều member giỏi về FPGA, IRF540 tha thiết muốn được tìm một sư phụ nhiệt tình chỉ bảo cho mình về vấn đề này. Vì phục vụ cho công việc nên IRF540 cũng biết phải cư xử như thế nào cho thỏa đáng. Về trình độ thì mình nghĩ mình có thể tiếp thu được.
    Xin tự giới thiệu chút xíu. Hiện IRF540 là chủ một doanh nghiệp tư nhân nhỏ hoạt động trong nghành điều khiển tự động và CNC. Sản phẩm của công ty chủ yếu phục vụ trong ngành CNC và điều khiển tự động. Đây là lần thứ 2 mình tìm sư phụ trên diễn đàn DTVN. lần đầu mình may mắn gặp được anh Phùng Thế Vũ (chủ website ARM Việt Nam > Trang chủ |) và đã được anh Vũ nhiệt tình giúp đỡ, rất hy vọng lần này IRF540 được may mắn thêm một lần nữa.
    Cám ơn tất cả các Member đã đọc bài này.
    Chúc các bạn sức khỏe và thành công.
    Cty TNHH Cơ Điện tử Hiệp Phát.
    ------------------------------------------
    Trần Hoàng Giang
    11-04-1985

    Mobil: 0905 438 533

  • #2
    Chào bạn Giang,
    Sẽ rất bổ ích cho diễn đàn nếu bạn hỏi và post lên diễn đàn:
    - Có ích vì sẽ có nhiều người đọc và cho bạn nhiều ý kiến
    - Có ích vì bạn là một người mới tiếp cận FPGA
    - Có ích vì trong đầu bạn đã có sẵn mụch đích tìm hiểu FPGA đề giải quyết bài toán thực tế gì, không phải làm chơi cho dzui như các bạn sinh viên.
    Bạn cứ post câu hỏi đi, những gì mình trả lời được sẽ trả lời.

    Comment


    • #3
      Rất cám ơn Jefflieu đã trả lời bài viết của mình.
      Tại vì mỗi người học và ứng dụng vào mục đích riêng cho ngành làm việc của mình nên cũng có nhiều điều khó giải thich với những ứng dụng của mình được nhưng ok mình sẽ thử làm theo cách của jefflieu. Mình sẽ post 1 và ứng dụng mà mình làm bằng VDK mà cảm thấy khó khăn về mặt đáp ứng tốc độ xem chúng ta sẽ giải quyết bài toán đó bằng FPGA như thế nào nhé. Hy vọng qua ứng dụng thực tế như vậy mình sẽ tìm được cách tiếp cận với FPGA phù hợp với mục đích sử dụng của mình.

      Mô tả ứng dụng Gear Electric (hộp số điện tử):
      Hệ thống mình đã làm sử dụng 1 VDK ARM cortex M3 tốc độ 150DMIPS - STM32F205VET6
      VDK đọc một encoder 12500 xung/ vòng (2 phase A,B) mode x4 .VDK này có hỗ trợ đọc encoder phần cứng nên không sử dụng ngắt khi đọc encoder chỉ có sự kiện ngắt khi thanh ghi đọc encoder (TIM2->CNT) tràn.
      Encoder được gắn vào một motor quay tốc độ tối đa 2000rpm.
      Yêu cầu VDK tình toán và xuất ra ngõ out giả lập một encoder với 2000xung/vòng (2 Phase A,B), encoder giả lập đó phải có tốc độ đáp ứng nhanh hơn sự trể 1xung/8000xung (2000xung/vòng mode x4) và vẫn đáp ứng được khi motor chạy hết tốc độ (2000rpm).

      - giải quyết bằng phần mềm như sau:
      + vì VDK trên đã hỗ trợ đọc encoder phần cứng nên chương trình không cần quan tâm đến quá trình đọc và chỉ lấy thanh ghi giá trị này ra sử dụng.
      + bỏ qua các ngắt tràn thanh ghi này cho dễ hiểu. Mình đã xử lý chỗ này rồi.
      + các biến sử dụng trong chương trình chính:
      . EncPositionCurrent: thể hiện giá trị xung encoder đã được VDK đọc vào từ encoder 12500x/v
      . EncPositionDesire: thể hiện giá trị xung encoder đầu ra đã thự hiện được.
      . EncoderPulseState: thể hiện trạng thái xung A,B của encoder ngõ ra (1 encoder 2 phase A,B phải có 4 trạng thái liền kề nhau về logic: 00,01,11,01)
      + tốc độ đáp ứng phụ thuoc vao thời gian tính toán và thực hiện đoạn chương trình sau.


      Code:
      while(1)
               {
                   EncPositionCurrent=TIM2->CNT;//doc gia tri tu thanh ghi ngo vao encoder   
                   EncPositionCurrent=EncPositionCurrent*8000/50000;//tinh ti le cho encoder dau ra
                   
                  if(EncPositionCurrent>EncPositionDesire)//neu so xung encoder doc vao (da tinh ti le) lon hon so xung encoder dau ra da thuc hien thi phat 1 xung encoder ngo ra -> chieu tang
                       {
                           EncPositionDesire++;
                           EncoderPulseState++;
                       }
                           
                  else if(EncPositionCurrent<EncPositionDesire)////neu so xung encoder doc vao (da tinh ti le) nho hon so xung encoder dau ra da thuc hien thi phat 1 xung encoder ngo ra -> chieu giam
                       {
                           EncPositionDesire--;
                           EncoderPulseState--;
                       }
      
      
                   switch(EncoderPulseState)//chuyen trang thai encoder
                       {
                           case 0:
                           case 4:
                               EncoderPulseState=0;
                               ENC_OUT_PA=0;
                               ENC_OUT_PB=0;
                               break;
                               
                           case 1:
                               
                               ENC_OUT_PA=1;
                               ENC_OUT_PB=0;
                               break;
                           case 2:
                               
                               ENC_OUT_PA=1;
                               ENC_OUT_PB=1;
                               break;
                               
                           default:
                               EncoderPulseState=3;
                               ENC_OUT_PA=0;
                               ENC_OUT_PB=1;
                               break;
                       }    
               }
      kết quả khi chạy thực nghiệm : hệ thống chạy tốt nhưng chỉ đáp ứng được khi motor chạy dưới 1500rpm.
      tìm hiểu nguyên nhân:
      - đoạn chương trình trên thực hiện trong thời gian tương đương 5us. tương ứng tần số encoder đầu ra tối đa là 200khz/4 (mode x4) = 50khz
      => số vòng quay tối đa của motor mà hệ thống có thể đáp ứng được = 60*1000000/(5*4*2000) = 1500rpm.

      Đó là một ứng dụng đơn giản mà mình cảm thấy VDK quá chật vật khi phải đảm nhiệm. Nếu sử dụng VDK nhanh hơn nữa có thể thực hiện được nhưng không còn kinh tế nữa rồi.

      Nếu là FPGA mình phải bắt đầu từ đâu để giải quyết nó đây???
      Cty TNHH Cơ Điện tử Hiệp Phát.
      ------------------------------------------
      Trần Hoàng Giang
      11-04-1985

      Mobil: 0905 438 533

      Comment


      • #4
        Nguyên văn bởi irf540 Xem bài viết
        Rất cám ơn Jefflieu đã trả lời bài viết của mình.
        Tại vì mỗi người học và ứng dụng vào mục đích riêng cho ngành làm việc của mình nên cũng có nhiều điều khó giải thich với những ứng dụng của mình được nhưng ok mình sẽ thử làm theo cách của jefflieu. Mình sẽ post 1 và ứng dụng mà mình làm bằng VDK mà cảm thấy khó khăn về mặt đáp ứng tốc độ xem chúng ta sẽ giải quyết bài toán đó bằng FPGA như thế nào nhé. Hy vọng qua ứng dụng thực tế như vậy mình sẽ tìm được cách tiếp cận với FPGA phù hợp với mục đích sử dụng của mình.

        Mô tả ứng dụng Gear Electric (hộp số điện tử):
        Hệ thống mình đã làm sử dụng 1 VDK ARM cortex M3 tốc độ 150DMIPS - STM32F205VET6
        VDK đọc một encoder 12500 xung/ vòng (2 phase A,B) mode x4 .VDK này có hỗ trợ đọc encoder phần cứng nên không sử dụng ngắt khi đọc encoder chỉ có sự kiện ngắt khi thanh ghi đọc encoder (TIM2->CNT) tràn.
        Encoder được gắn vào một motor quay tốc độ tối đa 2000rpm.
        Yêu cầu VDK tình toán và xuất ra ngõ out giả lập một encoder với 2000xung/vòng (2 Phase A,B), encoder giả lập đó phải có tốc độ đáp ứng nhanh hơn sự trể 1xung/8000xung (2000xung/vòng mode x4) và vẫn đáp ứng được khi motor chạy hết tốc độ (2000rpm).

        - giải quyết bằng phần mềm như sau:
        + vì VDK trên đã hỗ trợ đọc encoder phần cứng nên chương trình không cần quan tâm đến quá trình đọc và chỉ lấy thanh ghi giá trị này ra sử dụng.
        + bỏ qua các ngắt tràn thanh ghi này cho dễ hiểu. Mình đã xử lý chỗ này rồi.
        + các biến sử dụng trong chương trình chính:
        . EncPositionCurrent: thể hiện giá trị xung encoder đã được VDK đọc vào từ encoder 12500x/v
        . EncPositionDesire: thể hiện giá trị xung encoder đầu ra đã thự hiện được.
        . EncoderPulseState: thể hiện trạng thái xung A,B của encoder ngõ ra (1 encoder 2 phase A,B phải có 4 trạng thái liền kề nhau về logic: 00,01,11,01)
        + tốc độ đáp ứng phụ thuoc vao thời gian tính toán và thực hiện đoạn chương trình sau.


        Code:
        while(1)
                 {
                     EncPositionCurrent=TIM2->CNT;//doc gia tri tu thanh ghi ngo vao encoder   
                     EncPositionCurrent=EncPositionCurrent*8000/50000;//tinh ti le cho encoder dau ra
                     
                    if(EncPositionCurrent>EncPositionDesire)//neu so xung encoder doc vao (da tinh ti le) lon hon so xung encoder dau ra da thuc hien thi phat 1 xung encoder ngo ra -> chieu tang
                         {
                             EncPositionDesire++;
                             EncoderPulseState++;
                         }
                             
                    else if(EncPositionCurrent<EncPositionDesire)////neu so xung encoder doc vao (da tinh ti le) nho hon so xung encoder dau ra da thuc hien thi phat 1 xung encoder ngo ra -> chieu giam
                         {
                             EncPositionDesire--;
                             EncoderPulseState--;
                         }
        
        
                     switch(EncoderPulseState)//chuyen trang thai encoder
                         {
                             case 0:
                             case 4:
                                 EncoderPulseState=0;
                                 ENC_OUT_PA=0;
                                 ENC_OUT_PB=0;
                                 break;
                                 
                             case 1:
                                 
                                 ENC_OUT_PA=1;
                                 ENC_OUT_PB=0;
                                 break;
                             case 2:
                                 
                                 ENC_OUT_PA=1;
                                 ENC_OUT_PB=1;
                                 break;
                                 
                             default:
                                 EncoderPulseState=3;
                                 ENC_OUT_PA=0;
                                 ENC_OUT_PB=1;
                                 break;
                         }    
                 }
        kết quả khi chạy thực nghiệm : hệ thống chạy tốt nhưng chỉ đáp ứng được khi motor chạy dưới 1500rpm.
        tìm hiểu nguyên nhân:
        - đoạn chương trình trên thực hiện trong thời gian tương đương 5us. tương ứng tần số encoder đầu ra tối đa là 200khz/4 (mode x4) = 50khz
        => số vòng quay tối đa của motor mà hệ thống có thể đáp ứng được = 60*1000000/(5*4*2000) = 1500rpm.

        Đó là một ứng dụng đơn giản mà mình cảm thấy VDK quá chật vật khi phải đảm nhiệm. Nếu sử dụng VDK nhanh hơn nữa có thể thực hiện được nhưng không còn kinh tế nữa rồi.

        Nếu là FPGA mình phải bắt đầu từ đâu để giải quyết nó đây???
        - Việc đầu tiên bạn cần làm là suy nghĩ theo lối của thiết kế phần cứng. Khi thiết kế phần cứng, thường sẽ vẽ các khối ra và chia nhỏ các khối đến khi đơn giản hơn. Khoan suy nghĩ sử dụng phần mềm nào.
        - Nếu theo bài toán của bạn, có thể vẽ hệ thống phần cứng ra như sau:

        (1) Khối tính tỉ lệ (Scaling) khối này chuyển input EncPositionCurrent sang EncPositionCurrent_Scaled = EncPositionCurrent*8000/50000
        (2) Trong các khối tính toán, máy trạng thái thường được sử dụng để đồng bộ tất cả các hoạt động của hệ thống. Khối máy trạng thái: máy trạng thái sẽ thay đổi trạng thái theo input, máy trang thái sẽ thực hiện vòng switch của bạn.
        (3) Khối output:
        (a) Khối tính EncPositionDesire, khối này chỉ dựa vào input và không dựa vào state.
        (b) Khối tính A và B, A và B hoàn toàn phụ thuộc vào state.


        Việc thứ 2 là bạn cần tìm hiểu nếu bạn chưa hiểu về các thành phần của mạch số:
        - Flip-flop, mạch multiplexing

        Việc thứ 3 là bạn học 1 trong 2 ngôn ngữ VHDL hoặc Verilog để mô tả thiết kế của bạn, trong đó quan trọng là:
        - Làm thế nào để mô tả Flip-flop: D-flip-flop, D-Flip-flop với cổng Enable

        Việc thứ 4 là học sử dụng phần mềm.


        Viết sơ một khối tính tỉ lệ bằng Verilog:

        module Scaling(
        input clk,
        input rst,
        input [15:00] EncPosCurrent,
        input EncPosCurrent_valid,
        output [15:00] EncPosCurrentScaled,
        output EncPosCurrentScale_Valid)

        reg [31:00] ScaledUp; //Thay vì thực hiện *8000/50000 mình thực hiện : *10486/65536

        always@(posedge clk)
        begin

        //Tín hiệu ở đầu ra báo hiệu EncPosCurrentScale đúng sẽ chậm hơn 1 cycle so với EncPosCurrent_valid
        EncPosCurrentScale_valid <= EncPosCurrent_valid;

        //Khi có 1 xung báo hiệu giá trị EncPosCurrent đã đúng, có thể đọc được, khối sẽ tính phép tính nhân.
        // PHép tính nhân mất 1 clock cycle,
        if (EncPosCurrent_valid)
        ScaledUp <= EncPosCurrent*10486;
        end

        assign EncPosCurrentScaled = ScaledUp[31:16]; // bỏ đi 16 bit cuối cùng == chia cho 65536


        endmodule

        Sau đó bạn sẽ kết nối các khối lại với nhau thành hệ thống. Bạn cứ nghiên cứu rồi hỏi tiếp.

        Comment


        • #5
          Các input và output thay đổi giá trị như sau:
          Click image for larger version

Name:	Scaling.png
Views:	1
Size:	10.6 KB
ID:	1354523

          Comment

          Về tác giả

          Collapse

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

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

          Collapse

          Đang tải...
          X