关于dsp28335移相全桥易于理解的程序

此程序是ADC.h函数中

在interrupt void  adc_isr(void) 函数中做数据处理:

/*
 * ADC.c
 *
 *  Created on: 2017年8月5日
 *      Author: chris
 */

#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h"   // DSP2833x Examples Include File
#include "ADC.h"

#define ADC_CKPS   0x0
#define BUF_SIZE   10  // Sample buffer size
Uint16 LoopCount=0;
Uint16 ADC_ConvertedValue[BUF_SIZE][2];
//float FBPS_Vget=0;  //fbps电压获取
//float FBPS_Iget=0;  //fbps电流获取
Uint16 ConversionCount=0;
Uint16 Voltage1[10];


void ADC_init(void)
{
		EALLOW;
		#if (CPU_FRQ_150MHZ)     // Default - 150 MHz SYSCLKOUT
		#define ADC_MODCLK 0x3 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 150/(2*3)   = 25.0 MHz
		#endif
		EDIS;

		EALLOW;
		SysCtrlRegs.HISPCP.all = ADC_MODCLK;
		EDIS;

		EALLOW;  // This is needed to write to EALLOW protected register
		PieVectTable.ADCINT = &adc_isr;
		EDIS;    // This is needed to disable write to EALLOW protected registers

		PieCtrlRegs.PIEIER1.bit.INTx6 = 1;
//		IER |= M_INT1; // Enable CPU Interrupt 1

		InitAdc();  // For this example, init the ADC

		// Configure ADC
		AdcRegs.ADCMAXCONV.all = 0x0003;       // Setup 2 conv's on SEQ1
		AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0; // Setup ADCINA3 as 1st SEQ1 conv.
		AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x2; // Setup ADCINA2 as 2nd SEQ1 conv.
		AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x4; // Setup ADCINA3 as 1st SEQ1 conv.
		AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 0x6; // Setup ADCINA2 as 2nd SEQ1 conv.

		AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1 = 1;// Enable SOCA from ePWM to start SEQ1
		AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1;  // Enable SEQ1 interrupt (every EOS)

		// Assumes ePWM1 clock is already enabled in InitSysCtrl();
		EPwm1Regs.ETSEL.bit.SOCAEN = 1;        // Enable SOC on A group
		EPwm1Regs.ETSEL.bit.SOCASEL = 4;       // Select SOC from from CPMA on upcount
		EPwm1Regs.ETPS.bit.SOCAPRD = 1;        // Generate pulse on 1st event
		EPwm1Regs.CMPA.half.CMPA = 0x0080;	  // Set compare A value
		EPwm1Regs.TBPRD = 0xFFFF;              // Set period for ePWM1
		EPwm1Regs.TBCTL.bit.CTRMODE = 0;		  // count up and start

}

interrupt void  adc_isr(void)
{
	 static    Uint16 array_ele1=0,array_ele2=0;
	//Voltage1[ConversionCount] = AdcRegs.ADCRESULT0;
	//Voltage2[ConversionCount] = AdcRegs.ADCRESULT1;
	ADC_ConvertedValue[array_ele1++][0]=( (AdcRegs.ADCRESULT0)>>4);  //电压采集
    ADC_ConvertedValue[array_ele2++][1]=( (AdcRegs.ADCRESULT1)>>4);   //电流采集
//
   if(array_ele1>(BUF_SIZE-1))
        array_ele1=0;
    if(array_ele2>(BUF_SIZE-1))
        array_ele2=0;


	//FBPS_Vget = Voltage1[ConversionCount]*3.3/65536;   //电压
//	FBPS_Iget = Voltage2[ConversionCount]*3.3/65536;   //电流




  // Reinitialize for next ADC sequence
  AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;         // Reset SEQ1
  AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;       // Clear INT SEQ1 bit
  PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;   // Acknowledge interrupt to PIE

  return;
}
/**************************中值滤波*****************************/
#define N_MID 10
float filter_mid(int k)
{
   int i,j;
   float temp,adc=0.0;
   for (j=0;j<N_MID-1;j++)
       {
           for (i=0;i<N_MID-1-j;i++)
           {
                 if ( ADC_ConvertedValue[i][k]>ADC_ConvertedValue[i][k] )
                 {
                      temp = ADC_ConvertedValue[i][k];
                      ADC_ConvertedValue[i][k]= ADC_ConvertedValue[i][k];
                      ADC_ConvertedValue[i][k] = temp;
                 }
           }
       }
    adc=ADC_ConvertedValue[(N_MID-1)/2][k]/4095.0*3.3;
    return adc;
}

