一個SPWM帶有死區(qū)的程序 用STC8A8K64S4A12單片機編寫的SPWM
- //一個SPWM帶有死區(qū)的程序 用STC8A8K64S4A12單片機編寫的SPWM
- //介紹了一種高性能微機控制的單相 SPWM 變頻調(diào)速系統(tǒng)
- // SPWM信號經(jīng)低通濾波后可變換為正弦波,窄帶范圍內(nèi)的方波經(jīng)低通濾波后可變換為相應(yīng)頻率的正弦波
- //程序能用,如果不是你想要的頻率,那就 自己改一下數(shù)據(jù) 記得同時要替換數(shù)組里面的值
- #define MAIN_Fosc 24000000L //定義主時鐘
- #include "STC8.H"
- unsigned int code T_SinTable[]={
- 1220, 1256, 1292, 1328, 1364, 1400, 1435, 1471, 1506, 1541,
- 1575, 1610, 1643, 1677, 1710, 1742, 1774, 1805, 1836, 1866,
- 1896, 1925, 1953, 1981, 2007, 2033, 2058, 2083, 2106, 2129,
- 2150, 2171, 2191, 2210, 2228, 2245, 2261, 2275, 2289, 2302,
- 2314, 2324, 2334, 2342, 2350, 2356, 2361, 2365, 2368, 2369,
- 2370, 2369, 2368, 2365, 2361, 2356, 2350, 2342, 2334, 2324,
- 2314, 2302, 2289, 2275, 2261, 2245, 2228, 2210, 2191, 2171,
- 2150, 2129, 2106, 2083, 2058, 2033, 2007, 1981, 1953, 1925,
- 1896, 1866, 1836, 1805, 1774, 1742, 1710, 1677, 1643, 1610,
- 1575, 1541, 1506, 1471, 1435, 1400, 1364, 1328, 1292, 1256,
- 1220, 1184, 1148, 1112, 1076, 1040, 1005, 969, 934, 899,
- 865, 830, 797, 763, 730, 698, 666, 635, 604, 574,
- 544, 515, 487, 459, 433, 407, 382, 357, 334, 311,
- 290, 269, 249, 230, 212, 195, 179, 165, 151, 138,
- 126, 116, 106, 98, 90, 84, 79, 75, 72, 71,
- 70, 71, 72, 75, 79, 84, 90, 98, 106, 116,
- 126, 138, 151, 165, 179, 195, 212, 230, 249, 269,
- 290, 311, 334, 357, 382, 407, 433, 459, 487, 515,
- 544, 574, 604, 635, 666, 698, 730, 763, 797, 830,
- 865, 899, 934, 969, 1005, 1040, 1076, 1112, 1148, 1184,
- };
- #define PwmClk_1T 0
- #define PwmClk_2T 1
- #define PwmClk_3T 2
- #define PwmClk_4T 3
- #define PwmClk_5T 4
- #define PwmClk_6T 5
- #define PwmClk_7T 6
- #define PwmClk_8T 7
- #define PwmClk_9T 8
- #define PwmClk_10T 9
- #define PwmClk_11T 10
- #define PwmClk_12T 11
- #define PwmClk_13T 12
- #define PwmClk_14T 13
- #define PwmClk_15T 14
- #define PwmClk_16T 15
- #define PwmClk_T2 16
- #define EAXSFR() P_SW2 |= 0x80 /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作對象為擴展SFR(XSFR) */
- #define EAXRAM() P_SW2 &= ~0x80 /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作對象為擴展RAM(XRAM) */
- #define PWM_Enable() PWMCR |= 0x80 /* 使能PWM波形發(fā)生器,PWM計數(shù)器開始計數(shù) */
- #define PWM_Disable() PWMCR &= ~0x80 /* 關(guān)閉PWM波形發(fā)生器 */
- #define P2n_standard(bitn) P2M1 &= ~(bitn), P2M0 &= ~(bitn)
- #define P2n_push_pull(bitn) P2M1 &= ~(bitn), P2M0 |= (bitn)
- #define P2n_pure_input(bitn) P2M1 |= (bitn), P2M0 &= ~(bitn)
- #define P2n_open_drain(bitn) P2M1 |= (bitn), P2M0 |= (bitn)
- #define PWM_VECTOR 22
- #define PWM_DeadZone 12 /* 死區(qū)時鐘數(shù), 6 ~ 24之間 */
- typedef unsigned char u8;
- typedef unsigned int u16;
- typedef unsigned long u32;
- sbit OE245 =P4^1;
- sbit LED_OUT =P3^3;
- #define Port P1 //設(shè)置CPU和模塊的通訊接口
- u8 PWM_Index; //SPWM查表索引
- void delay(unsigned long d)
- {
- while(d--);
- }
- //========================================================================
- // 函數(shù): void PWM_config(void)
- // 描述: PWM配置函數(shù)。
- // 參數(shù): none.
- // 返回: none.
- // 版本: VER1.0
- // 日期:
- // 備注:
- //========================================================================
- void PWM_config(void)
- {
- EAXSFR(); // 訪問XFR
- PWM3T1 = 65; // 第一個翻轉(zhuǎn)計數(shù)
- PWM3T2=1220; // 第二個翻轉(zhuǎn)計數(shù)
- PWM3CR =0; // PWM3輸出選擇P2.3, 無中斷
- PWM3CR |= 0x80; // 相應(yīng)PWM通道的端口為PWM輸出口,受PWM波形發(fā)生器控制 ENC30
- PWM3CR &= ~0x40; // 設(shè)置PWM輸出端口的初始電平為0 C3INI
- P23 = 0;
- P2n_push_pull(1<<3); //IO初始化, 上電時為高阻
- PWM4T1= 65-PWM_DeadZone; // 第一個翻轉(zhuǎn)計數(shù)低字節(jié)
-
- PWM4T2 = (1220+PWM_DeadZone); // 第二個翻轉(zhuǎn)計數(shù)高字節(jié)
-
- PWM4CR = 0; // PWM4輸出選擇P2.2, 無中斷
- PWM4CR |= 0x80; // 相應(yīng)PWM通道的端口為PWM輸出口,受PWM波形發(fā)生器控制 ENC40
- // PWMCFG &= ~0x04; // 設(shè)置PWM輸出端口的初始電平為0 C4INI
- PWM4CR |= 0x40; // 設(shè)置PWM輸出端口的初始電平為1
- P24 = 1;
- P2n_push_pull(1<<4); //IO初始化, 上電時為高阻
- PWMC = 2400; // PWM計數(shù)器的高字節(jié)
- PWMCKS = PwmClk_1T; // 時鐘源: PwmClk_1T,PwmClk_2T, ... PwmClk_16T, PwmClk_Timer2
- EAXRAM(); // 恢復訪問XRAM
-
- PWMCR |= ENPWM; // 使能PWM波形發(fā)生器,PWM計數(shù)器開始計數(shù)
- // PWMCR &= ~ECBI; // 禁止PWM計數(shù)器歸零中斷
- PWMCR |= ECBI; // 允許PWM計數(shù)器歸零中斷
- // PWMFDCR = ENFD | FLTFLIO | FDIO; //PWM失效中斷控制, ENFD | FLTFLIO | EFDI | FDCMP | FDIO
- }
- /**********************************************/
- void main(void)
- {
- unsigned char i;
- OE245 =0;
- LED_OUT =1;
- PWM_config(); //初始化PWM
- EA = 1; //允許全局中斷
- while (1)
- {
- for(i=1;i!=0;i<<=1) // 0000 0000
- {
- Port =~i; //0111 1111
- delay(200000);
- }
- }
- }
- /********************* PWM中斷函數(shù)************************/
- void PWM_int (void) interrupt PWM_VECTOR
- {
- u16 j;
- u8 SW2_tmp;
- if(PWMCFG & CBIF) //PWM計數(shù)器歸零中斷標志 PWMCFG
- {
- PWMCFG &= ~CBIF; //清除中斷標志
- SW2_tmp = P_SW2; //保存SW2設(shè)置
- EAXSFR(); //訪問XFR
- j = T_SinTable[PWM_Index];
- PWM3T2H = (u8)(j >> 8); //第二個翻轉(zhuǎn)計數(shù)高字節(jié)
- PWM3T2L = (u8)j; //第二個翻轉(zhuǎn)計數(shù)低字節(jié)
- j += PWM_DeadZone; //死區(qū)
- // 指向PWM4
- PWM4T2H = (u8)(j >> 8); //第二個翻轉(zhuǎn)計數(shù)高字節(jié)
-
- PWM4T2L = (u8)j; //第二個翻轉(zhuǎn)計數(shù)低字節(jié)
- P_SW2 = SW2_tmp; //恢復SW2設(shè)置
- if(++PWM_Index >= 200) PWM_Index = 0;
- }
- }
復制代碼
單片機SPWM波 產(chǎn)生正弦波的源程序及工具
http://www.zg4o1577.cn/bbs/dpj-55510-1.html
|