找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1979|回复: 4
打印 上一主题 下一主题
收起左侧

STC8A8K64D4单片机增强型PWM输出两路互补SPWM程序

[复制链接]
跳转到指定楼层
楼主
ID:720347 发表于 2023-3-5 14:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*************  功能说明    **************
使用PWM0_3,PWM1_3产生互补的SPWM.

主时钟选择24MHZ, PWM时钟选择1T, PWM周期2400, 死区12个时钟(0.5us).正弦波表用200点.

输出正弦波频率 = 24000000 / 2400 / 200 = 50 HZ.

本程序从P6.0(PWM0_3)输出正相脉冲, 从P6.1(PWM1_3)输出反相脉冲(互补).

******************************************/

#include    "reg51.h"       //包含此头文件后,里面声明的寄存器不需要再手动输入,避免重复定义
#include    "intrins.h"
#include    "T_SineTable.h"

#define     MAIN_Fosc       24000000L   //定义主时钟

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

typedef     unsigned char   u8;
typedef     unsigned int    u16;
typedef     unsigned long   u32;

//手动输入声明"reg51.h"头文件里面没有定义的寄存器
sfr TH2  = 0xD6;
sfr TL2  = 0xD7;
sfr IE2  = 0xAF;
sfr INT_CLKO = 0x8F;
sfr AUXR = 0x8E;
sfr P_SW1 = 0xA2;
sfr P_SW2 = 0xBA;

sfr PWMSET = 0xF1;
sfr PWMCFG = 0xF6;

sfr P4   = 0xC0;
sfr P5   = 0xC8;
sfr P6   = 0xE8;
sfr P7   = 0xF8;
sfr P1M1 = 0x91;    //PxM1.n,PxM0.n     =00--->Standard,    01--->push-pull
sfr P1M0 = 0x92;    //                  =10--->pure input,  11--->open drain
sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
sfr P2M1 = 0x95;
sfr P2M0 = 0x96;
sfr P3M1 = 0xB1;
sfr P3M0 = 0xB2;
sfr P4M1 = 0xB3;
sfr P4M0 = 0xB4;
sfr P5M1 = 0xC9;
sfr P5M0 = 0xCA;
sfr P6M1 = 0xCB;
sfr P6M0 = 0xCC;
sfr P7M1 = 0xE1;
sfr P7M0 = 0xE2;

sbit P00 = P0^0;
sbit P01 = P0^1;
sbit P02 = P0^2;
sbit P03 = P0^3;
sbit P04 = P0^4;
sbit P05 = P0^5;
sbit P06 = P0^6;
sbit P07 = P0^7;
sbit P10 = P1^0;
sbit P11 = P1^1;
sbit P12 = P1^2;
sbit P13 = P1^3;
sbit P14 = P1^4;
sbit P15 = P1^5;
sbit P16 = P1^6;
sbit P17 = P1^7;
sbit P20 = P2^0;
sbit P21 = P2^1;
sbit P22 = P2^2;
sbit P23 = P2^3;
sbit P24 = P2^4;
sbit P25 = P2^5;
sbit P26 = P2^6;
sbit P27 = P2^7;
sbit P30 = P3^0;
sbit P31 = P3^1;
sbit P32 = P3^2;
sbit P33 = P3^3;
sbit P34 = P3^4;
sbit P35 = P3^5;
sbit P36 = P3^6;
sbit P37 = P3^7;
sbit P40 = P4^0;
sbit P41 = P4^1;
sbit P42 = P4^2;
sbit P43 = P4^3;
sbit P44 = P4^4;
sbit P45 = P4^5;
sbit P46 = P4^6;
sbit P47 = P4^7;
sbit P50 = P5^0;
sbit P51 = P5^1;
sbit P52 = P5^2;
sbit P53 = P5^3;
sbit P54 = P5^4;
sbit P55 = P5^5;
sbit P56 = P5^6;
sbit P57 = P5^7;

/****************************** XFR定义* ***********************************/

