tag 标签: tms320cf2812

相关博文
  • 热度 20
    2012-10-1 20:15
    2690 次阅读|
    5 个评论
         Ø 空间向量PWM(SVPWM)是指一个三相功率变换器中六个功率三极管的一种功率开关电路,是变频技术的关键核心技术之一,应用非常广泛。三相交流电动机绕组产生的电流的谐波失真最小。它还提供了比正弦波调制方式更有效的供电电压的使用。目前SVPWM量控制方法是交流伺服电机和UPS电源应用最广泛的控制方法。本应用程序实例将为网友提供一个无刷直流马达SVPWM程序实例,希望起到抛砖引玉效应,可以充分了解如何使用事件管理器来实现SVPWM的应用方法。 实际量产产品应用对于 SVPWM 算法的推导、开关向量的选择也是是非常至关重要的关键。    Ø 无刷直流马达三相功率反相换流器原理结果图: 图中A1、B1、和C1是提供给电动机绕组的电压。六个功率三极管由DTPHx和我DTPHx_(x﹦a、b和c)控制。当上部的三极管导通时(DTPHx﹦1),下部的三极管关断(DTPHx﹦0)。这样通过上部三极管的开关状态(Q1和Q5)或者等效地说,DTPHx(x﹦a、b和c)的状态,就可以算出提供给电动机的电压Uout。    //文件名: DSP281xSVPwm.c // //DSP281x SVPWM波形产生程序,使用事件管理器A // //        该程序设置EVA定时器(TIMER1,TIMER2,TIMER13 and TIMER4) //        实现了SVPWM波形输出 #include 〝DSP281x_Device.h 〞            //DSP281x_Headerfile include file #include 〝DSP281x_examples.h 〞          //DSP281x_examples include file #include 〝stdio.h 〞 #include 〝math.h 〞 #include 〝float.h 〞 #define NX 404 #define PI 3.1415925 //全局变量 float M﹦0.8; int k0﹦0,h1﹦0; unsigned int n﹦0; float q,l,j; //在本例程中使用函数类型陈述 void zkb(); void int_eva(vold); interrupt void eva_T1UFINT_ISR(void); void main(void) { //系统初始化  initsysctrl(); //初始化GPAMUX   EALLOW;   // 使能PWM引脚   gpiomuxregs.GPAMUX.all ﹦0x00FF;    // EVA PWM 1-6 引脚   EDIS; //禁止全局CPU中断 DINT; //初始化PIE控制寄存器 initpiectrl(); //初始化PIE控制向量表 initpievecttable(); eallow;                                             //使能定时器1下益中断 pievecttable.T1UFINF﹦eva_T1UFINT_ISR; EDIS IER|﹦M_INT2;                                       //开中断2 pievctr1regs.PIEIER2.bit.INTx6﹦1;                  //开下益中断 while  (n﹦NX)   {     q﹦(n:+0.75)          //为消除偶次谐波,减少谐波角度出发,选择从A相3/4周期进行采样     q﹦q*2*PI;     q/﹦405;     j﹦sin(q);     1﹦1875*(1+M*j);     //M为调制比    if(1﹦3751﹦3375   //计算占空比表达式       a ﹦1;      else      {      if(1﹦3375);      a ﹦375;      }  n﹦n+1; } //初始化外设EVA init_eva(); //用户代码 Evaregs.T1CON.all﹦evaregs.T1CON.all|0x0040; //启动定时器1 for(;;) } vold init_eva() { ///初始化EVA evaregs.ACTRA.all﹦0x0666; evaregs.DBTCONA.all﹦0x0000;  //禁止死区 evaregs.COMCONA.all﹦0xa600; //使能比较操作 //EVAIMRA(EVA的中断屏蔽寄存器A).T1UIINT(通用定时器1的下溢中断使能) evaregs.EVAIFRA.all﹦0x0200; evaregs.EVAIFRA.all﹦0x0000; evaregs.EVAIFRA.all﹦0x0000; //EVAIMRA(EVA的中断屏蔽寄存器.T1UIINT(通用定时器1的下溢中断使能) evaregs.EVAIFRA.all﹦0xffff; evaregs.EVAIFRB.all﹦0xffff; evaregs.EVAIFRC.all﹦0xffff; evaregs.CMPR1﹦0; evaregs.CMPR2﹦0; evaregs.CMPR3﹦0;  evaregs.GPTCONA.all﹦0x0041; //周期必须大于最大的正弦表格值 evaregs.T1PR﹦3750;          //timer1 period PWM 载波周期为65536个定标的定时器时钟周期 evaregs.T1CNT﹦937;          //timer1计数器 evaregs.T1CON.all﹦0x0b4e;   //选择模式产生PWM波10 EINT; return; } interrupt void eva_T1UFINT_ISR(void)          //EVA下溢中断 {   int h2;   int flag;   flag﹦(evaregs.EVAIFRA.all)0x0200;     //T1UFINT中断标志位置1     if(flag!﹦0x0200)        {         EINT;         return;         }        else         {          if(k0﹦NK)         {          h1﹦k0+135;                      //B相标表达式          if(h1﹦404)h1﹦h1-404;          h2﹦k0+270;                      //C相标表达式          if(h2﹦404)h2﹦h2-404;          evaregs.CMPR1﹦a ;          evaregs.CMPR2﹦a ;          //更新比较寄存器2的值          evaregs.CMPR3﹦a ;          //更新比较寄存器3的值          k0﹦k0+1;          }         else          {         }         evaregs.EVAIMRA.bit,T1UFINT﹦1     //清除中断屏蔽标志         evaregs.EVAIMRA.bit,T1UFINT﹦1     //清除中断使能标志         piectrlregs.PIEACK.all﹦0x0002;    //响应同组中断         EINI;                               //开全局中断 } //﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦ //end //﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦﹦         更多精彩请点击下载附件【PWM波形空间向量图表】。。。
  • 热度 15
    2012-9-20 09:23
    5014 次阅读|
    0 个评论
                   TMS320CF2812 ADC模块具有16路12位流水线模数转换模块(ADC).TMS320CF2812 DSP内部就有ADC转换资源。包含前段模拟多路复用器(MUX)采样保持S/H电路、转换内核、稳压器以及其他模拟支持电路。 数字电路包含可编程序列发生器、结果寄存器、模拟电路接口、器件外围总线接口已经其他片上模块的接口。模数转换 (ADC)模块可以直接用于电机或运动控制场合。 软件:软件立即启动(使用SOC的SEQn位)。 EVA:事件管理器A(在EVA中有多个事件源)。 EVB:事件管理器B(在EVB中有多个事件源)。 排序器可工作在启动/停止模式,允许多个按时间排序的触发源使转换同步。 EVA和EVB可分别独立地触发SEQ1和SEQ2(仅用在双排序器模式)。 外部:(ADC SOC)引脚。 模拟输入:0V―3V           初始化TMS320CF2812 DSP的ADC模块,以及转换程序。并且对所有模拟输入通道进行转换,转换的结果可以在RESULTSn寄存器中获得。使用的用户可以访问该寄存器。ADC以16状态排序器来实现操作,一旦排序到达EOS(序列的结束)时,转换结束,ADC转换程序实现如下: // //文件   Example_281xAdcSOC.c // //DSP2812 ADC 应用程序 //本学习应用程序,中断是要被使能,并且EVA设置SEQ1为产生一个周期的ADC SOC信号。 // //变量: //Voltage1       最后的10次ADCRESULT0 值 //Voltage2       最后的10次ADCRESULT1 值 //conversioncount   当前的转换结果计数次数0-9   //loopcount         空闲循环计数器 #include 〝DSP281x_Device.h 〞        //DSP281x headerfile include file #include 〝DSP281x_examples.h 〞        //DSP281x examples include file //程序中函数类型声明 interrupt vold adc_isr(void); //本程序全局中变量: uint16 loopcount; uint16 conversioncount; uint16 voltagel1 ; uint16 voltagel2 ; main() { //第一步:初始化系统控制PLL,watchDog,使能外设时钟 //本程序中的初始化系统控制函数可以在DSP281x_sysctrl.c找到 initsysctrl(); //对于本程序,设置HSPCLK为SYSCLKOUT/6(假设SYSCLKOUT为150Mhz,HSPCLK为25Mhz) EALLOW; //第二步:初始化GPIO //该程序函数可以在DSP281x_piectrl.c文件中找到 initGpio();//本程序不需要这一步 //第三步清除所有中断,并初始化PIE向量表 //禁止CPU中断  DINT; //初始化PIE控制寄存器到默认状态,所有PIE中断的默认状态为禁止,并且标志位被清除 //该程序函数可以在DSP281x_piectrl.c文件中找到   initipiectrl(); //禁止CPU中断,清除所有CPU中断标志   IER ﹦ 0X0000;   IER ﹦ 0X0000; - //使用指向外部中断服务程序(ISR)的指针初始化PIE向量表 //这将对所有表单元进行操作,即使本程序不使用的中断。这对于调试是很有用的 //外部中断服务程序(ISR)可以在DSP281x_defaultisr.c文件中找到   initipiectrl(); //在本程序使用的中断被重新影射到文件中的ISR函数   EALLOW;                        //在写EALLOW保护寄存器,该语句是必须的   pievecttable.ADCINT = adc_isr;   EDIS;                          //当禁止写EALLOW保护寄存器,该语句是必须的 //第四步:初始化元件的外设 //下面的函数可以在DSP281x_initperipherals.c文件中找到 //initperipherals();            //本程序是不必需要的   initadc();                    //本程序是要初始化ADC //第五步:用户代码,使能中断 //使能PIE中的ADCINT   piectrlregs.PIEIER1.bit.INTx6 = 1;   IER ︳﹦M_INT1;               //使能CPU中断1   EINT;                         //使能全局中断INTM   ERTM;                         //使能全局实时中断DBGM Loopcount = 0; conversioncount = 0; //配置ADC   Adcregs.ADCMAXCONV.all = 0x0001;       // 在设置SEQ1设置2个转换   Adcregs.ADCCHSELSEQ1.bit.CONV00 = 0x3; // 设置ADCINA3作为第一次SEQ1转换   Adcregs.ADCCHSELSEQ1.bit.CONV01 = 0x2; // 设置ADCINA2作为第二次SEQ1转换   Adcregs.ADCTRL2.bit.EVA_SOC_SEQ1 = 1;  // 设置EVASOC,从而开始SEQ1   Adcregs.ADCTRL2.bit.INT_ENA_SEQ1 = 1;  // 设置SEQ1中断,(每一个EOS) //配置EVA //假如EVA时钟已经在initsysctrl()被使能   Evaregs.T1CMPR = 0x0080;                // 设置T1比较值      Evaregs.T1PR = 0xFFFF;                  // 设置周期寄存器   Evaregs.T1CON.all = 0x1042;             // 使能定时器1比较(向上计数模式) //等待ADC中断   while(1)   ﹛     loopcount++;    ﹜ ﹜ interrupt void adc_isr(void) ﹛   voltage1 = adcregs.ADCRSULT0 ﹥﹥4;   voltage2 = adcregs.ADCRSULT1 ﹥﹥4; //如果已经记录40次转换,则需要重新开始 if(conversioncount == 9) ﹛   conversioncount = 0; ﹜ else conversioncount++; //重新初始化下一个ADC序列 adcregs.ADCTRL2.bit.RST_SEQ1 = 0;        //复位SEQ1 adcregs.ADCST.bit.INT_SEQ1_CLR = 1;      //清除INT SEQ1 位 piectrlregs.PIEACK.all = PIEACK_GROUP1;   //应答PIE的中断 return; ﹜   请点击链接下载【TMS320CF2812 DSP_ADC内部方框图】