请问一下,将C28设定为PWM输出控制电机,如何设置才能使PWM输出反向?

脑洞大赛13 ( 楼主 ) 2018-6-14 08:22:52  显示全部楼层
本帖最后由 一只耳朵怪 于 2018-6-14 10:12 编辑

请问一下,将C28设定为PWM输出控制电机。按照例参考手册设定可以正常工作,但是现在希望将PWM输出反向,其它设定不变。
原始设定
EPwm1Regs.AQCTLA.bit.CAU = AQ_SET; // Set PWM1A on event A, up count
EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR; // Clear PWM1A on event A, down count
更改后的设定
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR ; // Clear PWM1A on event A, up count
EPwm1Regs.AQCTLA.bit.CAD = AQ_SET; // Set PWM1A on event A, down count

但是PWM实际输出不是想要的波形,不知要需要怎样设定,请指教!
PWM

11个回复

szoldman 发表于 2018-6-14 08:28:11
更改后的波形是什么样的?
回复

举报 使用道具

脑洞大赛13 发表于 2018-6-14 08:35:47
szoldman 发表于 2018-6-14 08:28
更改后的波形是什么样的?

你好,
是这样的,
正常设定CMPA值增加时,PWM输出的高电平宽度变小。
而将AQCTLA的设定反向时,CMPA增加,PWM输出的高电平宽度也是变小的。
回复

举报 使用道具

szoldman 发表于 2018-6-14 08:50:51
脑洞大赛13 发表于 2018-6-14 08:35
你好,
是这样的,
正常设定CMPA值增加时,PWM输出的高电平宽度变小。

你需要将ZRO和PRD也设置成反相。
回复

举报 使用道具

009712 发表于 2018-6-14 08:55:51
脑洞大赛13 发表于 2018-6-14 08:35
你好,
是这样的,
正常设定CMPA值增加时,PWM输出的高电平宽度变小。

你的程序修改是没错的。有种可能是你开启了死区设置,并且以EPWMB为基准,这样PWMA输出只会按照B通道设置。你可以把整个EPWM的所有寄存器设置发上来检查
回复

举报 使用道具

脑洞大赛13 发表于 2018-6-14 09:01:48
009712 发表于 2018-6-14 08:55
你的程序修改是没错的。有种可能是你开启了死区设置,并且以EPWMB为基准,这样PWMA输出只会按照B通道设置。你可以把整个EPWM的所有寄存器设置发上来检查

原来的设定:
//EPMW Module 1 config
// Setup TBCLK
EPwm1Regs.TBPRD = EPWM1_TIMER_TBPRD; // Set timer period 801 TBCLKs
EPwm1Regs.TBPHS.half.TBPHS = 0x0000; // Phase is 0
EPwm1Regs.TBCTR = 0x0000; // Clear counter
// Set Compare values
// EPwm1Regs.CMPA.half.CMPA = EPWM1_MIN_CMPA; // Set compare A value
// Setup counter mode
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Count up/down
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // Disable phase loading
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // Clock ratio to SYSCLKOUT
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;
EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW;
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO; // Sync down-stream module
// Setup shadowing
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // Load on Zero
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
// Set actions

 EPwm1Regs.AQCTLA.bit.CAU = AQ_SET; // Set PWM1A on event A, up count
 EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR; // Clear PWM1A on event A, down count


// // Active Low PWMs - Setup Deadband
EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;

EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;

EPwm1Regs.DBRED = EPWM_DB;
EPwm1Regs.DBFED = EPWM_DB;

反向的设定:

//EPMW Module 1 config
// Setup TBCLK
EPwm1Regs.TBPRD = EPWM1_TIMER_TBPRD; // Set timer period 801 TBCLKs
EPwm1Regs.TBPHS.half.TBPHS = 0x0000; // Phase is 0
EPwm1Regs.TBCTR = 0x0000; // Clear counter
// Set Compare values
// EPwm1Regs.CMPA.half.CMPA = EPWM1_MIN_CMPA; // Set compare A value
// Setup counter mode
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Count up/down
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // Disable phase loading
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // Clock ratio to SYSCLKOUT
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;
EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW;
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO; // Sync down-stream module
// Setup shadowing
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // Load on Zero
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

 EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR ; // Set PWM1A on event A, up count
 EPwm1Regs.AQCTLA.bit.CAD = AQ_SET; // Clear PWM1A on event A, down count



// // Active Low PWMs - Setup Deadband
EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;
EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_LOC;

EPwm1Regs.DBRED = EPWM_DB;
EPwm1Regs.DBFED = EPWM_DB;

请帮忙检查!
回复

举报 使用道具

gumie7235 发表于 2018-6-14 09:21:03
脑洞大赛13 发表于 2018-6-14 09:01
原来的设定:
//EPMW Module 1 config
// Setup TBCLK

EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;
设置成这样,直接取反
                                                                        keep on studying
回复

举报 使用道具

脑洞大赛13 发表于 2018-6-14 09:38:26
gumie7235 发表于 2018-6-14 09:21
EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;
设置成这样,直接取反
                                                                        keep on studying

不行呢。
设置成这样EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;
死区的前后顺序不正确。正常需要A延后B下降,但是这样设定变成A提前B下降了。
回复

举报 使用道具

脑洞大赛13 发表于 2018-6-14 09:50:49
009712 发表于 2018-6-14 08:55
你的程序修改是没错的。有种可能是你开启了死区设置,并且以EPWMB为基准,这样PWMA输出只会按照B通道设置。你可以把整个EPWM的所有寄存器设置发上来检查

 Dear  Terry :
请问这样的配置要怎么修改!
还请帮忙!
谢谢!
回复

举报 使用道具

009712 发表于 2018-6-14 10:02:55
脑洞大赛13 发表于 2018-6-14 09:50
 Dear  Terry :
请问这样的配置要怎么修改!
还请帮忙!

只是想把电平取反的话,

这个不用修改,保持和原来一样
EPwm1Regs.AQCTLA.bit.CAU = AQ_SET ; // Set PWM1A on event A, up count
 EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR; // Clear PWM1A on event A, down count

只修改这个就可以了
EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_LOC;
回复

举报 使用道具

脑洞大赛13 发表于 2018-6-14 10:07:57
009712 发表于 2018-6-14 10:02
只是想把电平取反的话,

这个不用修改,保持和原来一样

Terry:
可以了!
感谢!
回复

举报 使用道具

王栋春 发表于 2018-6-14 13:00:03
学习了,最近刚好接触到
回复

举报 使用道具

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

本版积分规则


关闭

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

小黑屋|手机版|Archiver|电子发烧友 ( 粤ICP备14022951号-2 )

GMT+8, 2018-7-18 14:54 , Processed in 0.874781 second(s), 24 queries , Memcache On.

Powered by 电子发烧友网

© 2015 bbs.elecfans.com

微信扫描
快速回复 返回顶部 返回列表