找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 6626|回復: 5
打印 上一主題 下一主題
收起左側

H橋逆變,帶死區(qū)的SPWM單片機程序

  [復制鏈接]
跳轉到指定樓層
樓主
ID:661402 發(fā)表于 2020-9-14 16:33 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式



單片機源程序如下:
  1. #define         MAIN_Fosc                24000000L        //定義主時鐘

  2. #include        "STC15Fxxxx.H"

  3. #include        "T_SineTable.h"

  4. #define                PWM_DeadZone        12        /* 死區(qū)時鐘數, 6 ~ 24之間  */


  5. /*************        功能說明        **************

  6. 演示使用2路PWM產生互補或同相的SPWM.

  7. 主時鐘選擇24MHZ, PWM時鐘選擇1T, PWM周期2400, 死區(qū)12個時鐘(0.5us).正弦波表用200點.

  8. 輸出正弦波頻率 = 24000000 / 2400 / 200 = 50 HZ.

  9. 本程序僅僅是一個SPWM的演示程序, 用戶可以通過上面的計算方法修改PWM周期和正弦波的點數和幅度.

  10. 本程序輸出頻率固定, 如果需要變頻, 請用戶自己設計變頻方案.

  11. 本程序從P2.1(PWM3)輸出正相脈沖, 從P2.2(PWM4)輸出反相脈沖(互補).

  12. 如果需要P2.2輸出同相的, 請在初始化配置中"PWMCFG"項選擇設置1(設置PWM輸出端口的初始電平, 0或1).


  13. ******************************************/

  14. u8        PWM_Index;        //SPWM查表索引


  15. //========================================================================
  16. // 函數: void        PWM_config(void)
  17. // 描述: PWM配置函數。
  18. // 參數: none.
  19. // 返回: none.
  20. // 版本: VER1.0
  21. // 日期: 2014-8-15
  22. // 備注:
  23. //========================================================================
  24. void        PWM_config(void)
  25. {
  26.         u8        xdata        *px;

  27.         EAXSFR();                        // 訪問XFR

  28.         px = PWM3T1H;                // 指針指向PWM3
  29.         *px = 0;                        // 第一個翻轉計數高字節(jié)
  30.         px++;
  31.         *px = 65;                        // 第一個翻轉計數低字節(jié)
  32.         px++;
  33.         *px = 1220 / 256;        // 第二個翻轉計數高字節(jié)
  34.         px++;
  35.         *px = 1220 % 256;        // 第二個翻轉計數低字節(jié)
  36.         px++;
  37.         *px = 0;                                // PWM3輸出選擇P2.1, 無中斷
  38.         PWMCR  |=  0x02;        // 相應PWM通道的端口為PWM輸出口,受PWM波形發(fā)生器控制
  39.         PWMCFG &= ~0x02;        // 設置PWM輸出端口的初始電平為0
  40. //        PWMCFG |=  0x02;        // 設置PWM輸出端口的初始電平為1
  41.         P21 = 0;
  42.         P2n_push_pull(1<<1);        //IO初始化, 上電時為高阻

  43.         px = PWM4T1H;                // 指針指向PWM4
  44.         *px = 0;                        // 第一個翻轉計數高字節(jié)
  45.         px++;
  46.         *px = 65-PWM_DeadZone;                        // 第一個翻轉計數低字節(jié)
  47.         px++;
  48.         *px = (1220+PWM_DeadZone) / 256;        // 第二個翻轉計數高字節(jié)//頻率
  49.         px++;
  50.         *px = (1220+PWM_DeadZone) % 256;        // 第二個翻轉計數低字節(jié)//頻率
  51.         px++;
  52.         *px = 0;                        // PWM4輸出選擇P2.2, 無中斷
  53.         PWMCR  |=  0x04;        // 相應PWM通道的端口為PWM輸出口,受PWM波形發(fā)生器控制
  54. //        PWMCFG &= ~0x04;        // 設置PWM輸出端口的初始電平為0
  55.         PWMCFG |=  0x04;        // 設置PWM輸出端口的初始電平為1
  56.         P22 = 1;
  57.         P2n_push_pull(1<<2);        //IO初始化, 上電時為高阻

  58.         px  = PWMCH;                // PWM計數器的高字節(jié)
  59.         *px = 2400 / 256;                        //頻率
  60.         px++;
  61.         *px = 2400 % 256;        // PWM計數器的低字節(jié)//頻率
  62.         px++;                                // PWMCKS, PWM時鐘選擇
  63.         *px = PwmClk_1T;        // 時鐘源: PwmClk_1T,PwmClk_2T, ... PwmClk_16T, PwmClk_Timer2

  64.         EAXRAM();                        // 恢復訪問XRAM
  65.        
  66.         PWMCR |= ENPWM;                // 使能PWM波形發(fā)生器,PWM計數器開始計數
  67. //        PWMCR &= ~ECBI;                // 禁止PWM計數器歸零中斷
  68.         PWMCR |=  ECBI;                // 允許PWM計數器歸零中斷

  69. //        PWMFDCR = ENFD | FLTFLIO | FDIO;        //PWM失效中斷控制,  ENFD | FLTFLIO | EFDI | FDCMP | FDIO
  70. }


  71. /**********************************************/
  72. void main(void)
  73. {

  74.         PWM_config();        //初始化PWM

  75.         EA = 1;                        //允許全局中斷

  76.         while (1)
  77.         {

  78.         }
  79. }


  80. /********************* PWM中斷函數************************/

  81. void PWM_int (void) interrupt PWM_VECTOR
  82. {
  83.         u8        xdata        *px;
  84.         u16        j;
  85.         u8        SW2_tmp;

  86.         if(PWMIF & CBIF)        //PWM計數器歸零中斷標志
  87.         {
  88.                 PWMIF &= ~CBIF;        //清除中斷標志

  89.                 SW2_tmp = P_SW2;        //保存SW2設置
  90.                 EAXSFR();                //訪問XFR
  91.                 px = PWM3T2H;        // 指向PWM3
  92.                 j = T_SinTable[PWM_Index]*10/10;//電壓
  93.                 *px = (u8)(j >> 8);        //第二個翻轉計數高字節(jié)
  94.                 px++;
  95.                 *px = (u8)j;                        //第二個翻轉計數低字節(jié)

  96.                 j += PWM_DeadZone;                //死區(qū)
  97.                 px = PWM4T2H;                        // 指向PWM4
  98.                 *px = (u8)(j >> 8);        //第二個翻轉計數高字節(jié)
  99.                 px++;
  100.                 *px = (u8)j;                        //第二個翻轉計數低字節(jié)
  101.                 P_SW2 = SW2_tmp;        //恢復SW2設置

  102.                 if(++PWM_Index >= 200)        PWM_Index = 0;

  103.         }
  104. /*
  105.         if(PWMIF & C2IF)        //PWM2中斷標志
  106.         {
  107.                 PWMIF &= ~C2IF;        //清除中斷標志
  108.         }

  109.         if(PWMIF & C3IF)        //PWM3中斷標志
  110.         {
  111.                 PWMIF &= ~C3IF;        //清除中斷標志
  112.         }

  113.         if(PWMIF & C4IF)        //PWM4中斷標志
  114.         {
  115.                 PWMIF &= ~C4IF;        //清除中斷標志
  116.         }

  117.         if(PWMIF & C5IF)        //PWM5中斷標志
  118.         {
  119.                 PWMIF &= ~C5IF;        //清除中斷標志
  120.         }

  121.         if(PWMIF & C6IF)        //PWM6中斷標志
  122.         {
  123.                 PWMIF &= ~C6IF;        //清除中斷標志
  124.         }

  125.         if(PWMIF & C7IF)        //PWM7中斷標志
  126.         {
  127.                 PWMIF &= ~C7IF;        //清除中斷標志
  128.         }
  129. */
  130. }
復制代碼

全部資料51hei下載地址:
SPWM15單片機程序.zip (61.28 KB, 下載次數: 111)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏5 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:1002044 發(fā)表于 2022-2-4 15:55 | 只看該作者
學習學習學習學習學習學習學習學習學習學習學習學習學習學習學習學習學習學習學習
回復

使用道具 舉報

板凳
ID:1002044 發(fā)表于 2022-2-4 15:56 | 只看該作者
學習學習學習學習學習v學習學習學習學習學習學習學習學習學習學習學習學習學習學習學習學習學習
回復

使用道具 舉報

地板
ID:849826 發(fā)表于 2022-2-5 16:26 來自觸屏版 | 只看該作者
頻率有多少高,能不能做電磁加熱主控芯片
回復

使用道具 舉報

5#
ID:166475 發(fā)表于 2022-2-10 16:35 來自觸屏版 | 只看該作者
6313 發(fā)表于 2022-2-5 16:26
頻率有多少高,能不能做電磁加熱主控芯片

完全可以,還不用正弦函數表
回復

使用道具 舉報

6#
ID:981034 發(fā)表于 2022-2-11 08:11 | 只看該作者
頻率有點低
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表