Thông báo

Collapse
No announcement yet.

Hỗ trợ code PIC - điều khiển động cơ bước - hiển thị LCD

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

  • Hỗ trợ code PIC - điều khiển động cơ bước - hiển thị LCD

    Tình hình là em tự mò mẫm học PIC, viết bằng C.
    Em viết được chương trình với lưu đồ cơ bản thế này:


    code của em như sau:

    Code:
    // Truong trINH dieu khien dong co buoc 1.8* 
    // a1 = B0
    // a2 = B1
    // b1 = B2
    // b2 = B3
    // LCD:
    // D7 = RD7
    // D6 = RD6
    // D5 = RD5
    // RS = RD2
    // RW = GND
    // E  = RD3
    
    //-------------------------------------------------------------------------------------------------------------------------------------------------------------
    
    #include<16f877a.h>
    #include<def_877a.h>
    #FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
    #use delay(clock=12000000)
    #include<lcd_lib_4bit.h>
    #byte PORTA=0x05
    #byte PORTB=0x06
    #byte PORTC=0x07
    #byte PORTD=0x08
    #byte PORTE=0x09
    #use fast_io(b)
    #use fast_io(d)
    int8 tram,chuc,donvi,nghin;
    int8 start=0;
    int16 temp;
    int16 i=0;										// i = buoc
    void hien_thi(int16 i);
    void thiet_lap(int8 start);
    void main()
    {
    	LCD_init();
    	set_tris_d(0);
    	while(true)
    		{
    //-------------------------------------------------------------------------------------------------------------------------------------------------------------
    //														   QUAY THUAN
    		set_tris_b(0);
    		if(start==0)
    			{
    			thiet_lap((int8) start);
    			}
    			if(i==0)
    				{
    				start=0;
    				thiet_lap((int8) start);
    				}
    				for(;i>0;)
    					{
    						output_low(PIN_B0);					
    						output_low(PIN_B2);					
    						i--;
    						hien_thi((int16) i);
    						delay_ms(50);
    						output_high(PIN_B0);				
    						i--;
    						hien_thi((int16) i);
    						delay_ms(50);
    						output_low(PIN_B1);					
    						i--;
    						hien_thi((int16) i);
    						delay_ms(50);
    						output_high(PIN_B2);				
    						i--;
    						hien_thi((int16) i);
    						delay_ms(50);
    						output_low(PIN_B3);					
    						i--;
    						hien_thi((int16) i);
    						delay_ms(50);
    						output_high(PIN_B1);				
    						i--;
    						hien_thi((int16) i);
    						delay_ms(50);
    						output_low(PIN_B0);				
    						i--;
    						hien_thi((int16) i);
    						delay_ms(50);
    						output_high(PIN_B3);			
    						i--;
    						hien_thi((int16) i);
    					}
    		}
    
    }
    //-------------------------------------------------------------------------------------------------------------------------------------------------------------
    void hien_thi(int16 i)	
    // TACH SO				
    	{
    	if(start==1)
    		{
    		for(;i<=0;)
    			{
    			LCD_putcmd(0x01);
    			while(TRUE)
    				{
    				LCD_putcmd(134);
    				Printf(LCD_putchar"XONG");
    				}
    			}
    		}
    		nghin = i / 1000;
    		temp = i % 1000;
    		tram = temp / 100;
    		temp = temp % 100;
    		chuc = temp / 10;
    		donvi = temp % 10;
    
    //-------------------------------------------------------------------------------------------------------------------------------------------------------------	
    // HIEN SO				
    		LCD_putcmd(128);
    		Printf(LCD_putchar"STEP=%u",nghin);
    		LCD_putcmd(134);
    		Printf(LCD_putchar"%u",tram);
    		LCD_putcmd(135);
    		Printf(LCD_putchar"%u",chuc);
    		LCD_putcmd(136);
    		Printf(LCD_putchar"%u",donvi);
    	}
    
    //-------------------------------------------------------------------------------------------------------------------------------------------------------------
    
    void thiet_lap(int8 start)
    	{
    	while(TRUE)
    		{
    		set_tris_a(0xff);
    		if(input(PIN_A0)==0)
    			{
    			delay_ms(20);
    			if(input(PIN_A0)==0)
    				{
    				i++;
    				while(input(PIN_A0)==0)
    					{
    					// khong lam gi, cho buong nut nhan ra
    					}
    				}
    			}
    			hien_thi((int16) i);
    			if(input(PIN_A1)==0);
    				{
    				while(input(PIN_A1)==0);
    				delay_ms(20);
    				start=1;
    				return;
    				}
    		}
    	}
    
    //	END
    //-------------------------------------------------------------------------------------------------------------------------------------------------------------
    Ý em muốn bấm chọn số bước, rồi bấm start thì động cơ chạy, trừ dần số bước đến = 0 thì dừng.
    Mà không hiểu sao vừa bấm chọn bước thì từ 0000 nó nhảy lên 6k mấy

    Anh/chị nào chỉ em sai ở đâu với
    Đàn em vừa vào nghề, mong anh/chị chỉ giáo

    File code + mô phỏng: Chia sẻ file trên Zing Me

  • #2
    Giờ buồn ngủ rồi, ngủ đã.

    Comment


    • #3
      mình làm thế này , bước đầu cài tốc độ đc = nút bấm . vd 500rpm , quay thuận .. sau đó cho con vi điều khiển tính toán ra độ trễ giữa các bước ,vì đk đc bước là đk truyền thẳng nên chả phản hồi tốc độ làm gì(nếu muốn chính xác thì cho thêm khâu phản hồi) .. công thức tính trễ theo mình như thế này:
      đầu vào : n vòng/phút (cái nè do mình đặt) , động cơ bước x độ/bước(cái này do motor bạn chọn )-tức phải bước 360/x= a bước mới đủ 1 vòng-360 độ)
      tính toán: n vòng/phút => T=60/n (s/vòng)
      từ T=60/n kết hợp a bước=1vòng => thời gian trễ giữa các bước = 60/(n*a) (giây) = (60*10^6 )/(n*a) (us/bước) .sai số phép tính chỉ vài microgiây . xong phần tính toán .nếu bạn dùng chế độ Full Step thì chỉ cần cho thời gian delay mỗi xung = thời gian trễ giữa các bước(vì 1 xung phát ra tương ứng 1 bước -tỷ lệ 1:1 )

      giống kiểu như điều khiển PWM (điều chỉnh độ rộng xung thôi)

      Comment

      Về tác giả

      Collapse

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

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

      Collapse

      • bqviet
        Trả lời cho Đấu tắt điện cho máy tính bảng
        bởi bqviet
        Bqv cáo lỗi vì chưa đủ khả năng diễn giải để người đọc hiểu. Người làm kỹ thuật sâu đôi khi như thế đó. Về việc nạp pin không vào dù cell mới, khả năng cái mạch quản lý đó đã hỏng - cũng chính là nguyên nhân đám cell cũ hỏng từ đầu.
        06-12-2025, 17:17
      • nguyendinhvan
        Trả lời cho Xin hỏi về mạch thu FM/AM trong catsette
        bởi nguyendinhvan
        Theo tôi, nó chỉ là cái Tuy- ê - nơ, hoặc là khối Trung Văn Tần, nó một phần trong cái Da đì ô thôi. Vì có thấy một chỗ có ba chân hàn, giiống như chân Cờ rít sờ tăng 455 ki nô hẹc. Còn khối Tuy ê nơ thì không nhìn thây cái Di ốt Va di cáp...
        05-12-2025, 19:59
      • afrendly
        Trả lời cho Đấu tắt điện cho máy tính bảng
        bởi afrendly
        Có vẻ ngoài hiểu biết của mình rồi. Cuối cùng mình quyết định tìm mua 2 pin trên Shopee, giá 200K thay vào. Tuy nhận pin được 1%, sạc mãi không vào nhưng cũng mở được máy lên. Vậy cũng tạm. Cảm ơn bạn đã hỗ trợ nhé....
        04-12-2025, 01:27
      • nick22
        Trả lời cho Máy điện châm ?
        bởi nick22
        Đúng như bạn nói, máy điện châm hiện nay trên thị trường đã khá đa dạng về mẫu mã, chức năng và giá thành.
        01-12-2025, 13:23
      Đang tải...
      X