#define     PWMC                    (*(unsigned int  volatile xdata *)0xff00)
#define     PWMCH                   (*(unsigned char volatile xdata *)0xff00)
#define     PWMCL                   (*(unsigned char volatile xdata *)0xff01)
#define     PWMCKS                  (*(unsigned char volatile xdata *)0xff02)
#define     PWM_SELT2               0x10
#define     PWMTADC                 (*(unsigned int  volatile xdata *)0xff03)
#define     PWMTADCH                (*(unsigned char volatile xdata *)0xff03)
#define     PWMTADCL                (*(unsigned char volatile xdata *)0xff04)
#define     PWMIF                   (*(unsigned char volatile xdata *)0xff05)
#define     PWM_C7IF                0x80
#define     PWM_C6IF                0x40
#define     PWM_C5IF                0x20
#define     PWM_C4IF                0x10
#define     PWM_C3IF                0x08
#define     PWM_C2IF                0x04
#define     PWM_C1IF                0x02
#define     PWM_C0IF                0x01
#define     PWMFDCR                 (*(unsigned char volatile xdata *)0xff06)
#define     PWMFD_INVCMP            0x80
#define     PWMFD_INVIO             0x40
#define     PWMFD_ENFD              0x20
#define     PWMFD_FLTFLIO           0x10
#define     PWMFD_EFDI              0x08
#define     PWMFD_FDCMP             0x04
#define     PWMFD_FDIO              0x02
#define     PWMFD_FDIF              0x01
#define     PWMDELSEL               (*(unsigned char volatile xdata *)0xff07)
#define     PWM_CH03FULL            0x00
#define     PWM_CH03HALF            0x01
#define     PWM_CH03NONE            0x02
#define     PWM_CH47FULL            0x00
#define     PWM_CH47HALF            0x04
#define     PWM_CH47NONE            0x08
#define     PWM0T1                  (*(unsigned int  volatile xdata *)0xff10)
#define     PWM0T1H                 (*(unsigned char volatile xdata *)0xff10)
#define     PWM0T1L                 (*(unsigned char volatile xdata *)0xff11)
#define     PWM0T2                  (*(unsigned int  volatile xdata *)0xff12)
#define     PWM0T2H                 (*(unsigned char volatile xdata *)0xff12)
#define     PWM0T2L                 (*(unsigned char volatile xdata *)0xff13)
#define     PWM0CR                  (*(unsigned char volatile xdata *)0xff14)
#define     PWM_ENO                 0x80
#define     PWM_INI0                0x00
#define     PWM_INI1                0x40
#define     PWM_ENI                 0x04
#define     PWM_ENT2I               0x02
#define     PWM_ENT1I               0x01
#define     PWM0HLD                 (*(unsigned char volatile xdata *)0xff15)
#define     PWM_HLDH                0x02
#define     PWM_HLDL                0x01
#define     PWM1T1                  (*(unsigned int  volatile xdata *)0xff18)
#define     PWM1T1H                 (*(unsigned char volatile xdata *)0xff18)
#define     PWM1T1L                 (*(unsigned char volatile xdata *)0xff19)
#define     PWM1T2                  (*(unsigned int  volatile xdata *)0xff1a)
#define     PWM1T2H                 (*(unsigned char volatile xdata *)0xff1a)
#define     PWM1T2L                 (*(unsigned char volatile xdata *)0xff1b)
#define     PWM1CR                  (*(unsigned char volatile xdata *)0xff1c)
#define     PWM1HLD                 (*(unsigned char volatile xdata *)0xff1d)
#define     PWM2T1                  (*(unsigned int  volatile xdata *)0xff20)
#define     PWM2T1H                 (*(unsigned char volatile xdata *)0xff20)
#define     PWM2T1L                 (*(unsigned char volatile xdata *)0xff21)
#define     PWM2T2                  (*(unsigned int  volatile xdata *)0xff22)
#define     PWM2T2H                 (*(unsigned char volatile xdata *)0xff22)
#define     PWM2T2L                 (*(unsigned char volatile xdata *)0xff23)
#define     PWM2CR                  (*(unsigned char volatile xdata *)0xff24)
#define     PWM2HLD                 (*(unsigned char volatile xdata *)0xff25)
#define     PWM3T1                  (*(unsigned int  volatile xdata *)0xff28)
#define     PWM3T1H                 (*(unsigned char volatile xdata *)0xff28)
#define     PWM3T1L                 (*(unsigned char volatile xdata *)0xff29)
#define     PWM3T2                  (*(unsigned int  volatile xdata *)0xff2a)
#define     PWM3T2H                 (*(unsigned char volatile xdata *)0xff2a)
#define     PWM3T2L                 (*(unsigned char volatile xdata *)0xff2b)
#define     PWM3CR                  (*(unsigned char volatile xdata *)0xff2c)
#define     PWM3HLD                 (*(unsigned char volatile xdata *)0xff2d)
#define     PWM4T1                  (*(unsigned int  volatile xdata *)0xff30)
#define     PWM4T1H                 (*(unsigned char volatile xdata *)0xff30)
#define     PWM4T1L                 (*(unsigned char volatile xdata *)0xff31)
#define     PWM4T2                  (*(unsigned int  volatile xdata *)0xff32)
#define     PWM4T2H                 (*(unsigned char volatile xdata *)0xff32)
#define     PWM4T2L                 (*(unsigned char volatile xdata *)0xff33)
#define     PWM4CR                  (*(unsigned char volatile xdata *)0xff34)
#define     PWM4HLD                 (*(unsigned char volatile xdata *)0xff35)
#define     PWM5T1                  (*(unsigned int  volatile xdata *)0xff38)
#define     PWM5T1H                 (*(unsigned char volatile xdata *)0xff38)
#define     PWM5T1L                 (*(unsigned char volatile xdata *)0xff39)
#define     PWM5T2                  (*(unsigned int  volatile xdata *)0xff3a)
#define     PWM5T2H                 (*(unsigned char volatile xdata *)0xff3a)
#define     PWM5T2L                 (*(unsigned char volatile xdata *)0xff3b)
#define     PWM5CR                  (*(unsigned char volatile xdata *)0xff3c)
#define     PWM5HLD                 (*(unsigned char volatile xdata *)0xff3d)
#define     PWM6T1                  (*(unsigned int  volatile xdata *)0xff40)
#define     PWM6T1H                 (*(unsigned char volatile xdata *)0xff40)
#define     PWM6T1L                 (*(unsigned char volatile xdata *)0xff41)
#define     PWM6T2                  (*(unsigned int  volatile xdata *)0xff42)
#define     PWM6T2H                 (*(unsigned char volatile xdata *)0xff42)
#define     PWM6T2L                 (*(unsigned char volatile xdata *)0xff43)
#define     PWM6CR                  (*(unsigned char volatile xdata *)0xff44)
#define     PWM6HLD                 (*(unsigned char volatile xdata *)0xff45)
#define     PWM7T1                  (*(unsigned int  volatile xdata *)0xff48)
#define     PWM7T1H                 (*(unsigned char volatile xdata *)0xff48)
#define     PWM7T1L                 (*(unsigned char volatile xdata *)0xff49)
#define     PWM7T2                  (*(unsigned int  volatile xdata *)0xff4a)
#define     PWM7T2H                 (*(unsigned char volatile xdata *)0xff4a)
#define     PWM7T2L                 (*(unsigned char volatile xdata *)0xff4b)
#define     PWM7CR                  (*(unsigned char volatile xdata *)0xff4c)
#define     PWM7HLD                 (*(unsigned char volatile xdata *)0xff4d)

