net20 发表于 2016-1-15 16:34:27

STC15W4K SPWM官方例程(程序有点疑问,请大家指导一下)

本帖最后由 net20 于 2016-1-15 16:55 编辑





/*------------------------------------------------------------------*/
/* --- STC MCU International Limited -------------------------------*/
/* --- STC 1T Series MCU RC Demo -----------------------------------*/
/* --- Mobile: (86)13922805190 -------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ---------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966 ---------------------*/
/* --- Web: www.GXWMCU.com -----------------------------------------*/
/* --- QQ:800003751 ----------------------------------------------*/
/* If you want to use the program or the program referenced in the*/
/* article, please specify in which data and procedures from STC    */
/*------------------------------------------------------------------*/
#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;
                *px = (u8)(j >> 8);        //PWM3T2H第二个翻转计数高字节
                px++;
                *px = (u8)j;                        //PWM3T2L第二个翻转计数低字节

                j += PWM_DeadZone;                //死区
                px = PWM4T2H;                        // 指向PWM4
                *px = (u8)(j >> 8);        //PWM4T2H第二个翻转计数高字节
                px++;
                *px = (u8)j;                        //PWM4T2L第二个翻转计数低字节
                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;        //清除中断标志
        }
*/
}


//////////////////////////////////////////////////


中断函数中:
px = PWM3T2H;        // 指向PWM3
                j = T_SinTable;
                *px = (u8)(j >> 8);        //PWM3T2H第二个翻转计数高字节
                px++;
                *px = (u8)j;                        //PWM3T2L第二个翻转计数低字节

                j += PWM_DeadZone;                //死区
                px = PWM4T2H;                        // PWM4T2H指向PWM4
                *px = (u8)(j >> 8);        //第二个翻转计数高字节
                px++;
                *px = (u8)j;                        //PWM4T2L第二个翻转计数低字节
只给PWM4T2H,PWM4T2L刷新新数值了,怎么没有给PWM4T1H,PWM4T1L刷新数值呢
(只给PWM3T2H,PWM3T2L刷新新数值了,怎么没有给PWM3T1H,PWM3T1L刷新数值呢)

net20 发表于 2016-1-16 14:12:33

本帖最后由 net20 于 2016-1-16 14:13 编辑

问题已解决
用示波器观察了一下,单独给PWM3T2H,PWM3T2L一个数值就可以改变输出脉冲的占空比。脉冲频率是10KHz;PWM3T2H,PWM3T2L的值等于7的时候,占空比约为0.4%;PWM3T2H,PWM3T2L的值等于2370的时候,占空比约为96%。
在初始化的时候,给PWM3T1H,PWM3T1L;PWM3T2H,PWM3T2L赋值,可以定义初始波形。

net20 发表于 2016-1-22 15:59:21

本帖最后由 net20 于 2016-1-22 16:01 编辑



相位差120度,三相六路SPWM输出,可变频,变压
http://www.dianyuan.com/bbs/1521803.html

小李非刀 发表于 2016-1-24 22:28:07

各个T1成120度,只改变T2就可以改变占空比,不影响120度相位。

xyz2008 发表于 2016-4-14 09:04:59

net20 发表于 2016-1-22 15:59
相位差120度,三相六路SPWM输出,可变频,变压
http://www.dianyuan.com/bbs/1521803.html ...

好贴,楼主把你的所以资料传到论坛来吧,谢谢

koenlee93 发表于 2016-7-26 18:58:44

回复下!

261854681 发表于 2016-8-7 01:07:25

楼主理解很深啊

liujunseu 发表于 2016-9-13 09:32:58

你有没有遇到程序里把spwm的频率设置成16K,但是输出的波形有问题,这种情况

net20 发表于 2016-11-11 07:03:12

liujunseu 发表于 2016-9-13 09:32
你有没有遇到程序里把spwm的频率设置成16K,但是输出的波形有问题,这种情况 ...

是载波频率16K吧?

qd118118 发表于 2016-11-11 11:21:35

好贴,留个印记

myhonour 发表于 2016-11-11 14:02:48


好贴,留个印记

modhwh 发表于 2016-11-14 12:40:43

可以做变频器啦!

max0527@126.com 发表于 2016-11-28 21:10:33

不错,学习一下

max0527@126.com 发表于 2016-11-28 21:10:48

不错,认认真真的学习一下

ypc168k 发表于 2017-1-25 00:32:47

楼主好,我也准备弄这个驱动三相电机,可以参考学习一下吗,谢谢!

ypc168k 发表于 2017-2-2 20:38:43

楼主,你好,为什么我把你这个程序下载到STC15F2K48S2里面,P2.1,P2.2口没有反应呢?

ypc168k 发表于 2017-2-2 23:02:40

ypc168k 发表于 2017-2-2 20:38
楼主,你好,为什么我把你这个程序下载到STC15F2K48S2里面,P2.1,P2.2口没有反应呢? ...

哈哈   知道原因了    型号都不一样   谢谢楼主

失落的孤独 发表于 2017-3-9 08:43:31

输出的波形不对   楼主后来改哪里了?指教

warrenyan7251 发表于 2017-3-9 08:47:57

收藏了,正要研究
页: [1]
查看完整版本: STC15W4K SPWM官方例程(程序有点疑问,请大家指导一下)