ABCASDE 2023-05-22 17:45 采纳率: 0%
浏览 49

stc15w4k32s4单片机输出pwm

用stc15w4k32s4单片机,做一个输出6路的pwm信号,其中pwm2跟pwm3
4跟5
6跟7
输出pwm波形互补

只有两路代码,并不清楚怎么改成6路

img




#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输出端口的初始电平, 01).


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

u8    PWM_Index;    //SPWM查表索引


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





  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-05-22 20:09
    关注
    • 给你找了一篇非常好的博客,你可以看看是否有帮助,链接:STC15W4K32S4 6通道高精度PWM
    • 除此之外, 这篇博客: STC15W408AS单片机3路PWM输出波形实测中的 分析工具 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
    • 某宝25就的工具,速度最高是24M的,完全够用了。

      在这里插入图片描述

      • Logic 2.3.41(软件官网即可下载到,不过只支持英文的)
        在这里插入图片描述
    评论

报告相同问题?

问题事件

  • 创建了问题 5月22日

悬赏问题

  • ¥15 有偿求苍穹外卖环境配置
  • ¥15 代码在keil5里变成了这样怎么办啊,文件图像也变了,
  • ¥20 Ue4.26打包win64bit报错,如何解决?(语言-c++)
  • ¥15 clousx6整点报时指令怎么写
  • ¥30 远程帮我安装软件及库文件
  • ¥15 关于#自动化#的问题:如何通过电脑控制多相机同步拍照或摄影(相机或者摄影模组数量大于60),并将所有采集的照片或视频以一定编码规则存放至规定电脑文件夹内
  • ¥20 深信服vpn-2050这台设备如何配置才能成功联网?
  • ¥15 Arduino的wifi连接,如何关闭低功耗模式?
  • ¥15 Android studio 无法定位adb是什么问题?
  • ¥15 C#连接不上服务器,