⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pwmcalc.c

📁 U15873EE1V0AN00 aplication note
💻 C
字号:
/*******************************************************************
 *	File: pwmcalc.c
 *
 *	DESCRIPTION:	AC Induction Motor control demonstration
 *                (using constant V/F principle)
 *
 *   PWMCalc() produces the PWM timer values modulated 
 *   by a sine look-up-table. Only one quadrant of a full sine wave 
 *   is contained in the table. The code uses the symmetry of a 
 *   sine wave to calculate the remaining 3 quadrants. 
 *   Three timers values are calculated with an effective displacement
 *   of 120deg between each value to produce a 3 phase waveform.
 *
 *	 AUTHOR:	S.Redpath 
 *
 *  HISTORY:   Original	30th August 2001
 *				V1.1    31st October 2001
 *						Changed Debug port from 2 to 4
 *
 *******************************************************************/
 

/** include files **/
#include <stdlib.h>

#include "tools.h"

#ifdef IAR
#include <intrv850.h>
#include <io_v850e_df3116.h>
#else
#include "df3116.h"
#endif


#include "acind.h"



/* Global Variables (External) */
extern UINT8 amplitude;	/* 0 to BFCMDATA/2 gives 0 to 100% modulation*/
extern UINT8 waveQuad[POINTS_IN_ONE_QUADRANT];
extern UINT8 tableInc;		/* increment value for wave pointer update*/	

/* Local Variables*/
unsigned char Table_value;		/* Value read from wave table */
unsigned int Wave_ptr_a = 0;	/* wave pointer for phase A */	
unsigned int Wave_ptr_b = 684;		/* wave pointer for phase B */
unsigned int Wave_ptr_c = 341;          /*wave pointer for phase C*/
unsigned int Quad_ptr;			/* quadrant pointer for all phases*/
unsigned int Pwmmod_wave;		/* wave modulus */

	  