在定时器函数中:

在__interrupt void cpu_timer0_isr(void)定时器中断函数中实现双闭环

/*
 * Time.c
 *
 *  Created on: 2017年10月19日
 *      Author: Sun zhaohu
 */

#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h"   // DSP2833x Examples Include File
//#include "Time.h"
#include "include.h"

/**************************************************/
fbps  FBPS = {0,0,0,0,0,0,1.826,0,0,0,0};
float filter_mid(int k);

/************************************************/

void Time_init(void)
{
	   EALLOW;  // This is needed to write to EALLOW protected registers
	 PieVectTable.TINT0 = &cpu_timer0_isr;
	  // PieVectTable.XINT13 = &cpu_timer1_isr;
	  // PieVectTable.TINT2 = &cpu_timer2_isr;
	   EDIS;    // This is needed to disable write to EALLOW protected registers

	   InitCpuTimers();   // For this example, only initialize the Cpu Timers

	   ConfigCpuTimer(&CpuTimer0, 150, 100);
//	   ConfigCpuTimer(&CpuTimer1, 150, 1000000);
//	   ConfigCpuTimer(&CpuTimer2, 150, 1000000);

	   CpuTimer0Regs.TCR.all = 0x4000; // Use write-only instruction to set TSS bit = 0
//	   CpuTimer1Regs.TCR.all = 0x4000; // Use write-only instruction to set TSS bit = 0
//	   CpuTimer2Regs.TCR.all = 0x4000; // Use write-only instruction to set TSS bit = 0

//	   IER |= M_INT1;
//	   IER |= M_INT13;
//	   IER |= M_INT14;

	   // Enable TINT0 in the PIE: Group 1 interrupt 7
	    PieCtrlRegs.PIEIER1.bit.INTx7 = 1;

}

__interrupt void cpu_timer0_isr(void)
{

	//static float FBPS_pid_V=0,FBPS_pid_I=0;
   // Acknowledge this interrupt to receive more interrupts from group 1
   //  PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
	FBPS.Vcount++;
	if( FBPS.Vcount>= 3000)    //软起动开始结电容充电adc采集存值
	    FBPS.Flag = 1;

     if(FBPS.Flag == 1)
     {
     	 FBPS.Vget =  filter_mid(0);    //中值滤波得电压
         FBPS.Iget =  filter_mid(1);    //中值滤波得电流

         FBPS.ivlue = FBPS.Iget*0.4816 - 0.0373;   //电流线性关系

         if( FBPS.ivlue>=0.94)
             FBPS.Vset = 1.83;
         else if( FBPS.ivlue<0.94&&FBPS.ivlue>0.65)
	         FBPS.Vset = 1.832;    //采集输出电压    电压1.83/36.2
         else
             FBPS.Vset =  FBPS.changeset;


	    FBPS.PIDvout = PID_V(FBPS.Vset,FBPS.Vget);   //输出电压设定为36v 1.83对应36v   电压环

       //FBPS.PIDvout = fuzzy_pid( FBPS.Vset,FBPS.Vget);   //输出电压设定为36v 1.83对应36v   电压环

        FBPS.PIDiout = PID_I(FBPS.PIDvout,FBPS.ivlue);      //电流环  可以不加没用

/****************************显示使用************************************/

        FBPS.radio = FBPS.ivlue*FBPS.Vget*19.72/24/1.47*100;
        FBPS.angle = FBPS.PIDiout/3000*360;

/*****************************************************************/

        EPwm1Regs.TBPHS.half.TBPHS = FBPS.PIDiout;   //改变移相角大小
	    EPwm1Regs.TBCTL.bit.SWFSYNC = 1;
	 }

		 PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;

}

 

 

  • 19
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 20
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Aaron-Suen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值