社区导航

 

搜索
查看: 455|回复: 7

[求助] 28335为啥不能4路PWM同时输出

[复制链接]

5

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2019-7-30 14:37 | 显示全部楼层 |阅读模式

#include"DSP28x_Project.h"

#define CPU_CLK 150e6   //系统时钟150MHz
#define TBCTLVAL 0x200E     //控制寄存器的值

Uint32 PWM_CLK,PWM_CLK1,PWM_CLK2;
float SP,SP1,SP2;

void main(void)
{

    InitSysCtrl();   //初始化系统
    InitGpio();     //初始化GPIIO
    InitPieCtrl();  //清除所有中断
    IER = 0x0000;
    IFR = 0x0000;
    InitPieVectTable();  //初始化中断向量表


    PWM_CLK1 = 1000;
    SP1 = CPU_CLK/(2*PWM_CLK1);
    InitEPwm1Gpio();
    EPwm1Regs.TBSTS.all = 0;   //将时基的状态寄存器清零
    EPwm1Regs.TBPHS.half.TBPHS = 0;  //相位寄存器设置为0
    EPwm1Regs.TBCTR = 0;   //时基计数器清零
    EPwm1Regs.CMPCTL.all = 0x50;  //CMPA和CMPB配置为立即模式
    EPwm1Regs.CMPA.half.CMPA = SP1/2;  //设置占空比为0.5,SP是周期寄存器的值
    EPwm1Regs.CMPB = 0;
    EPwm1Regs.AQCTLA.all = 0x60;   //当时间基准计数器的值等于CMPA的值,且正在递增计数,EPWMxA输出高电平;当时间基准计数器的值等于CMPA的值,且正在递减计数,EPWMxA输出低电平
    EPwm1Regs.AQCTLB.all = 0;
    EPwm1Regs.AQSFRC.all = 0;
    EPwm1Regs.AQCSFRC.all = 0;
    EPwm1Regs.DBCTL.all = 0xb;    //EPwm1B与EPwm1A相关联,即EPwm1B随着EPwm1A的变化而变化
    EPwm1Regs.DBRED = 0;          //上升沿的死区时间设置为0
    EPwm1Regs.DBFED = 0;          //下降沿的死区时间设置为0
    EPwm1Regs.TZSEL.all = 0;      //没有用到联防区模块,全部失效
    EPwm1Regs.TZCTL.all = 0;
    EPwm1Regs.TZEINT.all = 0;
    EPwm1Regs.TZFLG.all = 0;
    EPwm1Regs.TZCLR.all = 0;
    EPwm1Regs.TZFRC.all = 0;
    EPwm1Regs.ETSEL.all = 0;
    EPwm1Regs.ETFLG.all = 0;
    EPwm1Regs.ETCLR.all = 0;
    EPwm1Regs.ETFRC.all = 0;
    EPwm1Regs.PCCTL.all = 0;
    EPwm1Regs.TBCTL.all = 0x0010 + TBCTLVAL;    //增减模式
    EPwm1Regs.TBPRD = SP1;

 

    PWM_CLK2 = 2000;
    SP2 = CPU_CLK/(2*PWM_CLK2);
    InitEPwm2Gpio();
    EPwm2Regs.TBSTS.all = 0;   //将时基的状态寄存器清零
    EPwm2Regs.TBPHS.half.TBPHS = 0;  //相位寄存器设置为0
    EPwm2Regs.TBCTR = 0;   //时基计数器清零
    EPwm2Regs.CMPCTL.all = 0x50;  //CMPA和CMPB配置为立即模式
    EPwm2Regs.CMPA.half.CMPA = SP2/2;  //设置占空比为0.5,SP是周期寄存器的值
    EPwm2Regs.CMPB = 0;
    EPwm2Regs.AQCTLA.all = 0x60;   //当时间基准计数器的值等于CMPA的值,且正在递增计数,EPWMxA输出高电平;当时间基准计数器的值等于CMPA的值,且正在递减计数,EPWMxA输出低电平
    EPwm2Regs.AQCTLB.all = 0;
    EPwm2Regs.AQSFRC.all = 0;
    EPwm2Regs.AQCSFRC.all = 0;
    EPwm2Regs.DBCTL.all = 0xb;    //EPwm1B与EPwm1A相关联,即EPwm1B随着EPwm1A的变化而变化
    EPwm2Regs.DBRED = 0;          //上升沿的死区时间设置为0
    EPwm2Regs.DBFED = 0;          //下降沿的死区时间设置为0
    EPwm2Regs.TZSEL.all = 0;      //没有用到联防区模块,全部失效
    EPwm2Regs.TZCTL.all = 0;
    EPwm2Regs.TZEINT.all = 0;
    EPwm2Regs.TZFLG.all = 0;
    EPwm2Regs.TZCLR.all = 0;
    EPwm2Regs.TZFRC.all = 0;
    EPwm2Regs.ETSEL.all = 0;
    EPwm2Regs.ETFLG.all = 0;
    EPwm2Regs.ETCLR.all = 0;
    EPwm2Regs.ETFRC.all = 0;
    EPwm2Regs.PCCTL.all = 0;
    EPwm2Regs.TBCTL.all = 0x0010 + TBCTLVAL;    //增减模式
    EPwm2Regs.TBPRD = SP2;

    for(; ;)
    {

    }
}


