PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   PIC - Thiết kế và Ứng dụng (http://www.picvietnam.com/forum/forumdisplay.php?f=23)
-   -   Dùng PIC16F877A điều khiển động cơ DC. (http://www.picvietnam.com/forum/showthread.php?t=7501)

tuyetmuavienxu 05-12-2010 09:12 PM

Dùng PIC16F877A điều khiển động cơ DC.
 
2 Attachment(s)
undefinedHiện em đang làm Đồ án điều khiển động cơ DC, trầm trầy trầm trật mãi mới viết được đoạn code, em xin post lên đoạn code nhờ các anh chỉ dùm.
Code:

#include <16F877A.h>
#include <def_877A.h>
#fuses NOWDT,PUT,XT,NOPROTECT
#use delay(clock=20000000)
#use fast_io(b)

#byte portb=0x06

#bit hang1=0x06.0
#bit hang2=0x06.1
#bit hang3=0x06.2
#bit hang4=0x06.3
#bit cot1=0x06.4
#bit cot2=0x06.5
#bit cot3=0x06.6
#bit cot4=0x06.7

#define td_macdinh 80  //toc do mac dinh
#define tocdo1 124      //1/5 toc do cuc dai
#define tocdo2 248      //2/5 toc do cuc dai
#define tocdo3 372      //3/5 toc do cuc dai
#define tocdo4 496      //4/5 toc do cuc dai
#define tocdo5 620      //toc do cuc dai

int quetphim(int sttphim);
int a,sttphim;

int quetphim(int sttphim)
{
  portb=0x01;    //Cho cac hang muc 1
  portb=0x02;   
  portb=0x04;
  portb=0x08;
  portb=0xef;    // Cho cac cot muc 0
  portb=0xdf;
  portb=0xbf;
  portb=0x7f;

  if((!hang1)||(!hang2)||(!hang3)||(!hang4))    // kiem tra hang dc nhan
  {
      if(hang1==0)  // neu hang 1
      {
        portb=0x10;    // cho cac cot muc 1
        portb=0x20;   
        portb=0x40;
        portb=0x80;
        portb=0xfe;  // chuyen hang1 ve muc 0
        if(!cot1) sttphim=0;
        if(!cot2) sttphim=1;
        if(!cot3) sttphim=2;
        if(!cot4) sttphim=3;
      }

      if(hang2==0)
      {
        portb=0x10; 
        portb=0x20;   
        portb=0x40;
        portb=0x80;
        portb=0xfd;  // chuyen hang2 ve muc 0     
        if(!cot1) sttphim=4;
        if(!cot2) sttphim=5;
        if(!cot3) sttphim=6;
        if(!cot4) sttphim=7;
      }
      if(hang3==0)
      {

        portb=0x10; 
        portb=0x20;   
        portb=0x40;
        portb=0x80;
        portb=0xfb;  // chuyen hang3 ve muc 0     
        if(!cot1) sttphim=8;
        if(!cot2) sttphim=9;
        if(!cot3) sttphim=10;
        if(!cot4) sttphim=11;
      }
      if(hang4==0)
      {

        portb=0x10; 
        portb=0x20;   
        portb=0x40;
        portb=0x80;
        portb=0xf7;  // chuyen hang4 ve muc 0     
        if(!cot1) sttphim=12;
        if(!cot2) sttphim=13;
        if(!cot3) sttphim=14;
        if(!cot4) sttphim=15;
      }                 
  }
  return sttphim;
}
void main()
{
  int i=0;
  set_tris_b(0b11110000);
  enable_interrupts(global);
  enable_interrupts(int_RB);
  ext_int_edge(H_to_L);
  setup_ccp1(CCP_PWM);                  //khoi tao bo PWM1
  setup_ccp2(CCP_PWM);                  //khoi tao bo PWM2

  setup_timer_2(T2_div_by_16,154,1);    //tao chu ky xung 1ms
                                          //(1/clock)*4*t2div*(period+1)
                                          //(1/10e6)*4*16*(154+1)=1e-3=1ms
  set_pwm1_duty(0);
  set_pwm2_duty(0);
  //portb=0;
  while(true)
  {
     
      while(i==0)
      {   
        quetphim(sttphim);
        a=sttphim;
        if(a==6)    goto nhan1;
        if(a==7)    goto nhan2;
        if(a==0)
        {
            delay_ms(5);
            set_pwm1_duty(0);
            set_pwm2_duty(0);
        }
      }
      nhan1:  quetphim(sttphim);
              a=sttphim;
              if(a==1)
              {
                  delay_ms(5);
                  set_pwm1_duty(tocdo1);
                  set_pwm2_duty(0);
              }
              if(a==2)
              {
                  delay_ms(5);
                  set_pwm1_duty(tocdo2);
                  set_pwm2_duty(0);
              }
              if(a==3)
              {
                  delay_ms(5);
                  set_pwm1_duty(tocdo3);
                  set_pwm2_duty(0);
              }
              if(a==4)
              {
                  delay_ms(5);
                  set_pwm1_duty(tocdo4);
                  set_pwm2_duty(0);
              }
              if(a==5)
              {
                  delay_ms(5);
                  set_pwm1_duty(tocdo5);
                  set_pwm2_duty(0);
              };
    nhan2:    quetphim(sttphim);
              a=sttphim;
              if(a==1)
              {
                  delay_ms(5);
                  set_pwm1_duty(0);
                  set_pwm2_duty(1);
              }
              if(a==2)
              {
                  delay_ms(5);
                  set_pwm1_duty(0);
                  set_pwm2_duty(2);
              }
              if(a==3)
              {
                  delay_ms(5);
                  set_pwm1_duty(0);
                  set_pwm2_duty(3);
              }
              if(a==4)
              {
                  delay_ms(5);
                  set_pwm1_duty(0);
                  set_pwm2_duty(4);
              }
              if(a==5)
              {
                  delay_ms(5);
                  set_pwm1_duty(0);
                  set_pwm2_duty(5);
              };
     
  }
}

Đoạn code trên em có dùng hàm quét phím của anh NHH, em chỉ dùng điều khiển mức cho động cơ. Đắn đo mãi em mới dám post lên nhờ mọi người, mong các anh đừng cười. Hic.
Còn đây là file mô phỏng của em. Là file MACH.rar, vì em có chút sửa đổi.

tite101 13-12-2010 10:51 PM

Bạn ơi, sao mình test thử, thì nó chỉ chạy được cái động cơ, phần quét phím nhấn không ăn.Bạn có thể giúp mình không, mình cũng đang tìm hiểu về phần này. Cám ơn bạn.

hungnguyen1112 13-12-2010 11:16 PM

có anh nào có mạch " thiết kế công tắt xoay chều cách li, điều khiển bằng tín hiệu số sử dụng BTA va MOC" ko? jup e với. nhớ là sử dung protues nhen! gơi len lien cho e ngen. thanks

diode1 03-05-2011 11:56 PM

Bạn tuyetmuavienxu bạn có thể kiểm tra lại phần LCD không? Mình thấy bạn chưa khai báo và dùng LCD.

trungspkt1990 21-03-2012 01:28 AM

bai nay ban lam sai roi, ranh qua su pham ky thuat minh chi giao cho

trungspkt1990 21-03-2012 01:29 AM

lien he so dien thoai: 0194480499

giang_lee 19-10-2012 11:01 AM

minh cung lam cai nay. trungspkt1990 mail la gj cho minh voi minh hoi ban

nhiot081290 11-11-2012 10:56 AM

quét bàn phím cơ bản bạn làm như sau :
1.cố định "từng" hàng( hoặc cột) rồi "quét" cột(hoặc hàng)
2.kiểm tra nút nào được nhấn.
bạn có thể dùng 2 mảng hàng và cột rồi bạn dùng 2 vòng lặp for tương ứng cho hàng và cột, và dùng ngắt timer để định thời bao lâu sẽ vào kiểm tra phím một lần, cách này hiệu quả và ngắn hơn nhiều , bạn thử đi
Thân,


Múi giờ GMT. Hiện tại là 01:54 AM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam