找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5444|回复: 5
收起左侧

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

  [复制链接]
ID:661402 发表于 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, 下载次数: 105)

评分

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

查看全部评分

回复

使用道具 举报

ID:1002044 发表于 2022-2-4 15:55 | 显示全部楼层
学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习
回复

使用道具 举报

ID:1002044 发表于 2022-2-4 15:56 | 显示全部楼层
学习学习学习学习学习v学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习
回复

使用道具 举报

ID:849826 发表于 2022-2-5 16:26 来自手机 | 显示全部楼层
频率有多少高,能不能做电磁加热主控芯片
回复

使用道具 举报

ID:166475 发表于 2022-2-10 16:35 来自手机 | 显示全部楼层
6313 发表于 2022-2-5 16:26
频率有多少高,能不能做电磁加热主控芯片

完全可以,还不用正弦函数表
回复

使用道具 举报

ID:981034 发表于 2022-2-11 08:11 | 显示全部楼层
频率有点低
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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