DSPwilliam hill官网
直播中

sunyu817

8年用户 54经验值
擅长:处理器/DSP
私信 关注

dsp 28335 epwm

要在epwm1a和epwm1B产生频率不同的波形应该怎么编程?下面的程序产生的占空比时相同的,应该怎么修改下列程序?
void InitEPwm1()
{
        //Modulatedwave();
   EPwm1Regs.TBPRD = 30000;                         // 设置开关周期
   EPwm1Regs.TBPHS.half.TBPHS = 0x0000;                   // 相位置零
   EPwm1Regs.TBCTR = 0x0000;                              // 计数器清零

   //时间基准控制寄存器
   EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;                 // 向上波形比较
   EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;                // 禁止相位装载
   EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;               // 高速时间基准分频
   EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;                        // 时间基准分频
        //计数比较控制寄存器设置
  EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;    // Load registers every ZERO
  EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
  EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
  EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
   // Set actions
   EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;
   EPwm1Regs.AQCTLA.bit.CBU = AQ_CLEAR;           // Set PWM1A on Zero


   EPwm1Regs.AQCTLB.bit.CAU = AQ_CLEAR;          // Set PWM1B on Zero
   EPwm1Regs.AQCTLB.bit.CBU = AQ_SET;}


void SPWM_cal(void)
{
       
        A1_dc=Chopperwave*sin(100*PI*t+0);                               
        if(A1_dc<0)        A1_dc=0;
        EPwm1Regs.CMPA.half.CMPA = 1000;
        if(1000+A1_dc*30000<=30000)
        EPwm1Regs.CMPB = 1000+A1_dc*30000;
        else
        EPwm1Regs.CMPB = A1_dc*30000-29000;}


已退回5积分

回帖(13)

aaaxxxrrr

2016-7-4 20:28:24
if(1000+A1_dc*30000<=30000)
        EPwm1Regs.CMPB = 1000+A1_dc*30000;
应该是这里出问题了,你应该串口打印一下A1_dc和A1_dc*30000的值查一下,只要在你的主函数中更改EPwm1Regs.CMPB使得与CMPA不一样,就会1a和1b占空比不同
举报

sunyu817

2016-7-5 09:32:10
引用: aaaxxxrrr 发表于 2016-7-4 20:28
if(1000+A1_dc*30000

您好,能清楚一点吗?比如说编一段体现这个的,十分感谢!
举报

aaaxxxrrr

2016-7-5 11:13:40
加入串口SCI的程序,将板子与电脑通过串口连接起来,调用printf("")函数,打印你需要查看的量,电脑打开串口调试助手,就可以看到了
举报

sunyu817

2016-7-5 15:11:35
引用: aaaxxxrrr 发表于 2016-7-5 11:13
加入串口SCI的程序,将板子与电脑通过串口连接起来,调用printf("")函数,打印你需要查看的量,电脑打开串口调试助手,就可以看到了

这个值我用示波器观察就可以了,我想问的是怎么进行软件编程让1A和1B输出的占空比不同。
举报

aaaxxxrrr

2016-7-5 21:16:34
EPwm1Regs.CMPB与CMPA不一样时,占空比就不一样了,波形也就不一样,你写的SPWM程序看不出你的意思
举报

380882985

2016-7-6 06:02:13
从程序上看  A1_DC=0 比较寄存器赋值是一样的 你先看看A1_DC值是多少  带着仿真器看
举报

sunyu817

2016-7-6 08:32:51
引用: 380882985 发表于 2016-7-6 06:02
从程序上看  A1_DC=0 比较寄存器赋值是一样的 你先看看A1_DC值是多少  带着仿真器看

是的,A1_DC=0时,EPwm1Regs.CMPA.half.CMPA = 1000;是一个固定的值
举报

sunyu817

2016-7-6 08:38:42
引用: aaaxxxrrr 发表于 2016-7-5 21:16
EPwm1Regs.CMPB与CMPA不一样时,占空比就不一样了,波形也就不一样,你写的SPWM程序看不出你的意思

这么说我可以给1A,1B不同的值,我将程序改成这样,报错。为 EPwm1Regs.CMPA.half.CMPA可能为fioat值
void SPWM_cal(void)
{
        
        A1_dc=Chopperwave*sin(100*PI*t+0);   
        A2_dc=Chopperwave*sin(100*PI*t+0.1);                              
         if(A2_dc*30000<=30000)
        EPwm1Regs.CMPA.half.CMPA = A1_dc*30000;
        else
        EPwm1Regs.CMPB = A1_dc*30000-29000;}

        if(A1_dc*30000<=30000)
        EPwm1Regs.CMPB = A1_dc*30000;
        else
        EPwm1Regs.CMPB = A1_dc*30000-29000;}
按理说这样就应该改变了值啊
举报

ocean0891

2016-7-13 11:05:28
修改EPwm1Regs.CMPA.half.CMPA和EPwm1Regs.CMPB的值具体多少自己看
举报

sunyu817

2016-7-20 15:30:43
根据计数方式,设置A、B的值就可以产生想要的波形
举报

1MENGXIANG

2016-8-1 10:26:03
请问有用DSP28335 驱动开关磁阻电机的吗
举报

1MENGXIANG

2016-8-1 10:27:29
引用: aaaxxxrrr 发表于 2016-7-4 20:28
if(1000+A1_dc*30000

请问有用28335驱动开关磁阻电机的吗  急需指导 小弟先谢过了
举报

sunyu817

2016-8-2 08:26:04
没有的
举报

更多回帖

发帖
×
20
完善资料,
赚取积分