/*************  本地变量声明    **************/

u16 PWM1_Duty;
u8        PWM_Index;        //SPWM查表索引

/*************  本地函数声明    **************/

void PWM_config(void);
        
/******************** 主函数 **************************/
void main(void)
{
    P0M1 = 0x00;   P0M0 = 0x00;   //设置为准双向口
    P1M1 = 0x00;   P1M0 = 0x00;   //设置为准双向口
    P2M1 = 0x00;   P2M0 = 0x00;   //设置为准双向口
    P3M1 = 0x00;   P3M0 = 0x00;   //设置为准双向口
    P4M1 = 0x00;   P4M0 = 0x00;   //设置为准双向口
    P5M1 = 0x30;   P5M0 = 0x00;   //设置为准双向口, 设置P5.4,P5.5(蜂鸣器)高阻输入
    P6M1 = 0x00;   P6M0 = 0x03;   //设置为准双向口, 设置P6.0,P6.1推挽输出
    P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口

    PWM1_Duty = 1220;

    PWM_config();

    EA = 1;     //打开总中断

    while (1)
    {
    }
}

//========================================================================
// 函数: void PWM_config(void)
// 描述: PWM初始化函数。
// 参数: 无.
// 返回: 无.
// 版本: V1.0, 2020-6-10
//========================================================================
void PWM_config(void)
{
    PWMSET = 0x01;                //使能PWM模块
    P_SW2 |= 0x80;
    PWMCKS = 0x00;                //PWM时钟为系统时钟
    PWMC = 2400;                        //PWM周期
    PWM0T1 = 65 - PWM_DeadZone;                        //低电平输出位置
    PWM0T2 = 1220 + PWM_DeadZone;                //高电平输出位置
    PWM0CR = 0x90;                //使能PWM输出, 初始电平为0, 选择P6.0

    PWM1T1 = 1220;        //低电平输出位置
    PWM1T2 = 65;        //高电平输出位置
    PWM1CR = 0xD0;                //使能PWM输出, 初始电平为1, 选择P6.1

    P_SW2 &= 0x7f;
    PWMCFG = 0x05;        //启动PWM模块, 允许PWM计数器归零中断
}

