工具/软件:Code Composer Studio
主席先生,
我正在尝试使用正弦查找表生成正弦 PWM。 但我没有得到任何输出、您能告诉我错误的地方。 我从 e2e.ti.com 的另一个链接中引用的查找表。
谢谢你
Bighnaraj Panda
- #include "F28x_Project.h"
- //
- // 定义
- //
- #define sine_table_length 100
- #define EPWM1_TIMER_TBPRD 2500 // 周期 寄存器
- #define EPWM2_TIMER_TBPRD 2500
- #define EPWM3_TIMER_TBPRD 2500
- #pragma DATA_SECTION (SineTable、"SineTableSection")
- uint32_t SineTable[sine_table_length]={
- 0x000000000000、0x41bc646b、0x423c5e7a、0x428d3f6d、0x42b46b4、0x42eb421a、0x430d1754、0x432484b3、0x433be7b1、0x435decd4、0x436a88a2、0x4380e1d24b、0x4324b、0x4424b、0x4324b、0x4324b、0x4324b、0x4324b、0x4324b、0x4324b、0x4324b、0x4324b、0x43a、0x43b、0x43b、0x43b、0x4324b、0x43b、0x43b、0x43b、0x43b、0x43b、0x43b、0x43b、0x43b、0x43b、0x43b、0x43b、0x43b、0x43b、0x43a、0x43b、0x43b、0x43b、0x43b、0x43b、0x43b、0x43b、0x43b、0x43b、0x43b、0x
- 0x44bb1ef7、0x44bb48f4、0x44bb6720、0x44bb7978、0x44bb7ffc};
- 对于 50% 占空 比、// CMPA 和 CMPB 总和应该为2500
- //
- int interrupt_count = 1;
- unsigned long IntCount;
- // 函数 原型
- void GPIO_setup (void);
- void InitEPwm1Examples(void);
- void InitEPwm2Examples(void);
- void InitEPwm3Examples(void);
- _interrupt void epwm1_ISR (void);
- _interrupt void epwm2_ISR (void);
- _interrupt void epwm3_ISR (void);
- //
- // 主函
- //
- void main (void)
- {
- InitSysCtrl();
- InitGpio();
- GPIO_setup ();
- CpuSysRegs.PCLKCR2.bit.EPWM1=1;
- CpuSysRegs.PCLKCR2.bit.EPWM2=1;
- CpuSysRegs.PCLKCR2.bit.EPWM3=1;
- InitEPwm1Gpio();
- InitEPwm2Gpio();
- InitEPwm3Gpio();
- Dint;
- InitPieCtrl();
- IER = 0x0000;
- IFR = 0x0000;
- InitPieVectTable();
- //
- EALLOW; // 这是写入 EALLOW 受保护 寄存器所必需的
- PieVectTable.EPWM1_INT = &epwm1_ISR;
- PieVectTable.EPWM2_INT = &epwm2_ISR;
- PieVectTable.EPWM3_INT = &epwm3/ISR;
- EDIS; // 这是禁止 写入 EALLOW 受保护 寄存器所必需的
- EALLOW;
- CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=0 ;
- EDIS;
- InitEPwm1Examples();
- InitEPwm2Examples();
- InitEPwm3Examples();
- EALLOW;
- CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=1 ;
- EDIS;
- IER |= M_INT3;
- PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
- PieCtrlRegs.PIEIER3.bit.INTx2 = 1;
- PieCtrlRegs.PIEIER3.bit.INTx3=1 ;
- //
- // 启用 全局 中断 和 更高优先级 的实时 调试 事件:
- //
- EINT; // 启用 全局 中断 INTM
- ERTM; // 启用 全局 实时 中断 DBGM
- //
- // 步骤 5.空闲 循环。 只 需坐下来 循环 ( 可选):
- while (1)
- {
- }
- }
- //
- // epwm1_ISR - EPWM1 ISR
- //
- _interrupt void epwm1_ISR (void)
- {
- interrupt_count++;
- 当 计数器 递减 计数 = CMPB 时、//生成第二个中断
- if (interrupt_count = 2)
- {
- GpioDataRegs.GPBDAT.bit.GPIO63 = 1; //将 GPIO-63设置 为高电平
- // GpioDataRegs.GPBSET.BIO63 = 1; //将 GPIO-63设置 为高电平
- // GpioDataRegs.GPADD.bit.GPIO14 = 1; //将 GPIO-14 设置为高电平
- // GpioDataRegs.GPASET.bit.GPIO14 = 1; //将 GPIO-14 置为高电平
- EPwm1Regs.ETSEL.bit.INTSEL = 7;
- }
- // 当计数器 递减 计数 = CMPB 时生成中断
- // 当 计数 器递增 计数 = CMPA 时、复位下一个中断以再次生成
- 其他
- {
- GpioDataRegs.GPBDAT.bit.GPIO63 = 0; //将 GPIO-63设置 为低电平
- // GpioDataRegs.GPBCLEAR.bit.GPIO63 = 1; //将 GPIO-63设置 为低电平
- // GpioDataRegs.GPADAT.bit.GPIO14 = 0; //将 GPIO-14 设置为低电平
- // GpioDataRegs.GPACLEAR.bit.GPIO14 = 1; //将 GPIO-14 置为低电平
- EPwm1Regs.ETSEL.bit.INTSEL = 4;
- INTERRUPT_COUNT = 1;
- }
- EPwm1Regs.ETCLR.bit.INT = 1;
- PieCtrlRegs.PIEACX.ALL = PIEACK_Group3;
- if ( IntCount < 100)
- {
- IntCount++;
- }
- 其他
- IntCount = 0;
- }
- _interrupt void epwm2_ISR (void)
- {
- EPwm2Regs.ETCLR.bit.INT = 1;
- PieCtrlRegs.PIEACX.ALL = PIEACK_Group3;
- if ( IntCount < 100)
- {
- IntCount++;
- }
- 其他
- IntCount = 0;
- }
- _interrupt void epwm3_ISR (void)
- {
- // 清除 此计时器的 INT 标志
- //
- EPwm3Regs.ETCLR.bit.INT = 1;
- //
- // 确认 此 中断 以 接收 来自 组 3的更多中断
- //
- PieCtrlRegs.PIEACX.ALL = PIEACK_Group3;
- if ( IntCount < 100)
- {
- IntCount++;
- }
- 其他
- IntCount = 0;
- }
- //
- // InitEPwm1Example-Initialize EPWM1 配置
- //
- 空 InitEPwm1Examples()
- {
- //
- // 设置 TBCLK
- //
- EPwm1Regs.TBPRD = EPWM1_TIMER_TBPRD; // 设置 计时 器周期 801 TBCLK
- EPwm1Regs.TBPHS.bit.TBPHS = 0x0000; // 相 位为 0
- EPwm1Regs.TBCTR = 0x0000; // 清除 计数器
- //
- // 设置 比较 值
- //
- EPwm1Regs.CMPA.bit.CMPA = SineTable[IntCount]; // 设置 比较 A 值
- EPwm1Regs.CMPB.BIT.CMPB = SineTable[IntCount]; // 设置 比较 B 值
- //
- // 设置 计数 器模式
- //
- EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // 向上和 向下计数
- EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // 禁用 相 位加载
- EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // 时钟 与 SYSCLKOUT 的比率
- EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;
- //
- // 设置 操作
- //
- EPwm1Regs.AQCTLA.bit.CAU = AQ_SET; // 在 事件 A 上设置 PWM1A、递增
- // 计数
- EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR; // 在事件 A 上清除 PWM1A、
- // 倒计数
- EPwm1Regs.AQCTLB.bit.CBU = AQ_SET; // 在 事件 B 上设置 PWM1B、向上
- // 计数
- EPwm1Regs.AQCTLB.bit.CBD = AQ_CLEAR; // 在事件 B 上清除 PWM1B、
- // 倒计数
- //
- // 中断 ,我们将 在其中更改 比较 值
- //
- EPwm1Regs.ETSEL.bit.INTSEL = 4; // 在 TBCTR 上选择 INT = CMPA 递增计数
- EPwm1Regs.ETSEL.bit.INTEN = 1; // 启用 INT
- EPwm1Regs.ETPS.bit.INTPRD = 1; // 在发生第3 个事件时生成 INT
- }
- 空 InitEPwm2Examples()
- {
- //
- // 设置 TBCLK
- //
- EPwm2Regs.TBPRD = EPWM2_TIMER_TBPRD; // 设置 计时 器周期 801 TBCLK
- EPwm2Regs.TBPHS.bit.TBPHS = 0x0000; // 相 位为 0
- EPwm2Regs.TBCTR = 0x0000; // 清除 计数器
- //
- // 设置 比较 值
- //
- EPwm2Regs.CMPA.bit.CMPA = SineTable[IntCount]; // 设置 比较 A 值
- EPwm2Regs.CMPB.BIT.CMPB = SineTable[IntCount]; // 设置 比较 B 值
- //
- // 设置 计数 器模式
- //
- EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // 向上和 向下计数
- EPwm2Regs.TBCTL.bit.PHSEN = TB_DISABLE; // 禁用 相 位加载
- EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // 时钟 与 SYSCLKOUT 的比率
- EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1;
- //
- // 设置 操作
- //
- EPwm2Regs.AQCTLA.bit.CAU = AQ_SET; // 在 事件 A 上设置 PWM1A、递增
- // 计数
- EPwm2Regs.AQCTLA.bit.CAD = AQ_CLEAR; // 在事件 A 上清除 PWM1A、
- // 倒计数
- EPwm2Regs.AQCTLB.bit.CBU = AQ_SET; // 在 事件 B 上设置 PWM1B、向上
- // 计数
- EPwm2Regs.AQCTLB.bit.CBD = AQ_CLEAR; // 在事件 B 上清除 PWM1B、
- // 倒计数
- //
- // 中断 ,我们将 在其中更改 比较 值
- //
- EPwm2Regs.ETSEL.bit.INTSEL = 4; // 在 TBCTR 上选择 INT = CMPA 递增计数
- EPwm2Regs.ETSEL.bit.INTEN = 1; // 启用 INT
- EPwm2Regs.ETPS.bit.INTPRD = 1; // 在发生第3 个事件时生成 INT
- }
- 空 InitEPwm3Examples()
- {
- //
- // 设置 TBCLK
- //
- EPwm3Regs.TBPRD = EPWM3_TIMER_TBPRD; // 设置 计时 器周期 801 TBCLK
- EPwm3Regs.TBPHS.bit.TBPHS = 0x0000; // 相 位为 0
- EPwm3Regs.TBCTR = 0x0000; // 清除 计数器
- //
- // 设置 比较 值
- //
- EPwm3Regs.CMPA.bit.CMPA = SineTable[IntCount]; // 设置 比较 A 值
- EPwm3Regs.CMPB.BIT.CMPB = SineTable[IntCount]; // 设置 比较 B 值
- //
- // 设置 计数 器模式
- //
- EPwm3Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // 向上和 向下计数
- EPwm3Regs.TBCTL.bit.PHSEN = TB_DISABLE; // 禁用 相 位加载
- EPwm3Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // 时钟 与 SYSCLKOUT 的比率
- EPwm3Regs.TBCTL.bit.CLKDIV = TB_DIV1;
- //
- // 设置 操作
- //
- EPwm3Regs.AQCTLA.bit.CAU = AQ_SET; // 在 事件 A 上设置 PWM1A、递增
- // 计数
- EPwm3Regs.AQCTLA.bit.CAD = AQ_CLEAR; // 在事件 A 上清除 PWM1A、
- // 倒计数
- EPwm3Regs.AQCTLB.bit.CBU = AQ_SET; // 在 事件 B 上设置 PWM1B、向上
- // 计数
- EPwm3Regs.AQCTLB.bit.CBD = AQ_CLEAR; // 在事件 B 上清除 PWM1B、
- // 倒计数
- //
- // 中断 ,我们将 在其中更改 比较 值
- //
- EPwm3Regs.ETSEL.bit.INTSEL = 4; // 在 TBCTR 上选择 INT = CMPA 递增计数
- EPwm3Regs.ETSEL.bit.INTEN = 1; // 启用 INT
- EPwm3Regs.ETPS.bit.INTPRD = 1; // 在发生第3 个事件时生成 INT
- }
- void GPIO_setup (void)
- {
- EALLOW;
- GpioCtrlRegs.GPBMUX2.bit.GPIO63 = 0;/GPIO
- GpioCtrlRegs.GPBDIR.bit.GPIO63 = 1; //输出
- EDIS;
- }