Thứ Ba, 26 tháng 1, 2016

BÀI 30 : PWM VÀ L298 PIC16F877A CCS

1 .IC L298.
IC L298 là một IC tích hợp nguyên khối gồm 2 mạch cầu H bên trong. Với điện áp làm tăng công suất đầu ra từ 5V – 47V , dòng lên đến 4A, L298 rất thích hợp trong những ứng dụng công suất nhỏ như động cơ DC loại vừa …
Mình tóm tắt qua chức năng các chân của L298: 
4 chân INPUT: IN1, IN2, IN3, IN4 được nối lần lượt với các chân 5, 7, 10, 12 của L298. Đây là các chân nhận tín hiệu điều khiển.
4 chân OUTPUT: OUT1, OUT2, OUT3, OUT4 (tương ứng với các chân INPUT) được nối với các chân 2, 3, 13, 14 của L298. Các chân này sẽ được nối với động cơ.
Hai chân ENA và ENB dung để điều khiển các mạch cầu H trong L298. Nếu ở mức logic “1” (nối với nguồn 5V) thì cho phép mạch cầu H hoạt động, nếu ở mức logic “0” thì mạch cầu H không hoạt động.
Với bài toán của mình ở trên, các bạn chỉ cần lưu ý đến cách điều khiển chiều quay với L298:
Khi ENA = 0: Động cơ không quay với mọi đầu vào .
- Khi ENA = 1: 
- INT1 = 1; INT2 = 0: động cơ quay thuân.
- INT1 = 0; INT2 = 1: động cơ quay nghịch.
- INT1 = INT2: động cơ dừng ngay tức thì.
(tương tự với các chân ENB, INT3, INT4). 
Tham khảo thêm datasheet ở cuối bài nhé…^^
Trong bài toán này mình sử dụng module L298 V1 để điều khiển chiều quay của động cơ DC.
Sơ đồ nguyên lý:
cấu tạo và chức năng của l298
- Đây là ảnh mô phỏng protues.

đảo chiều động cơ sử dụng l298

- Đây là code chương trình.
#include <16f877a.h>
#fuses XT,NOLVP,NOWDT,NOPROTECT
#use delay(clock=4000000)
#define  Wire1 PIN_B6
#define  Wire2 PIN_B7
#define  Up    PIN_A0
#define  Down  PIN_A1
#define  Dir   PIN_A2
int16 duty_cycle=512;
void main()
{
   setup_adc(ADC_OFF);           // Turn ADC OFF
   setup_adc_ports(NO_ANALOGS);  // All Ports are digital I/O
   output_high(Wire1);           
   output_low (Wire2);            // Set the motor to CW direction
   
   /* PWM Configurations */
   setup_timer_2(T2_DIV_BY_1,255,1);   // Set PWM frequency
   setup_ccp1(CCP_PWM);          // Configure CCP1 to PWM mode
   set_pwm1_duty(512L);          // default duty cycle = 50% (Half Speed)

   while(1)
   {
      while(input(Up) && input(Down) && input(Dir)); // Hold until a button is pressed
      
      if(!input(Up))    // Button (Up) Selected?
      {
         duty_cycle+=64;   // increase the duty cycle by some percentage (+6.25%)
         set_pwm1_duty(duty_cycle); // set the duty cycle
      }
      if(!input(Down))  // Button (Down) Selected?
      {
         duty_cycle-=64;   // decrease the duty cycle
         set_pwm1_duty(duty_cycle); // set the duty cycle
      }
      if(!input(Dir))   // Button (Direction) Selected?
      {
         output_toggle(Wire1);   // Toggle the polarity of IN1 IN2
         output_toggle(Wire2);   // 0 becomes 1 , 1 becomes 0
      }      
      delay_ms(500); // 0.5 second delay to release the selected button
   }
}
- Link download project Click here


EmoticonEmoticon