F28027
12位ADC
2的y次方,tbclk 计数时钟的频率 tprd 一个周期内记得个数 ÷ 1/tbclk 每次计一个数的时间 =一个pwm周期的时间 pwm的周期 时基计数器 CRT---------计数时钟由系统时钟分频来的, 比较寄存器 CMR-------------决定占空比 周期寄存器 PRD 载波+基准波 载波-------是指寄存器工作模式 up down up-down 计数:
epwm实现spwm输出
F2802X 的EPWM 模块内部由8 个小模块组成,这8 个模块可以相互配合, 产生符合要求的PWM波形。其实,但是只需要利用TB(Time—base)、 CC(Counter-compare)、AQ(Action-qualifier) 这三个子模块就能产生实验所需要的PWM 波形。 先给初学者回顾一下SPWM:所谓SPWM,就是在PWM 的基础上改变了调制脉冲方式, 脉冲占空比在时间轴上按正弦规率排列,这样输出波形经过适当的滤波可以做到正弦波输出。 它广泛用于直流交流逆变器、电机细分等。具体实现方法为, 用软件计算出按正弦规律变换的值, 比如计算出64 个点的值,定时向CMPA 发送计算出来的变化值, 发送完64 次后,完成了一个周期的正弦波输出,定时发送的时间由TBPRD 决定 。那计算出来的正弦波周期为TBPRD*64。 #include "DSP28x_Project.h" #define PWM1_INT_ENABLE 1 /**Description ** 全局变量定义*/ volatile Uint16 temp; int16 *sin_ptr = (int16 *)0x3fe001;// //解释"int16 *sin_ptr = (int16 *)0x3fe001;"在 F2802X 的ROM 区域中,包含有产生正弦波和余弦波各512 点的数据表,存储空间 0X3FE000 开始,具体的存储空间可以参考它的数据手册。 /*Description ** 函数定义*/ void InitEPwmTimer(void); // EPWM模块初始化程序 void update_compare(void); // 比较值定义 interrupt void epwm1_timer_isr(void); // 中断服务程序 void main(void) { InitSysCtrl(); // 系统初始化函数 InitEPwm1Gpio(); // EPWM端口初始化 DINT; // 关闭CPU中断 InitPieCtrl(); // PIE中断控制 IER = 0x0000; // 关闭中断使能 IFR = 0x0000; // 清除中断标志位 InitPieVectTable(); EALLOW; PieVectTable.EPWM1_INT = &epwm1_timer_isr;//中断函数入口 EDIS; // 赋值中断函数地址 InitEPwmTimer(); // 初始化EPWM模块 IER |= M_INT3; // 使能CPU级第三组中断 PieCtrlRegs.PIEIER3.bit.INTx1 = PWM1_INT_ENABLE; // 使能PIE3.1 EINT; // 使能全局中断 ERTM; // for(;;) { asm(" NOP"); } } /*EPWM模块初始化函数*/ void InitEPwmTimer() { EALLOW; SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0; // 停止TB计数 EDIS; EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN; EPwm1Regs.TBCTR = 0x0000; // 清除TB计数器 EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // 系统时钟分频 EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1; EPwm1Regs.TBCTL.bit.PHSEN = 0; EPwm1Regs.TBPHS.half.TBPHS = 0; EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW; EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; EPwm1Regs.CMPA.half.CMPA = 0; // EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET; // EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; // EPwm1Regs.TBPRD = 512; EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // 增计数模式 EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO; // 中断使能选择 EPwm1Regs.ETSEL.bit.INTEN = PWM1_INT_ENABLE; // 使能中断 EPwm1Regs.ETPS.bit.INTPRD = ET_1ST; // EALLOW; SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1; // TB时钟计数 EDIS; } /*sina值更新函数*/ //主要更新CPMA的值 void update_compare() { temp = (((Uint16)((*sin_ptr)+16384))>>6); EPwm1Regs.CMPA.half.CMPA = temp; if(temp > 1024) { asm(" ESTOP0"); } sin_ptr += 8; if(sin_ptr >= (int16 *)0x3fe401) { sin_ptr = (int16 *)0x3fe001; } } /*epwm1中断服务程序*/ //c2000的中断函数都要用“inerrupt”申明 interrupt void epwm1_timer_isr(void) { update_compare(); EPwm1Regs.ETCLR.bit.INT = 1; PieCtrlRegs.PIEACK.all = PIEACK_GROUP3; }