性无码一区二区三区在线观看,少妇被爽到高潮在线观看,午夜精品一区二区三区,无码中文字幕人妻在线一区二区三区,无码精品国产一区二区三区免费

  • 回復
  • 收藏
  • 點贊
  • 分享
  • 發(fā)新帖

單片機做逆變器過零點波形不對,求幫助

單片機用的是PIC16F1936,外接20M晶振。程序如下:

#include

__CONFIG (FOSC_HS&WDTE_OFF&PWRTE_OFF&MCLRE_ON&CP_OFF&BOREN_ON&CLKOUTEN_OFF&WRT_OFF&          PLLEN_OFF&LVP_OFF&BORV_25);

#define uchar unsigned char

#define uint unsigned int

const uchar sin_table[100]={16 , 31 ,47 ,62 ,77 ,92 ,106 ,120 ,134 ,147,159 ,171 ,182 ,193 ,202 ,211 ,219 ,226 ,232 ,238,242 ,246 ,248 ,250 ,250 ,250 ,248 ,246 ,242 ,238,232 ,226 ,219 ,211 ,202 ,193 ,182 ,171 ,159 ,147,134 ,120 ,106 ,92 ,77 ,62 ,47 ,31 ,16 ,0,16 , 31 ,47 ,62 ,77 ,92 ,106 ,120 ,134 ,147,159 ,171 ,182 ,193 ,202 ,211 ,219 ,226 ,232 ,238,242 ,246 ,248 ,250 ,250 ,250 ,248 ,246 ,242 ,238,232 ,226 ,219 ,211 ,202 ,193 ,182 ,171 ,159 ,147,134 ,120 ,106 ,92 ,77 ,62 ,47 ,31 ,16 ,0};

uchar num_INT;

Init_IO();

Init_Timer2_clk();

Init_CCP1();/

*The main function of Sine wave inverter*/

void main()

{num_INT=0;

Init_IO();

Init_Timer2_clk();

Init_CCP1();

TMR2ON=1;

TRISB=0xC3;

while(1);}

Init_Timer2_clk()

{TMR2IF=0; //清定時器2中斷標志

TMR2IE=1; //定時器2中斷使能位

PEIE=1; //外設(shè)中斷使能

GIE=0; //全局中斷禁止

T2CON=0x18; //預分頻比為0,后分頻比為2

PR2=0xF9; //周期寄存器設(shè)置 249

TMR2=0x00;GIE=1;}

Init_IO()

{P2BSEL=1; //確定P2B位于RC0

CCP2SEL=1; //確定P2A位于RC1

ANSELB=0X03;

TRISB=0x03;}

Init_CCP1() //增強型PWM初始化設(shè)置

{CCP2CON=0x8c; //設(shè)置增強型PWM工作于半橋模式;PWM設(shè)置為高電平有效

CCPTMRS0=0xF3; //設(shè)置PWM模式下CCP2以Timer2作為定時器

PWM2CON=0X05; //死區(qū)設(shè)置為1us

STR2D=0;

STR2C=0;

STR2B=1;

STR2A=1;

CCPR2L=0;}

void interrupt TMR2INT()

{

    if(TMR2IE&TMR2IF)

    {

        TMR2IF=0;

        num_INT++;

            if(num_INT<=50)

                CCPR2L=sin_table[num_INT-1];

            else

                CCPR2L=250-sin_table[num_INT-1];

            if(num_INT==51)

                {

                    RB4=0;

                    NOP();NOP();NOP();NOP();

                    RB2=1;

                }

            if(num_INT==1)

                {

                    RB2=0;

                    NOP();NOP();NOP();NOP();

                    RB4=1;

                }

            if(num_INT==100)

                    num_INT=0;

    }

}

用以上程序進行單片機調(diào)試發(fā)現(xiàn)輸出波形在過零點有問題

tek00001

過零點的驅(qū)動波形如下

tek00000

用的是后分頻為2的中斷響應(yīng),不知道為什么工頻變換比高頻變換早不到一個周期,希望在此能得到師傅們的指點,不勝感激

全部回復(13)
正序查看
倒序查看
2014-05-21 15:10
替樓主頂一帖,希望得到老師們的幫助,謝謝!
0
回復
2014-05-21 16:04

分明是工頻臂超前了一個周期呀,看看是不是定時器使用了影子寄存器的自動重裝載,用這個功能可以避免定時器中斷程序設(shè)置過程對極小脈寬的影響,看你的波形應(yīng)該是用了,那么pwm實際輸出滯后于中斷一個周期

工頻臂要在電感電流為0時進行切換,這個具體的時序需要配合輸出的lc參數(shù)來決定是超前還是滯后,但是因為逆變器的負載非??赡懿皇羌冏栊缘模瑤Р煌撦d的時候過零點還是會出現(xiàn)失真,這方面雙極性的就好很多