//看了示波器,只有输出2000Hz的波形,1000Hz的为啥没有??哪里写错了,请指教,小白一枚。

来源:EEWorld 微控制器 MCU板块,转载请附上链接


回复

使用道具 举报

2449

TA的帖子

0

TA的资源

纯净的硅(初级)

Rank: 4

发表于 2019-7-30 15:12 | 显示全部楼层

好好检查程序,一定可以做到的

为江山踏坏了乌骓马,为社稷拉断了宝雕弓。


回复

使用道具 举报

5

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2019-7-30 15:22 | 显示全部楼层
chenbingjy 发表于 2019-7-30 15:12 好好检查程序,一定可以做到的

每个pwm波的配置都一样的,只是改变了频率和周期值。单个PWM编译都能成功。。

点评

不明白你说的"单个PWM编译都能成功"是什么意思? 单个都能产生波形吗?  详情 回复 发表于 2019-7-30 15:36


回复

使用道具 举报

2449

TA的帖子

0

TA的资源

纯净的硅(初级)

Rank: 4

发表于 2019-7-30 15:36 | 显示全部楼层
本帖最后由 chenbingjy 于 2019-7-30 15:39 编辑
我将变成怎样 发表于 2019-7-30 15:22 每个pwm波的配置都一样的,只是改变了频率和周期值。单个PWM编译都能成功。。

不明白你说的"单个PWM编译都能成功"是什么意思?

单个都能产生波形吗?

确定管脚都不一样吧

为江山踏坏了乌骓马,为社稷拉断了宝雕弓。


回复

使用道具 举报

5

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2019-7-30 15:46 | 显示全部楼层
chenbingjy 发表于 2019-7-30 15:36 我将变成怎样 发表于 2019-7-30 15:22 每个pwm波的配置都一样的,只是改变了频率和周期值。单个PWM编译都 ...

4个管脚,只有两个有互补波形。PWM1与PWM2分开编译,对应的两个GPIO口都有波形。程序合在一起编译(如上图的程序),PWM2对应的两个GPIO口有波形,PWM1的没有。



回复

使用道具 举报

2449

TA的帖子

0

TA的资源

纯净的硅(初级)

Rank: 4

发表于 2019-7-30 15:51 | 显示全部楼层

 InitEPwm2Gpio();

感觉很奇怪。会不会是你 InitEPwm2Gpio();把 InitEPwm1Gpio();里的给覆盖掉啦。

贴出代码。

为江山踏坏了乌骓马,为社稷拉断了宝雕弓。


回复

使用道具 举报

5

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2019-7-30 15:58 | 显示全部楼层
chenbingjy 发表于 2019-7-30 15:51  InitEPwm2Gpio(); 感觉很奇怪。会不会是你 InitEPwm2Gpio();把 InitEPwm1Gpio();里的给 ...

void 
InitEPwm1Gpio(void)
{
    EALLOW;

    //
    // Enable internal pull-up for the selected pins
    // Pull-ups can be enabled or disabled by the user. 
    // This will enable the pullups for the specified pins.
    // Comment out other unwanted lines.
    //
    GpioCtrlRegs.GPAPUD.bit.GPIO0 = 0;    // Enable pull-up on GPIO0 (EPWM1A)
    GpioCtrlRegs.GPAPUD.bit.GPIO1 = 0;    // Enable pull-up on GPIO1 (EPWM1B)   

    //
    // Configure ePWM-1 pins using GPIO regs
    // This specifies which of the possible GPIO pins will be ePWM1 functional 
    // pins. Comment out other unwanted lines.
    //
    GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1;   // Configure GPIO0 as EPWM1A
    GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1;   // Configure GPIO1 as EPWM1B

    EDIS;
}

 

void 
InitEPwm2Gpio(void)
{
    EALLOW;

    //
    // Enable internal pull-up for the selected pins
    // Pull-ups can be enabled or disabled by the user. 
    // This will enable the pullups for the specified pins.
    // Comment out other unwanted lines.
    //
    GpioCtrlRegs.GPAPUD.bit.GPIO2 = 0;    // Enable pull-up on GPIO2 (EPWM2A)
    GpioCtrlRegs.GPAPUD.bit.GPIO3 = 0;    // Enable pull-up on GPIO3 (EPWM3B)

    //
    // Configure ePWM-2 pins using GPIO regs
    // This specifies which of the possible GPIO pins will be ePWM2 functional 
    // pins. Comment out other unwanted lines.
    //
    GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 1;   // Configure GPIO2 as EPWM2A
    GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 1;   // Configure GPIO3 as EPWM2B

    EDIS;
}

//文件里配置的,没改过。



回复

使用道具 举报

1356

TA的帖子

0

TA的资源

纯净的硅(初级)

Rank: 4

发表于 2019-7-31 08:15 | 显示全部楼层

慢慢查吧,还得结合内核里面的基础单元。



回复

使用道具 举报

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

关闭

站长推荐上一条 /3 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2019-8-22 23:19 , Processed in 0.246004 second(s), 17 queries , Gzip On, MemCache On.

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