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