0
回復
2014-05-22 10:58
@wangshujun
分明是工頻臂超前了一個周期呀,看看是不是定時器使用了影子寄存器的自動重裝載,用這個功能可以避免定時器中斷程序設(shè)置過程對極小脈寬的影響,看你的波形應(yīng)該是用了,那么pwm實際輸出滯后于中斷一個周期工頻臂要在電感電流為0時進行切換,這個具體的時序需要配合輸出的lc參數(shù)來決定是超前還是滯后,但是因為逆變器的負載非??赡懿皇羌冏栊缘模瑤Р煌撦d的時候過零點還是會出現(xiàn)失真,這方面雙極性的就好很多
感謝師傅的回帖,非常感激。再給您看個圖

上圖是我后分頻為4的一個輸出,使用的是高電平有效,確實使用了自動重載功能。如果我將上面中斷中的程序改為

if(num_INT==50)

{

RB4=0;

NOP();NOP();NOP();NOP();

RB2=1;

}

if(num_INT==100)

{RB2=0

;NOP();NOP();NOP();NOP();

RB4=1;

}

那結(jié)果就變成

兩圖相比,差一個載波周期,所以說,我的工頻輸出已經(jīng)在時序上補償了一個中斷的,但結(jié)果卻差的是一個載波周期,這就讓我很不理解,希望師傅給看看,謝謝

0
回復
2014-05-22 13:58
@熊貓酒仙
感謝師傅的回帖,非常感激。再給您看個圖[圖片]上圖是我后分頻為4的一個輸出,使用的是高電平有效,確實使用了自動重載功能。如果我將上面中斷中的程序改為if(num_INT==50){RB4=0;NOP();NOP();NOP();NOP();RB2=1;}if(num_INT==100){RB2=0;NOP();NOP();NOP();NOP();RB4=1;}那結(jié)果就變成[圖片]兩圖相比,差一個載波周期,所以說,我的工頻輸出已經(jīng)在時序上補償了一個中斷的,但結(jié)果卻差的是一個載波周期,這就讓我很不理解,希望師傅給看看,謝謝

你這個圖,似乎4個pwm周期才改變一次占空比的,使用了pwm的重復定時器?每四次改變一次pwm

你正弦表是100個的,重復4次,每周期是400個載頻周期,載頻是20k,正好是這樣

如果運算能力夠用的話,不用重復寄存器,軟件管理重復就好辦了,另外做成200點的半周期正弦表效果會好得多呀,你現(xiàn)在正弦表的前后是重復的,沒必要,可以去掉一半的,然后正弦表分辨率擴大4倍正好

你改成這樣是差了5個周期了,超前更多了,如果繼續(xù)使用重復寄存器修改的話會出現(xiàn)要么超前1個,要么之后3個的問題,工頻臂切換時間最好能做到按照周期調(diào)節(jié)比較好。

0
回復
2014-05-22 14:05
@wangshujun
你這個圖,似乎4個pwm周期才改變一次占空比的,使用了pwm的重復定時器?每四次改變一次pwm你正弦表是100個的,重復4次,每周期是400個載頻周期,載頻是20k,正好是這樣如果運算能力夠用的話,不用重復寄存器,軟件管理重復就好辦了,另外做成200點的半周期正弦表效果會好得多呀,你現(xiàn)在正弦表的前后是重復的,沒必要,可以去掉一半的,然后正弦表分辨率擴大4倍正好你改成這樣是差了5個周期了,超前更多了,如果繼續(xù)使用重復寄存器修改的話會出現(xiàn)要么超前1個,要么之后3個的問題,工頻臂切換時間最好能做到按照周期調(diào)節(jié)比較好。
我不理解的就是為什么會差5個周期,我是四個載波周期進一次中斷的,如果說滯后應(yīng)該滯后4的整數(shù)倍,怎么會出現(xiàn)5個呢,麻煩您能不能給我解釋的稍微詳細點,謝謝

剛看完您的回復,這款單片機的運算能力有限,后面還要做AD和PI調(diào)節(jié),所以時候用四個點調(diào)節(jié)為爭取一點時間。您說的不用重復寄存器,用軟件管理重復是怎么個意思,沒太明白,您能稍微解釋下嗎?您的QQ多少,方便給我發(fā)下嘛

