久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6368|回復: 6
收起左側

STC15W4K60S2單片機2路SPWM源程序 可驅動電機

  [復制鏈接]
ID:392700 發表于 2018-9-3 07:21 | 顯示全部樓層 |閱讀模式
分享一個雙路的SPWM源碼可以驅動電機用


正弦表計算:
0.png 0.png

C語言庫函數版本STC15W4K60S2單片機源程序如下:
  1. #include        "config.h"
  2. #include        "PWM.h"


  3. /*************        功能說明        **************

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

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

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

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

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

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

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


  11. 工程文件:
  12. delay.c
  13. pwm.c
  14. main.c

  15. ******************************************/

  16. /*************        本地常量聲明        **************/


  17. /*************        本地變量聲明        **************/


  18. /*************        本地函數聲明        **************/



  19. /*************  外部函數和變量聲明 *****************/



  20. //========================================================================
  21. // 函數: void        PWM_config(void)
  22. // 描述: PWM配置函數。
  23. // 參數: none.
  24. // 返回: none.
  25. // 版本: VER1.0
  26. // 日期: 2014-8-15
  27. // 備注:
  28. //========================================================================
  29. void        PWM_config(void)
  30. {
  31.         PWMx_InitDefine                PWMx_InitStructure;                                        //結構定義
  32.        
  33.         PWMx_InitStructure.PWMx_IO_Select       = PWM3_P21;                //PWM輸出IO選擇. PWM2_P37,PWM2_P27,PWM3_P21,PWM3_P45,PWM4_P22,PWM4_P44,PWM5_P23,PWM5_P42,PWM6_P16,PWM6_P07,PWM7_P17,PWM7_P06
  34.         PWMx_InitStructure.Start_IO_Level       = 0;                        //設置PWM輸出端口的初始電平, 0或1
  35.         PWMx_InitStructure.PWMx_Interrupt       = DISABLE;                //中斷允許,                           ENABLE或DISABLE
  36.         PWMx_InitStructure.FirstEdge_Interrupt  = DISABLE;                //第一個翻轉中斷允許,   ENABLE或DISABLE
  37.         PWMx_InitStructure.SecondEdge_Interrupt = DISABLE;                //第二個翻轉中斷允許,   ENABLE或DISABLE
  38.         PWMx_InitStructure.FirstEdge            = 65;                        //第一個翻轉計數, 1~32767
  39.         PWMx_InitStructure.SecondEdge           = 1220;                        //第二個翻轉計數, 1~32767
  40.         PWMx_Configuration(PWM3_ID, &PWMx_InitStructure);                //初始化PWM,         PWM2_ID,PWM3_ID,PWM4_ID,PWM5_ID,PWM6_ID,PWM7_ID
  41.         P21 = 0;
  42.         P2n_push_pull(1<<1);                                                                        //IO初始化, 上電時為高阻

  43.         PWMx_InitStructure.PWMx_IO_Select       = PWM4_P22;                //PWM輸出IO選擇. PWM2_P37,PWM2_P27,PWM3_P21,PWM3_P45,PWM4_P22,PWM4_P44,PWM5_P23,PWM5_P42,PWM6_P16,PWM6_P07,PWM7_P17,PWM7_P06
  44.         PWMx_InitStructure.Start_IO_Level       = 1;                        //設置PWM輸出端口的初始電平, 0或1
  45.         PWMx_InitStructure.PWMx_Interrupt       = DISABLE;                //中斷允許,                           ENABLE或DISABLE
  46.         PWMx_InitStructure.FirstEdge_Interrupt  = DISABLE;                //第一個翻轉中斷允許,   ENABLE或DISABLE
  47.         PWMx_InitStructure.SecondEdge_Interrupt = DISABLE;                //第二個翻轉中斷允許,   ENABLE或DISABLE
  48.         PWMx_InitStructure.FirstEdge            = 65-PWM_DeadZone;        //第一個翻轉計數, 1~32767
  49.         PWMx_InitStructure.SecondEdge           = 1220+PWM_DeadZone;//第二個翻轉計數, 1~32767
  50.         PWMx_Configuration(PWM4_ID, &PWMx_InitStructure);                //初始化PWM,         PWM2_ID,PWM3_ID,PWM4_ID,PWM5_ID,PWM6_ID,PWM7_ID
  51.         P22 = 1;
  52.         P2n_push_pull(1<<2);                                                                        //IO初始化, 上電時為高阻

  53.         PWM_SourceClk_Duty(PwmClk_1T, 2400);        //時鐘源: PwmClk_1T,PwmClk_2T, ... PwmClk_16T, PwmClk_Timer2,   PWM周期: 1~32767
  54.        
  55.         PWMCR |= ENPWM;                // 使能PWM波形發生器,PWM計數器開始計數
  56. //        PWMCR &= ~ECBI;                //禁止PWM計數器歸零中斷
  57.         PWMCR |=  ECBI;                //允許PWM計數器歸零中斷

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


  60. /**********************************************/
  61. void main(void)
  62. {
  63.        
  64.         PWM_config();        //初始化PWM

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

  66.         while (1)
  67.         {
  68.                
  69.         }
  70. }
復制代碼

另一個程序:
  1. #define         MAIN_Fosc                24000000L        //定義主時鐘

  2. #include        "STC15Fxxxx.H"

  3. #include        "T_SineTable.h"

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


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


  6. //========================================================================
  7. // 函數: void        PWM_config(void)
  8. // 描述: PWM配置函數。
  9. // 參數: none.
  10. // 返回: none.
  11. // 版本: VER1.0
  12. // 日期: 2014-8-15
  13. // 備注:
  14. //========================================================================
  15. void        PWM_config(void)
  16. {
  17.         u8        xdata        *px;

  18.         EAXSFR();                        // 訪問XFR

  19.         px = PWM3T1H;                // 指針指向PWM3
  20.         *px = 0;                        // 第一個翻轉計數高字節
  21.         px++;
  22.         *px = 65;                        // 第一個翻轉計數低字節
  23.         px++;
  24.         *px = 1220 / 256;        // 第二個翻轉計數高字節
  25.         px++;
  26.         *px = 1220 % 256;        // 第二個翻轉計數低字節
  27.         px++;
  28.         *px = 0;                                // PWM3輸出選擇P2.1, 無中斷
  29.         PWMCR  |=  0x02;        // 相應PWM通道的端口為PWM輸出口,受PWM波形發生器控制
  30.         PWMCFG &= ~0x02;        // 設置PWM輸出端口的初始電平為0
  31. //        PWMCFG |=  0x02;        // 設置PWM輸出端口的初始電平為1
  32.         P21 = 0;
  33.         P2n_push_pull(1<<1);        //IO初始化, 上電時為高阻

  34.         px = PWM4T1H;                // 指針指向PWM4
  35.         *px = 0;                        // 第一個翻轉計數高字節
  36.         px++;
  37.         *px = 65-PWM_DeadZone;                        // 第一個翻轉計數低字節
  38.         px++;
  39.         *px = (1220+PWM_DeadZone) / 256;        // 第二個翻轉計數高字節
  40.         px++;
  41.         *px = (1220+PWM_DeadZone) % 256;        // 第二個翻轉計數低字節
  42.         px++;
  43.         *px = 0;                        // PWM4輸出選擇P2.2, 無中斷
  44.         PWMCR  |=  0x04;        // 相應PWM通道的端口為PWM輸出口,受PWM波形發生器控制
  45. //        PWMCFG &= ~0x04;        // 設置PWM輸出端口的初始電平為0
  46.         PWMCFG |=  0x04;        // 設置PWM輸出端口的初始電平為1
  47.         P22 = 1;
  48.         P2n_push_pull(1<<2);        //IO初始化, 上電時為高阻

  49.         px  = PWMCH;                // PWM計數器的高字節
  50.         *px = 2400 / 256;
  51.         px++;
  52.         *px = 2400 % 256;        // PWM計數器的低字節
  53.         px++;                                // PWMCKS, PWM時鐘選擇
  54.         *px = PwmClk_1T;        // 時鐘源: PwmClk_1T,PwmClk_2T, ... PwmClk_16T, PwmClk_Timer2

  55.         EAXRAM();                        // 恢復訪問XRAM
  56.        
  57.         PWMCR |= ENPWM;                // 使能PWM波形發生器,PWM計數器開始計數
  58. //        PWMCR &= ~ECBI;                // 禁止PWM計數器歸零中斷
  59.         PWMCR |=  ECBI;                // 允許PWM計數器歸零中斷

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


  62. /**********************************************/
  63. void main(void)
  64. {

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

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

  67.         while (1)
  68.         {

  69.         }
  70. }


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

  72. void PWM_int (void) interrupt PWM_VECTOR
  73. {
  74.         u8        xdata        *px;
  75.         u16        j;
  76.         u8        SW2_tmp;

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

  80.                 SW2_tmp = P_SW2;        //保存SW2設置
  81.                 EAXSFR();                //訪問XFR
  82.                 px = PWM3T2H;        // 指向PWM3
  83.                 j = T_SinTable[PWM_Index];
  84.                 *px = (u8)(j >> 8);        //第二個翻轉計數高字節
  85.                 px++;
  86.                 *px = (u8)j;                        //第二個翻轉計數低字節

  87.                 j += PWM_DeadZone;                //死區
  88.                 px = PWM4T2H;                        // 指向PWM4
  89.                 *px = (u8)(j >> 8);        //第二個翻轉計數高字節
  90.                 px++;
  91.                 *px = (u8)j;                        //第二個翻轉計數低字節
  92.                 P_SW2 = SW2_tmp;        //恢復SW2設置

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

  94.         }
  95. /*
  96.         if(PWMIF & C2IF)        //PWM2中斷標志
  97.         {
  98.                 PWMIF &= ~C2IF;        //清除中斷標志
  99.         }

  100.         if(PWMIF & C3IF)        //PWM3中斷標志
  101.         {
  102.                 PWMIF &= ~C3IF;        //清除中斷標志
  103.         }

  104.         if(PWMIF & C4IF)        //PWM4中斷標志
  105.         {
  106.                 PWMIF &= ~C4IF;        //清除中斷標志
  107. ……………………

  108. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
STC15W4K60S2-2路SPWM.zip (104.27 KB, 下載次數: 148)


評分

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

查看全部評分

回復

使用道具 舉報

ID:170318 發表于 2018-9-4 16:17 | 顯示全部樓層
下來學習,謝謝分享
回復

使用道具 舉報

ID:119977 發表于 2019-5-26 14:30 | 顯示全部樓層
我試了  不行  正玄波有很大缺口
回復

使用道具 舉報

ID:151314 發表于 2019-5-27 23:58 | 顯示全部樓層
如何來驅動電機?
回復

使用道具 舉報

ID:235188 發表于 2019-9-12 15:02 | 顯示全部樓層
謝謝分享
回復

使用道具 舉報

ID:719608 發表于 2020-4-24 11:38 | 顯示全部樓層
感謝分享,謝謝大神1
回復

使用道具 舉報

ID:486443 發表于 2020-12-5 16:39 | 顯示全部樓層
請問:在另一個程序里,第37、38行 :   
       *px = 0;                       // PWM3輸出選擇P2.1, 無中斷
        PWMCR  |=  0x02;        // 相應PWM通道的端口為PWM輸出口,受PWM波形發生器控制

和第53、54行:
        *px = 0;                        // PWM4輸出選擇P2.2, 無中斷
        PWMCR  |=  0x04;        // 相應PWM通道的端口為PWM輸出口,受PWM波形發生器控制

如果要換成第二組口 P4.5和 P4.4 該怎么弄啊?   用PWM3CR=0x08;根本加不進,編譯過不了
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美日韩国产一区二区 | 超碰3| 国内精品久久久久久 | 69性欧美高清影院 | 亚洲麻豆 | 91精品国产欧美一区二区成人 | 女女百合av大片一区二区三区九县 | 久久国产一区二区 | 国产一区二区精 | 精品一区二区在线观看 | 国产精品视频免费 | 国产亚洲欧美在线视频 | 粉嫩高清一区二区三区 | 性精品| 超碰在线网站 | 国产午夜av片 | 欧美一级全黄 | 看毛片的网站 | 亚洲免费观看 | 精品视频一区二区三区在线观看 | 日韩一区二区三区视频在线播放 | 亚洲精品一区国语对白 | 91久久精品国产免费一区 | 久久精品欧美视频 | 亚洲免费毛片 | 偷派自拍 | www.久草| 久久综合狠狠综合久久综合88 | 欧美国产日韩精品 | 成av在线 | 日韩精品久久久久 | 精品久久久久久 | 精品在线一区 | 在线一区 | 免费观看一级特黄欧美大片 | 日韩有码一区 | 天天操狠狠操 | 91国语清晰打电话对白 | 欧美视频在线看 | 国产精品久久久久久久久图文区 | 亚洲永久|