📄 pwmcalc.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 + -