simulink仿真adc采样和epwm输出基础知识讲解

F28027

simulink仿真adc采样和epwm输出基础知识讲解_第1张图片
12位ADC
simulink仿真adc采样和epwm输出基础知识讲解_第2张图片
simulink仿真adc采样和epwm输出基础知识讲解_第3张图片
simulink仿真adc采样和epwm输出基础知识讲解_第4张图片
simulink仿真adc采样和epwm输出基础知识讲解_第5张图片
simulink仿真adc采样和epwm输出基础知识讲解_第6张图片
simulink仿真adc采样和epwm输出基础知识讲解_第7张图片
simulink仿真adc采样和epwm输出基础知识讲解_第8张图片
simulink仿真adc采样和epwm输出基础知识讲解_第9张图片
在这里插入图片描述
simulink仿真adc采样和epwm输出基础知识讲解_第10张图片

simulink仿真adc采样和epwm输出基础知识讲解_第11张图片
simulink仿真adc采样和epwm输出基础知识讲解_第12张图片
simulink仿真adc采样和epwm输出基础知识讲解_第13张图片
simulink仿真adc采样和epwm输出基础知识讲解_第14张图片
2的y次方,tbclk 计数时钟的频率
simulink仿真adc采样和epwm输出基础知识讲解_第15张图片
tprd 一个周期内记得个数 ÷ 1/tbclk 每次计一个数的时间 =一个pwm周期的时间
pwm的周期
simulink仿真adc采样和epwm输出基础知识讲解_第16张图片
时基计数器 CRT---------计数时钟由系统时钟分频来的,
比较寄存器 CMR-------------决定占空比
周期寄存器 PRD
载波+基准波
载波-------是指寄存器工作模式 up down up-down
计数:
simulink仿真adc采样和epwm输出基础知识讲解_第17张图片
simulink仿真adc采样和epwm输出基础知识讲解_第18张图片
simulink仿真adc采样和epwm输出基础知识讲解_第19张图片

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;
}

你可能感兴趣的:(simulink代码自动生成)