Sử dụng bộ timer 1 của VDK AVR Atmega32 và chân PD5 làm bộ phát xung điều khiển động cơ nguyên tắc lấy như sau
Động cơ sử dụng xung điều khiển có tần số 50Hz và độ rộng xung từ 1ms đến 2ms. Ta cần tạo được một xung ra chân PD5 có tần số 50Hz và độ rộng xung
điều chỉnh được. Về bộ timer 1, đây là bộ timer 16 bít. Vì vậy nó sẽ đọc từ 0 đến 65525 theo tần số xung nhịp. Có 2 chế độ phát xung đó là Phase correct PWM(PWM với pha chính xác) và Fast PWM (PWM tần số cao)ở đây ta sử
dụng chế độ phát xung PWM với pha chính xác và giá trị top đặt tại ICR1
Hình 4.10: Khai báo timer 1 để xuất xung 50hz
Để lấy xung với độ rộng tùy theo ý muốn ta đặt OCR1A= x với x tỷ lệ với độ rộng xung cần đặt. ở bài toán này x được điều khiển theo PID. Tuy nhiên độ rộng xung không thể <0 cũng như không thể lớn hơn chu kỳ 20ms . vậy nên phải đặt. nếu x<0 thì đặt luôn x=0, còn nếu x >4e2 (giá trị chu kỳ của xung) thì phải đặt x=4e2
Dùng timer 0 tạo ra 1 bộ timer sau 100ms đọc ADC và hiển thị LCD 1 lần Timer 0 là bộ timer 8 bit. Do vậy nó sẽ đếm từ 0 đến 255 theo tần số xung nhịp và sau mỗi lần như vậy sẽ có 1 tín hiệu ngắt. với tần số lựa chọn là
73
125.000Khz thì mỗi 1 giây nó sẽ đếm được a=125000:256= 488 (vòng) để số vòng này chẵn ta gán 1 giá trị vào thanh ghi TCNT0 giả sử giá trị đó là x. khi đó thay vì đếm từ 0 đên 255 thì timer 0 sẽ đếm từ x đến 255. Để đếm được hết 1 vòng ta cần
255-x+1 xung nhịp
Vậy để có giá trị chẵn ta phải có 125000
255− +x 1 chẵn
Giả sử 125000 500 255 x 1=
− + ta chọn được x=6 Vậy giá trị cần ghi vào TCNT0=6
Khi TCNT0=6 thì mỗi giây bộ timer 0 của ta sẽ thực hiện được 500 vòng đếm vậy nếu ta cần 100ms thì trong thời gian đó bộ timer đếm được 50 vòng.
Để lấy đươc thời gian lấy mẫu là 100ms thuật toán ta thưc hiện như sau.Ta khai báo 2 biến tg và h và đặt tg=0 ,h=0 Mỗi khi bộ timer đếm hết 1 vòng sẽ có 1 tín hiệu ngắt. lúc đó ta tăng tg lên 1 đơn vị. tg=tg++;
Nếu tg<50 thì vẫn tiếp tục đếm. ngược lại nếu không thỏa mãn thì đặt lại tg=0 và đặt h=1
Khi h đã =1 ta thực hiện đọc ADC và hiển thị LCD sau khi thực hiện xong ta lại đặt h=0 vòng lặp quay lại. vậy là ta đã có thể lấy thồi gian lấy mẫu là 100ms, cứ mỗi sau 100ms thì lại đọc và hiển thị LCD 1 lần
Điều khiển PID độ rộng xung.
Qua phương pháp dao động ta đã tìm được các thông số Kp, Ki, Kd bây giờ ta thực hiện điều khiển PID độ rộng xung từ đó xuất xung điều khiển động cơ servo 1 1 0 ( ) [ a k D k k ] k p k i i i a T T e e u k e e T T − − = − = + ∑ +
Đối với e k h ek = xd −xph Thành phần tích phân 1 0 k p a k I i i i k T u e T − = = ∑ sau mỗi vòng lặp cần đặt 1 k k I I k u =u − +e và sau đó gán trở lại uIk =uIk−1 , ek =ek−1
Thành phần vi phân cũng vậy. sau mỗi vòng lặp phải gán lại ek =ek−1
Lưu đồ thuật toán
75