找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2|回复: 0
收起左侧

H桥逆变,带死区的SPWM单片机程序

[复制链接]
YF12 发表于 2020-9-14 16:33 | 显示全部楼层 |阅读模式

timg.gif

单片机源程序如下:
  1. #define         MAIN_Fosc                24000000L        //定义主时钟

  2. #include        "STC15Fxxxx.H"

  3. #include        "T_SineTable.h"

  4. #define                PWM_DeadZone        12        /* 死区时钟数, 6 ~ 24之间  */


  5. /*************        功能说明        **************

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

  7. 主时钟选择24MHZ, PWM时钟选择1T, PWM周期2400, 死区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;                        // 第一个翻转计数高字节
  30.         px++;
  31.         *px = 65;                        // 第一个翻转计数低字节
  32.         px++;
  33.         *px = 1220 / 256;        // 第二个翻转计数高字节
  34.         px++;
  35.         *px = 1220 % 256;        // 第二个翻转计数低字节
  36.         px++;
  37.         *px = 0;                                // PWM3输出选择P2.1, 无中断
  38.         PWMCR  |=  0x02;        // 相应PWM通道的端口为PWM输出口,受PWM波形发生器控制
  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;                        // 第一个翻转计数高字节
  45.         px++;
  46.         *px = 65-PWM_DeadZone;                        // 第一个翻转计数低字节
  47.         px++;
  48.         *px = (1220+PWM_DeadZone) / 256;        // 第二个翻转计数高字节//频率
  49.         px++;
  50.         *px = (1220+PWM_DeadZone) % 256;        // 第二个翻转计数低字节//频率
  51.         px++;
  52.         *px = 0;                        // PWM4输出选择P2.2, 无中断
  53.         PWMCR  |=  0x04;        // 相应PWM通道的端口为PWM输出口,受PWM波形发生器控制
  54. //        PWMCFG &= ~0x04;        // 设置PWM输出端口的初始电平为0
  55.         PWMCFG |=  0x04;        // 设置PWM输出端口的初始电平为1
  56.         P22 = 1;
  57.         P2n_push_pull(1<<2);        //IO初始化, 上电时为高阻

  58.         px  = PWMCH;                // PWM计数器的高字节
  59.         *px = 2400 / 256;                        //频率
  60.         px++;
  61.         *px = 2400 % 256;        // PWM计数器的低字节//频率
  62.         px++;                                // PWMCKS, PWM时钟选择
  63.         *px = PwmClk_1T;        // 时钟源: PwmClk_1T,PwmClk_2T, ... PwmClk_16T, PwmClk_Timer2

  64.         EAXRAM();                        // 恢复访问XRAM
  65.        
  66.         PWMCR |= ENPWM;                // 使能PWM波形发生器,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);        //第二个翻转计数高字节
  94.                 px++;
  95.                 *px = (u8)j;                        //第二个翻转计数低字节

  96.                 j += PWM_DeadZone;                //死区
  97.                 px = PWM4T2H;                        // 指向PWM4
  98.                 *px = (u8)(j >> 8);        //第二个翻转计数高字节
  99.                 px++;
  100.                 *px = (u8)j;                        //第二个翻转计数低字节
  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, 下载次数: 0)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表