0
回復
2014-05-22 14:16
@熊貓酒仙
我不理解的就是為什么會差5個周期,我是四個載波周期進一次中斷的,如果說滯后應(yīng)該滯后4的整數(shù)倍,怎么會出現(xiàn)5個呢,麻煩您能不能給我解釋的稍微詳細點,謝謝剛看完您的回復,這款單片機的運算能力有限,后面還要做AD和PI調(diào)節(jié),所以時候用四個點調(diào)節(jié)為爭取一點時間。您說的不用重復寄存器,用軟件管理重復是怎么個意思,沒太明白,您能稍微解釋下嗎?您的QQ多少,方便給我發(fā)下嘛

有一個額外的pwm滯后周期是自動重裝導致的,你做4次重復必然是這個結(jié)果

0
回復
2014-05-22 20:57
@熊貓酒仙
感謝師傅的回帖,非常感激。再給您看個圖[圖片]上圖是我后分頻為4的一個輸出,使用的是高電平有效,確實使用了自動重載功能。如果我將上面中斷中的程序改為if(num_INT==50){RB4=0;NOP();NOP();NOP();NOP();RB2=1;}if(num_INT==100){RB2=0;NOP();NOP();NOP();NOP();RB4=1;}那結(jié)果就變成[圖片]兩圖相比,差一個載波周期,所以說,我的工頻輸出已經(jīng)在時序上補償了一個中斷的,但結(jié)果卻差的是一個載波周期,這就讓我很不理解,希望師傅給看看,謝謝

第四個圖的上面藍色和紫色的線在零點重合,你的問題就解決了。

加油,你只差一點點了。呵呵

0
回復
2014-05-22 21:04
@熊貓酒仙
我不理解的就是為什么會差5個周期,我是四個載波周期進一次中斷的,如果說滯后應(yīng)該滯后4的整數(shù)倍,怎么會出現(xiàn)5個呢,麻煩您能不能給我解釋的稍微詳細點,謝謝剛看完您的回復,這款單片機的運算能力有限,后面還要做AD和PI調(diào)節(jié),所以時候用四個點調(diào)節(jié)為爭取一點時間。您說的不用重復寄存器,用軟件管理重復是怎么個意思,沒太明白,您能稍微解釋下嗎?您的QQ多少,方便給我發(fā)下嘛

印象中1936時鐘可以到32M,都有8MIPS了,做這個應(yīng)該來得及

另外,你可以改成用2個ECCP做這個,他好像有幾個ECCP的。應(yīng)該很容易實現(xiàn)這個。

 

0
回復
2014-05-22 22:09
@lizlk
印象中1936時鐘可以到32M,都有8MIPS了,做這個應(yīng)該來得及另外,你可以改成用2個ECCP做這個,他好像有幾個ECCP的。應(yīng)該很容易實現(xiàn)這個。 

首先非常感謝張工能來看我的問題,在此深表感謝。

現(xiàn)在問題就卡在這里了,不知道為什么會多出來一個載波周期,試了自己能想到的所有辦法,都沒能搞定,上面師傅說“有一個額外的PWM滯后周期是自動重裝導致的”,這點始終沒想通,明天按著張工所說的用兩個ECCP去試試,到時候再通報結(jié)果。

0
回復
wangshujun
LV.8
11
2014-05-23 08:30
@lizlk
印象中1936時鐘可以到32M,都有8MIPS了,做這個應(yīng)該來得及另外,你可以改成用2個ECCP做這個,他好像有幾個ECCP的。應(yīng)該很容易實現(xiàn)這個。 
用了自動重裝的影子寄存器最好用別再用重復寄存器,否則沒法調(diào)整到正好
0
回復
wangshujun
LV.8
12
2014-05-23 09:43
@lizlk
印象中1936時鐘可以到32M,都有8MIPS了,做這個應(yīng)該來得及另外,你可以改成用2個ECCP做這個,他好像有幾個ECCP的。應(yīng)該很容易實現(xiàn)這個。 
這個片子似乎不算便宜呀,比新塘的m0還貴呢,處理能力差了不是一點半點呀
0
回復
2014-05-23 09:56
@wangshujun
用了自動重裝的影子寄存器最好用別再用重復寄存器,否則沒法調(diào)整到正好

師傅所說的有點不理解,這個程序中用了自動重裝的PWM模塊,中斷響應(yīng)是進行了后分頻設(shè)置(設(shè)置為4),您所說的重復寄存器是不是指的就是我使用的后分頻的功能?

您再看兩個圖

0
回復
wangshujun
LV.8
14
2014-05-23 10:06
@熊貓酒仙
師傅所說的有點不理解,這個程序中用了自動重裝的PWM模塊,中斷響應(yīng)是進行了后分頻設(shè)置(設(shè)置為4),您所說的重復寄存器是不是指的就是我使用的后分頻的功能?您再看兩個圖[圖片][圖片]

應(yīng)該就是后分頻功能,不同廠家的pwm發(fā)生器定義不同

做逆變器不建議用這個功能

0
回復
發(fā)