历史上的今天
返回首页

历史上的今天

今天是:2024年09月15日(星期日)

2020年09月15日 | H桥逆变,带死区的SPWM单片机程序

2020-09-15 来源:51hei

单片机源程序如下:

#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;        //清除中断标志

        }

*/

}

推荐阅读

史海拾趣

BSI公司的发展小趣事

随着科技的不断发展,电子行业的技术创新日新月异。在这个过程中,BSI通过提供最新的技术信息和标准,为企业的技术创新提供了有力支持。BSI建立了庞大的标准数据库,涵盖了电子行业的各个领域,为企业提供了丰富的技术资源和参考依据。同时,BSI还积极参与新技术的研发和推广工作,为电子行业的创新发展提供了动力。

国炬(GOOGLL)公司的发展小趣事
可能是由于负载过大、散热不良或电路设计不合理等原因引起。解决方法包括降低负载阻抗、改善散热条件或重新设计电路结构。
COMPUTAR公司的发展小趣事

随着摄影和摄像技术的不断发展,市场对镜头性能的要求也越来越高。为了满足这一需求,CBC株式会社于1985年成功研制出第一款非球面高速镜头。这款镜头采用了先进的非球面设计,有效减少了像差和畸变,提高了成像质量。非球面高速镜头的诞生,不仅为CBC赢得了更多的市场份额,也为整个光学行业树立了新的技术标杆。

Gould Fiber Optics公司的发展小趣事
可能是滤波电容老化、稳压电路故障或负载变化大。
Antex公司的发展小趣事

随着业务的不断扩展,Antex在1980年决定将工厂从东京都大田区羽田迁至茨城县高萩市。这一搬迁不仅为公司提供了更广阔的发展空间,也标志着Antex开始向着全球化布局迈进。此后,公司积极寻求国际合作,与全球各地的供应商和客户建立了紧密的合作关系。

APLUS Products公司的发展小趣事

在XXXX年,APLUS Products公司迎来了一次重要的技术突破。公司研发团队成功开发出了一款具有划时代意义的电子产品,该产品在性能、稳定性和用户体验等方面均达到了行业领先水平。这一技术突破不仅为公司赢得了大量订单,还进一步巩固了其在电子行业中的市场地位。

问答坊 | AI 解惑

vxworks tornado不能使用类的静态成员变量?下载到模拟器出错

代码 : #include \"vxWorks.h\" #include #include \"TestDll.h\" class  CTest { public:         CTest(){};         void print(){printf(\"CTest::print()\\n\");} static char ...…

查看全部问答>

在wince 编程里面怎么做菜单?

我是在wm_create消息里面         HWND hwndcb;                         hwndcb=CommandBar_Create(hInstance,hWnd,cmd);         &nbs ...…

查看全部问答>

请问STM8和STM32是否货期紧张???

                                 代理说比较紧张,是否?…

查看全部问答>

2407有没有什么指令可以用来开根号???

要用到...不知道什么指令.先谢谢了...…

查看全部问答>

为什么总是崩溃?

我用的是Firefox最新的浏览器,浏览咱们的论坛的时候为什么总是崩溃呢?浏览别的网页的时候没有出现过这个问题,我想知道这个是浏览器的问题还是论坛的问题呢??…

查看全部问答>

求热电堆热流传感器型号及管脚资料

求一个知道输出电压范围的热电堆热流传感器 [ 本帖最后由 douyayu 于 2011-6-9 10:48 编辑 ]…

查看全部问答>

error: #20: identifier "RCC_PLLSource_HSE_Div1" is undefined

错误:User\\main.c(122): error:  #20: identifier \"RCC_PLLSource_HSE_Div1\" is undefined 意思是RCC_PLLSource_HSE_Div1未定义。 我的工程中包含了 stm32f10x_rcc.h  可仍然显示 “RCC_PLLSource_HSE_Div1”未定义 打开stm32f1 ...…

查看全部问答>

夜话51

话说51我接触大概不大半年吧!现在大二的我或许显得有些稚嫩,但是对于学习,我还是有自己得体悟得。 学习51我们是为了知道单片机是什么?知道学习完了51之后我们如何更快速得入门其他单片机,对于有一定电子制作经历得人我建议自己用洞洞板搭建自 ...…

查看全部问答>

求各位老师,师兄师姐帮帮忙·给解答一下小弟的疑问吧!!!感激不尽!

#include //g2553.h> void Clocks_Config(void)  //时钟配置 { //  if (CALBC1_1MHZ==0xFF||CALDCO_1MHZ==0xFF) //  FaultRoutine();         //如果校准数据被擦除,则运行 Fau ...…

查看全部问答>

关于msp430g2553+nrf24L01的编程问题

error #10234-D: unresolved symbols remain error #10010: errors encountered during linking; \"22.out\" not built复制代码程序编译没问题,就是debug不了,下面是它给我显示 error #10234-D: unresolved symbols remain error #10010: erro ...…

查看全部问答>