PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Điều khiển nguồn (http://www.picvietnam.com/forum/forumdisplay.php?f=70)
-   -   Hỏi về PID cho mạch nghịch lưu 1 pha dùng PIC8F2431 (http://www.picvietnam.com/forum/showthread.php?t=35489)

chaukyo 31-08-2016 11:43 AM

Hỏi về PID cho mạch nghịch lưu 1 pha dùng PIC8F2431
 
Chào các anh,
Em đang làm một mạch nghịch lưu 1 pha dùng PIC18F2431 để lái cầu H.
Em đã tạo ra được 4 xung PWM sử dụng modul PCPWM của 18f2431. Băm xung 320 bậc cho toàn chu kỳ và sóng sin thu được khá đẹp (qua mô phỏng).
Hiện tại các anh cho em hỏi:
Em muốn dùng PID để ổn định điện áp sau nghịch lưu thì em phải làm sao?
Các anh ai rành vấn đề này chỉ em với hoặc có tài liệu liên quan thì cho em xin để tham khảo.
Em cảm ơn nhiều!
Code của em viết:
Code:

#include <stdio.h>
#include <stdlib.h>

#include <p18f2431.h>


#pragma config OSC = HS
#pragma config FCMEN = OFF
#pragma config IESO = OFF
#pragma config PWRTEN = OFF
#pragma config BOREN = ON
#pragma config BORV = 27
#pragma config WDTEN = OFF
#pragma config WDPS = 32768
#pragma config WINEN = OFF
#pragma config PWMPIN = OFF
#pragma config LPOL = HIGH
#pragma config HPOL = HIGH
#pragma config T1OSCMX = ON
#pragma config MCLRE = ON
#pragma config STVREN = ON
#pragma config LVP = ON
#pragma config CP0 = OFF
#pragma config CP1 = OFF
#pragma config CP2 = OFF
#pragma config CP3 = OFF
#pragma config CPB = OFF
#pragma config CPD = OFF
#pragma config WRT0 = OFF
#pragma config WRT1 = OFF
#pragma config WRT2 = OFF
#pragma config WRT3 = OFF
#pragma config WRTC = OFF
#pragma config WRTB = OFF
#pragma config WRTD = OFF
#pragma config EBTR0 = OFF
#pragma config EBTR1 = OFF
#pragma config EBTR2 = OFF
#pragma config EBTR3 = OFF
#pragma config EBTRB = OFF

#define _PTIF PIR3bits.PTIF
unsigned int index = 0;
const rom unsigned int sine[320]=
{475, 484, 494, 503, 512, 522, 531, 540, 549, 559, 568, 577, 586, 595, 604, 613,
622, 631, 639, 648, 657, 665, 674, 682, 691, 699, 707, 715, 723, 731, 739, 747,
754, 762, 769, 776, 783, 791, 797, 804, 811, 817, 824, 830, 836, 842, 848, 854,
859, 865, 870, 875, 880, 885, 889, 894, 898, 902, 906, 910, 914, 917, 921, 924,
927, 930, 932, 935, 937, 939, 941, 943, 944, 946, 947, 948, 949, 949, 950, 950,
950, 950, 950, 949, 949, 948, 947, 946, 944, 943, 941, 939, 937, 935, 932, 930,
927, 924, 921, 917, 914, 910, 906, 902, 898, 894, 889, 885, 880, 875, 870, 865,
859, 854, 848, 842, 836, 830, 824, 817, 811, 804, 797, 791, 783, 776, 769, 762,
754, 747, 739, 731, 723, 715, 707, 699, 691, 682, 674, 665, 657, 648, 639, 631,
622, 613, 604, 595, 586, 577, 568, 559, 549, 540, 531, 522, 512, 503, 494, 484,
475, 466, 456, 447, 438, 428, 419, 410, 401, 391, 382, 373, 364, 355, 346, 337,
328, 319, 311, 302, 293, 285, 276, 268, 259, 251, 243, 235, 227, 219, 211, 203,
196, 188, 181, 174, 167, 159, 153, 146, 139, 133, 126, 120, 114, 108, 102, 96,
91, 85, 80, 75, 70, 65, 61, 56, 52, 48, 44, 40, 36, 33, 29, 26, 23, 20, 18, 15,
13, 11, 9, 7, 6, 4, 3, 2, 1, 1, 0, 0, 0, 0, 0, 1, 1, 2, 3, 4, 6, 7, 9, 11, 13,
15, 18, 20, 23, 26, 29, 33, 36, 40, 44, 48, 52, 56, 61, 65, 70, 75, 80, 85, 91,
96, 102, 108, 114, 120, 126, 133, 139, 146, 153, 159, 167, 174, 181, 188, 196,
203, 211, 219, 227, 235, 243, 251, 259, 268, 276, 285, 293, 302, 311, 319, 328,
337, 346, 355, 364, 373, 382, 391, 401, 410, 419, 428, 438, 447, 456, 466};

void Init_PCPWM();
void set_duty(unsigned int duty);

void main()
{
Init_PCPWM();
while(1)
        {
            if(_PTIF == 1&&PTMRL >=10)
            {
                set_duty(sine[index]);
                index ++;
                _PTIF = 0;
                if(index >=320) index = 0;
            }


        }
}

void Init_PCPWM()
{
PTCON0 = 0x00; //Postscale 1:1, Prescale 1:1, Free Running
PTCON1 = 0x80; //PWM time base is on, count up!
PWMCON0 = 0x30; //Enable PWM0-3, Complementary
PWMCON1 = 0x40;
DTCON = 0x0A; //1.25uS dead-time

PTMRH=0;
PTMRL=0;

PTPERH = 0;
PTPERL = 249; // 16KHz PWM

PDC0H = 0;
PDC0L = 0; //0% duty
PDC1H = 0;
PDC1L = 0;




OVDCOND = 0xFF; //Override disabled
OVDCONS = 0;
FLTCONFIG = 0; //Fault condition disabled
SEVTCMPH = 0;
SEVTCMPL = 0;
}

void set_duty(unsigned int duty)
{
PDC0H = duty>>8;
PDC0L = duty&0xFF;
PDC1H = duty>>8;
PDC1L = duty&0xFF;
}


chaukyo 02-09-2016 01:52 PM

ai giúp mình với, bế tắc không có hướng để code tiếp. ai giúp mình mình biết ơn nhiều!


Múi giờ GMT. Hiện tại là 01:32 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