/********************* PWM中断函数************************/

void PWM_int (void) interrupt 22
{
        char store;
        store = P_SW2;
        P_SW2 |= 0x80;

        if(PWMCFG & 0x08)                //PWM计数器中断
        {
                PWMCFG &= ~0x08;                //清PWM计数器中断标志

                PWM0T2 = T_SinTable[PWM_Index] + PWM_DeadZone;
                PWM1T1 = T_SinTable[PWM_Index];
               
                if(++PWM_Index >= 200)        PWM_Index = 0;

        }
/*
        if(PWMIF & C0IF)        //PWM0中断标志
        {
                PWMIF &= ~C0IF;        //清除中断标志
        }

        if(PWMIF & C1IF)        //PWM1中断标志
        {
                PWMIF &= ~C1IF;        //清除中断标志
        }

        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;        //清除中断标志
        }
*/
        P_SW2 = store;
}
/*---------------------------------------------------------------------*/
/*本程序使用了STC的资料及程序,学习使用,感谢支持    */
/*---------------------------------------------------------------------*/

51hei.png (22.8 KB, 下载次数: 84)

51hei.png

51hei.png (3.23 KB, 下载次数: 84)

51hei.png

增强型PWM输出两路互补SPWM.zip

79.86 KB, 下载次数: 41, 下载积分: 黑币 -5

SPWM程序

评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:7199 发表于 2023-6-15 19:11 | 只看该作者
有空可以下载下来看一下,谢谢分享
回复

使用道具 举报

板凳
ID:21740 发表于 2023-6-18 13:45 | 只看该作者
好东西哦!收下了!谢谢分享!!!!!!!!!!!!!!!!!!
回复

使用道具 举报

地板
ID:675799 发表于 2023-8-22 10:05 | 只看该作者
void PWM_config(void)
{
    PWMSET = 0x01;                //使能PWM模块
    P_SW2 |= 0x80;
    PWMCKS = 0x00;                //PWM时钟为系统时钟
    PWMC = 2400;                        //PWM周期   
--------------------------------------------------------------------
如果要改变1下频率, 把2400 改3000 就是 40HZ,     但是如何在代码运行后30秒 40HZ改为  50hz, 应该如果 改?PWMC = 3000      // 40HZ      PWMC = 2400     //50HZ
回复

使用道具 举报

5#
ID:1064915 发表于 2023-8-22 14:38 | 只看该作者
STC8A8K64D4.7z (2.63 KB, 下载次数: 8)
官方有头文件
sfr         T2H         =           0xd6;
sfr         T2L         =           0xd7;

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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