Đăng vào

Lập trình PWM với PIC bằng CCS C

Giới thiệu

PWM là cái gì mà sao nó được ứng dụng nhiều trong điều khiển. Lấy điển hình nhất mà chúng ta thường hay gặp là điều khiển động cơ và các bộ băm xung áp, điều áp… Sử dụng PWM điều khiển nhanh chậm của động cơ hay cao hơn nữa nó còn được dùng để điều khiển ổn định tốc độ động cơ.

Ngoài lĩnh vực điều khiển hay ổn định tải thì PWM nó còn tham gia và điều chế các mạch nguồn như là : boot, buck, nghịch lưu 1 pha và 3 pha…PWM chúng ta còn gặp nhiều trong thực tế và các mạch điện điều khiển. Điều đặc biệt là PWM chuyên dùng để điều khiển các phần tử điện tử công suất có đường đặc tính là tuyến tính khi có sẵn 1 nguồn 1 chiều cố định. Như vậy PWM nó được ứng dụng rất nhiều trong các thiết bị điện điện tử. Điều mà dân điện điện tử dễ dàng nhận ra là PWM chính nhân tố mà các đội Robocon sử dụng để điều khiển động cơ hay ổn định tốc độ động cơ.Bài viết này sẽ nói lên phương pháp điều khiển PWM và các thông số cơ bản của PWM.

PWM là gì?

Trước khi tìm hiểu sâu chúng ta hãy tìm hiểu định nghĩa của PWM là gì? Như vậy Phương pháp điều chế PWM có tên tiếng anh là Pulse Width Modulation là phương pháp điều chỉnh điện áp ra tải hay nói cách khác là phương pháp điều chế dựa trên sự thay đổi độ rộng của chuỗi xung vuông dẫm đếm sự thay đổi điện áp ra Các PWM khi biến đổi thì có cùng 1 tần số và khác nhau về độ rộng của sườn dương hay hoặc là sườn âm.

Code demo

main.h

main.h
#include<18f4520.h>
#device adc=16
#FUSES NOWDT                  //No Watch Dog Timer
#FUSES WDT128                 //Watch Dog Timer uses 1:128 Postscale
#FUSES HS                     //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOBROWNOUT             //No brownout reset
#FUSES NOLVP                  //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOXINST                //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#use delay(clock=20000000)

main.c

main.c
#include
/*
Cach tinh gia tri dutu thong qua set value
8bit value = period+1*duty_cycle
16bit value= 4*(period+1)*duty_cycle
*/
void main()
{
   setup_timer_2(T2_DIV_BY_4,124,1);      //100 us overflow, 100 us interrupt//Khoi tao timer 2 tao tan so pwm(10k)
   //mode T2_DIV_BY_4
  // period=124
   //Postscale =1
   //set_pwm2_duty((int16)248);//Dieu chinh do dong la 50%
    while(TRUE)
   {
     set_pwm2_duty((int16)150);//Dieu chinh do dong la 30%
     delay_ms(3000);
     set_pwm2_duty((int16)248);//Dieu chinh do dong la 50%
     delay_ms(2000);;
     setup_ccp2(CCP_OFF);//Tat PWM
     delay_ms(5000);
   }
}