timg.gif (33.27 KB, 下載次數: 61)
下載附件
2020-9-14 16:31 上傳
單片機源程序如下:
- #define MAIN_Fosc 24000000L //定義主時鐘
- #include "STC15Fxxxx.H"
- #include "T_SineTable.h"
- #define PWM_DeadZone 12 /* 死區時鐘數, 6 ~ 24之間 */
- /************* 功能說明 **************
- 演示使用2路PWM產生互補或同相的SPWM.
- 主時鐘選擇24MHZ, PWM時鐘選擇1T, PWM周期2400, 死區12個時鐘(0.5us).正弦波表用200點.
- 輸出正弦波頻率 = 24000000 / 2400 / 200 = 50 HZ.
- 本程序僅僅是一個SPWM的演示程序, 用戶可以通過上面的計算方法修改PWM周期和正弦波的點數和幅度.
- 本程序輸出頻率固定, 如果需要變頻, 請用戶自己設計變頻方案.
- 本程序從P2.1(PWM3)輸出正相脈沖, 從P2.2(PWM4)輸出反相脈沖(互補).
- 如果需要P2.2輸出同相的, 請在初始化配置中"PWMCFG"項選擇設置1(設置PWM輸出端口的初始電平, 0或1).
- ******************************************/
- u8 PWM_Index; //SPWM查表索引
- //========================================================================
- // 函數: void PWM_config(void)
- // 描述: PWM配置函數。
- // 參數: none.
- // 返回: none.
- // 版本: VER1.0
- // 日期: 2014-8-15
- // 備注:
- //========================================================================
- void PWM_config(void)
- {
- u8 xdata *px;
- EAXSFR(); // 訪問XFR
- px = PWM3T1H; // 指針指向PWM3
- *px = 0; // 第一個翻轉計數高字節
- px++;
- *px = 65; // 第一個翻轉計數低字節
- px++;
- *px = 1220 / 256; // 第二個翻轉計數高字節
- px++;
- *px = 1220 % 256; // 第二個翻轉計數低字節
- px++;
- *px = 0; // PWM3輸出選擇P2.1, 無中斷
- PWMCR |= 0x02; // 相應PWM通道的端口為PWM輸出口,受PWM波形發生器控制
- PWMCFG &= ~0x02; // 設置PWM輸出端口的初始電平為0
- // PWMCFG |= 0x02; // 設置PWM輸出端口的初始電平為1
- P21 = 0;
- P2n_push_pull(1<<1); //IO初始化, 上電時為高阻
- px = PWM4T1H; // 指針指向PWM4
- *px = 0; // 第一個翻轉計數高字節
- px++;
- *px = 65-PWM_DeadZone; // 第一個翻轉計數低字節
- px++;
- *px = (1220+PWM_DeadZone) / 256; // 第二個翻轉計數高字節//頻率
- px++;
- *px = (1220+PWM_DeadZone) % 256; // 第二個翻轉計數低字節//頻率
- px++;
- *px = 0; // PWM4輸出選擇P2.2, 無中斷
- PWMCR |= 0x04; // 相應PWM通道的端口為PWM輸出口,受PWM波形發生器控制
- // PWMCFG &= ~0x04; // 設置PWM輸出端口的初始電平為0
- PWMCFG |= 0x04; // 設置PWM輸出端口的初始電平為1
- P22 = 1;
- P2n_push_pull(1<<2); //IO初始化, 上電時為高阻
- px = PWMCH; // PWM計數器的高字節
- *px = 2400 / 256; //頻率
- px++;
- *px = 2400 % 256; // PWM計數器的低字節//頻率
- px++; // PWMCKS, PWM時鐘選擇
- *px = PwmClk_1T; // 時鐘源: PwmClk_1T,PwmClk_2T, ... PwmClk_16T, PwmClk_Timer2
- EAXRAM(); // 恢復訪問XRAM
-
- PWMCR |= ENPWM; // 使能PWM波形發生器,PWM計數器開始計數
- // PWMCR &= ~ECBI; // 禁止PWM計數器歸零中斷
- PWMCR |= ECBI; // 允許PWM計數器歸零中斷
- // PWMFDCR = ENFD | FLTFLIO | FDIO; //PWM失效中斷控制, ENFD | FLTFLIO | EFDI | FDCMP | FDIO
- }
- /**********************************************/
- void main(void)
- {
- PWM_config(); //初始化PWM
- EA = 1; //允許全局中斷
- while (1)
- {
- }
- }
- /********************* PWM中斷函數************************/
- void PWM_int (void) interrupt PWM_VECTOR
- {
- u8 xdata *px;
- u16 j;
- u8 SW2_tmp;
- if(PWMIF & CBIF) //PWM計數器歸零中斷標志
- {
- PWMIF &= ~CBIF; //清除中斷標志
- SW2_tmp = P_SW2; //保存SW2設置
- EAXSFR(); //訪問XFR
- px = PWM3T2H; // 指向PWM3
- j = T_SinTable[PWM_Index]*10/10;//電壓
- *px = (u8)(j >> 8); //第二個翻轉計數高字節
- px++;
- *px = (u8)j; //第二個翻轉計數低字節
- j += PWM_DeadZone; //死區
- px = PWM4T2H; // 指向PWM4
- *px = (u8)(j >> 8); //第二個翻轉計數高字節
- px++;
- *px = (u8)j; //第二個翻轉計數低字節
- P_SW2 = SW2_tmp; //恢復SW2設置
- if(++PWM_Index >= 200) PWM_Index = 0;
- }
- /*
- if(PWMIF & C2IF) //PWM2中斷標志
- {
- PWMIF &= ~C2IF; //清除中斷標志
- }
- if(PWMIF & C3IF) //PWM3中斷標志
- {
- PWMIF &= ~C3IF; //清除中斷標志
- }
- if(PWMIF & C4IF) //PWM4中斷標志
- {
- PWMIF &= ~C4IF; //清除中斷標志
- }
- if(PWMIF & C5IF) //PWM5中斷標志
- {
- PWMIF &= ~C5IF; //清除中斷標志
- }
- if(PWMIF & C6IF) //PWM6中斷標志
- {
- PWMIF &= ~C6IF; //清除中斷標志
- }
- if(PWMIF & C7IF) //PWM7中斷標志
- {
- PWMIF &= ~C7IF; //清除中斷標志
- }
- */
- }
復制代碼
全部資料51hei下載地址:
SPWM15單片機程序.zip
(61.28 KB, 下載次數: 111)
2020-9-14 16:26 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|