void PWMcalc (void)
  {			
  

   /* PHASE A */	

   /* wrap pointer back to start of 1st qaudrant when 4th quad complete*/
	Wave_ptr_a &= 0x03ff;	

	if (Wave_ptr_a < 0x100)		/* QUADRANT 1 */
	{
	  
	  
	  Quad_ptr = Wave_ptr_a;					/* quadrant pointer*/
	  /* fetch value from table */
     Table_value = ((CM3_DATA * waveQuad[Quad_ptr])/ (2 * waveQuad[POINTS_IN_ONE_QUADRANT-1]));
     Pwmmod_wave = ((Table_value * amplitude)/waveQuad[POINTS_IN_ONE_QUADRANT-1]);	/* scale by amplitude */	
     
     #ifdef SINE_INVERT	
	  BFCM00 = (BFCM_DATA/2) - Pwmmod_wave;	/* update BFCM00 register for QUADRANT 1 */
	  
     #else    
          BFCM00 = Pwmmod_wave + (BFCM_DATA/2);	/* update BFCM00 register for QUADRANT 1 */
     #endif      										   	   

	}
	
     
		
	else if (Wave_ptr_a < 0x200)	/* QUADRANT 2 */
	{
	  Quad_ptr = (0x1FF - Wave_ptr_a);			/* quadrant pointer */
	  /* fetch value from table */
     Table_value = ((CM3_DATA * waveQuad[Quad_ptr])/ (2 * waveQuad[POINTS_IN_ONE_QUADRANT-1]));			
	  Pwmmod_wave = ((Table_value * amplitude)/waveQuad[POINTS_IN_ONE_QUADRANT-1]);	/* scale by amplitude */		
	  
     #ifdef SINE_INVERT	
	  BFCM00 = (BFCM_DATA/2) - Pwmmod_wave;	/* update BFCM00 register for QUADRANT 2 */
     #else    
          BFCM00 = Pwmmod_wave + (BFCM_DATA/2);	/* update BFCM00 register for QUADRANT 2 */
     #endif
     	}
		
	else if (Wave_ptr_a < 0x300)	/* QUADRANT 3 */
	{
	  Quad_ptr = (Wave_ptr_a-0x200);			/* quadrant pointer */
	  /* fetch value from table */
     Table_value = ((CM3_DATA * waveQuad[Quad_ptr])/ (2 * waveQuad[POINTS_IN_ONE_QUADRANT-1]));
	  Pwmmod_wave = ((Table_value * amplitude)/waveQuad[POINTS_IN_ONE_QUADRANT-1]);	/* scale by amplitude */		
	  
											
     #ifdef SINE_INVERT	
	  BFCM00 = Pwmmod_wave + (BFCM_DATA/2);	/* update BFCM00 register for QUADRANT 3 */
     #else    
          BFCM00 = (BFCM_DATA/2) - Pwmmod_wave; /* update BFCM00 register for QUADRANT 3 */
     #endif									       
	
          
	}
			
	else  	/* (Wave_ptr_a < 0x400)    QUADRANT 4 */			   
	{
	  Quad_ptr = (0x3ff - Wave_ptr_a);			/* quadrant pointer */
	  /* fetch value from table */
     Table_value = ((CM3_DATA * waveQuad[Quad_ptr])/ (2 * waveQuad[POINTS_IN_ONE_QUADRANT-1]));
	  Pwmmod_wave = ((Table_value * amplitude)/waveQuad[POINTS_IN_ONE_QUADRANT-1]);	/* scale by amplitude */
	  		
     #ifdef SINE_INVERT	
	  BFCM00 = Pwmmod_wave + (BFCM_DATA/2);	/* update BFCM00 register for QUADRANT 4 */
     #else    
          BFCM00 = (BFCM_DATA/2) - Pwmmod_wave; /* update BFCM00 register for QUADRANT 4 */
     #endif	
	}

    #ifdef DEBUG
    if (BFCM00 == 250)
      P4BIT1 ^= 1;  /*toggle ouput DEBUG*/
    #endif
	

   /* PHASE B */	

	if (Wave_ptr_b > 0x400)   /*if we go past end of 4th quadrant*/
	  Wave_ptr_b &= 0x3ff;      /*reset to first quadrant*/
	  

	if (Wave_ptr_b < 0x100)		/* QUADRANT 1 */
	{
	  Quad_ptr = Wave_ptr_b;					/* quadrant pointer */
	  /* fetch value from table */
     Table_value = ((CM3_DATA * waveQuad[Quad_ptr])/ (2 * waveQuad[POINTS_IN_ONE_QUADRANT-1]));			
	  Pwmmod_wave = ((Table_value * amplitude)/waveQuad[POINTS_IN_ONE_QUADRANT-1]);	/* scale by amplitude */		
	  #ifdef SINE_INVERT	
	  BFCM01 = (BFCM_DATA/2) - Pwmmod_wave;	/* update BFCM01 register for QUADRANT 1 */
     #else    
          BFCM01 = Pwmmod_wave + (BFCM_DATA/2);	/* update BFCM01 register for QUADRANT 1 */
     #endif 
	}
		
	else if (Wave_ptr_b < 0x200)	/* QUADRANT 2 */
	{
	  Quad_ptr = (0x1ff - Wave_ptr_b);		/* quadrant pointer */
	  /* fetch value from table */
     Table_value = ((CM3_DATA * waveQuad[Quad_ptr])/ (2 * waveQuad[POINTS_IN_ONE_QUADRANT-1]));			
	  Pwmmod_wave = ((Table_value * amplitude)/waveQuad[POINTS_IN_ONE_QUADRANT-1]);	/* scale by amplitude */		
	  #ifdef SINE_INVERT	
	  BFCM01 = (BFCM_DATA/2) - Pwmmod_wave;	/* update BFCM01 register for QUADRANT 2 */
     #else    
          BFCM01 = Pwmmod_wave + (BFCM_DATA/2);	/* update BFCM01 register for QUADRANT 2 */
     #endif 
	}
		
	else if (Wave_ptr_b < 0x300)	/* QUADRANT 3 */
	{
	  Quad_ptr = (Wave_ptr_b - 0x200);		/* quadrant pointer */
	  /* fetch value from table */
     Table_value = ((CM3_DATA * waveQuad[Quad_ptr])/ (2 * waveQuad[POINTS_IN_ONE_QUADRANT-1]));
	  Pwmmod_wave = ((Table_value * amplitude)/waveQuad[POINTS_IN_ONE_QUADRANT-1]);	/* scale by amplitude */		
	  #ifdef SINE_INVERT	
	  BFCM01 = Pwmmod_wave + (BFCM_DATA/2);	/* update BFCM01 register for QUADRANT 3 */
     #else    
          BFCM01 = (BFCM_DATA/2) - Pwmmod_wave; /* update BFCM01 register for QUADRANT 3 */
     #endif
	}
			
	else  	/* (Wave_ptr_b < 0x3ff)    QUADRANT 4 */			   
	{
	  Quad_ptr = (0x3ff - Wave_ptr_b);		/* quadrant pointer */
	  /* fetch value from table */
     Table_value = ((CM3_DATA * waveQuad[Quad_ptr])/ (2 * waveQuad[POINTS_IN_ONE_QUADRANT-1]));
	  Pwmmod_wave = ((Table_value * amplitude)/waveQuad[POINTS_IN_ONE_QUADRANT-1]);	/* scale by amplitude */		
	  #ifdef SINE_INVERT	
	  BFCM01 = Pwmmod_wave + (BFCM_DATA/2);	/* update BFCM01 register for QUADRANT 4 */
     #else    
          BFCM01 = (BFCM_DATA/2) - Pwmmod_wave; /* update BFCM01 register for QUADRANT 4 */
     #endif
	}
									
   /* PHASE C */	

	if (Wave_ptr_c > 0x400)   /*if we go past end of 4th quadrant*/
	  Wave_ptr_c &= 0x3ff;      /*reset to first quadrant*/

	if (Wave_ptr_c < 0x100)		/* QUADRANT 1 */
	{
	  Quad_ptr = Wave_ptr_c;					/* quadrant pointer */
	  /* fetch value from table */
     Table_value = ((CM3_DATA * waveQuad[Quad_ptr])/ (2 * waveQuad[POINTS_IN_ONE_QUADRANT-1]));			
	  Pwmmod_wave = ((Table_value * amplitude)/waveQuad[POINTS_IN_ONE_QUADRANT-1]);	/* scale by amplitude */		
	  #ifdef SINE_INVERT	
	  BFCM02 = (BFCM_DATA/2) - Pwmmod_wave;	/* update BFCM02 register for QUADRANT 1 */
     #else    
          BFCM02 = Pwmmod_wave + (BFCM_DATA/2);	/* update BFCM02 register for QUADRANT 1 */
     #endif 
       }
		
	else if (Wave_ptr_c < 0x200)	/* QUADRANT 2 */
	{
	  Quad_ptr = (0x1ff - Wave_ptr_c);		/* quadrant pointer */
	  /* fetch value from table */
     Table_value = ((CM3_DATA * waveQuad[Quad_ptr])/ (2 * waveQuad[POINTS_IN_ONE_QUADRANT-1]));			
	  Pwmmod_wave = ((Table_value * amplitude)/waveQuad[POINTS_IN_ONE_QUADRANT-1]);	/* scale by amplitude */		
	  #ifdef SINE_INVERT	
	  BFCM02 = (BFCM_DATA/2) - Pwmmod_wave;	/* update BFCM02 register for QUADRANT 2 */
     #else    
          BFCM02 = Pwmmod_wave + (BFCM_DATA/2);	/* update BFCM02 register for QUADRANT 2 */
     #endif 
      }
		
	else if (Wave_ptr_c < 0x300)	/* QUADRANT 3 */
	{
	  Quad_ptr = (Wave_ptr_c - 0x200);		/* quadrant pointer */
	  /* fetch value from table */
     Table_value = ((CM3_DATA * waveQuad[Quad_ptr])/ (2 * waveQuad[POINTS_IN_ONE_QUADRANT-1]));
	  Pwmmod_wave = ((Table_value * amplitude)/waveQuad[POINTS_IN_ONE_QUADRANT-1]);	/* scale by amplitude */		
	  #ifdef SINE_INVERT	
	  BFCM02 = Pwmmod_wave + (BFCM_DATA/2);	/* update BFCM02 register for QUADRANT 3 */
     #else    
          BFCM02 = (BFCM_DATA/2) - Pwmmod_wave; /* update BFCM02 register for QUADRANT 3 */
     #endif
	}
			
	else  	/* (Wave_ptr_c < 0x3ff)    QUADRANT 4 */			   
	{
	  Quad_ptr = (0x3ff - Wave_ptr_c);		/* quadrant pointer */
	  /* fetch value from table */
     Table_value = ((CM3_DATA * waveQuad[Quad_ptr])/ (2 * waveQuad[POINTS_IN_ONE_QUADRANT-1]));
	  Pwmmod_wave = ((Table_value * amplitude)/waveQuad[POINTS_IN_ONE_QUADRANT-1]);	/* scale by amplitude */		
	  #ifdef SINE_INVERT	
	  BFCM02 = Pwmmod_wave + (BFCM_DATA/2);	/* update BFCM02 register for QUADRANT 4 */
     #else    
          BFCM02 = (BFCM_DATA/2) - Pwmmod_wave; /* update BFCM02 register for QUADRANT 4 */
     #endif
 	}
										
	
	Wave_ptr_a += tableInc;		/* load new wave pointer for phase A */
	Wave_ptr_b += tableInc;		/* load new wave pointer for phase B */
	Wave_ptr_c += tableInc;		/* load new wave pointer for phase C */
	
   
					
				
	}
		
		
/*end of file*/


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -