📄 acim.c
字号:
/**********************************************************************
* *
* Software License Agreement *
* *
* The software supplied herewith by Microchip Technology *
* Incorporated (the "Company") for its dsPIC controller *
* is intended and supplied to you, the Company's customer, *
* for use solely and exclusively on Microchip dsPIC *
* products. The software is owned by the Company and/or its *
* supplier, and is protected under applicable copyright laws. All *
* rights are reserved. Any use in violation of the foregoing *
* restrictions may subject the user to criminal sanctions under *
* applicable laws, as well as to civil liability for the breach of *
* the terms and conditions of this license. *
* *
* THIS SOFTWARE IS PROVIDED IN AN "AS IS" CONDITION. NO *
* WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, *
* BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND *
* FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE *
* COMPANY SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, *
* INCIDENTAL OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. *
* *
**********************************************************************/
/**********************************************************************
* *
* Author: John Theys/Dave Ross *
* *
* Filename: ACIM.c *
* Date: 11/03/05 *
* File Version: 4.00 *
* *
* Tools used: MPLAB GL -> 6.30.0.0 *
* Compiler -> 1.22.3.0 *
* Assembler -> 1.22.3.0 *
* Linker -> 1.22.3.0 *
* *
* Linker File: p30f6010.gld *
* *
* *
***********************************************************************
*10/31/03 2.00 Released Motor runs fine, still some loose ends
*
*12/19/03 2.01 Cleaned up structure, created UserParms.h for all
* user defines.
*
*02/12/04 3.00 -Removed unnecessary files from project.
-Changed iRPM to int to correct floating point calc
* problems.
* -CalcVel() and velocity control loop only execute
* after number of loop periods specified by
* iIrpPerCalc.
* -Added iDispLoopCount variable to schedule
* execution of display and button routines
* -trig.s file changed to use program space for
* storage of sine data.
* -Added DiagnosticsOutput() function that uses
* output compare channels to output control variable
* information.
* -Added TORQUE_MODE definition to bypass velocity
* control loop.
* -Turned off SATDW bit in curmodel.s file. The
* automatic saturation feature prevents slip
* angle calculation from wrapping properly.
*
* 11/03/05 4.00 -Added support to software for MPLAB tuning
* interface. This includes the snapshot code.
* Also modified code so that user parameters
* only get initialized at user startup.
*
************************************************************************
* Code Description
*
* This file demonstrates Vector Control of a 3 phase ACIM using the
* dsPIC30F. SVM is used as the modulation strategy.
**********************************************************************
* Extention for sensorless control:
* Author: Dr.-Ing. Hafedh Sammoud APPCON Technologies SUARL
*
* Linker File: p30f6010A.gld
* 12 Feb. 2007 -FOC Control is extendet to work sensorless: Speed estimation
* module is calculated in "estim.c".
* - Switching between sensored control and sensorless control
* by toggeling S7
* - Start up strategie and low speed limitation when sensorless
* control is selected
* - Offset compensation is disactivated for SL-Control
* - Display indicates wich mode is selected */
/************** GLOBAL DEFINITIONS ***********/
#define INITIALIZE
#include "Motor.h"
#include "Parms.h"
#include "Encoder.h"
#include "SVGen.h"
#include "ReadADC.h"
#include "MeasCurr.h"
#include "CurModel.h"
#include "FdWeak.h"
#include "Control.h"
#include "Controldef.h"
#include "PI.h"
#include "Park.h"
#include "ParkDef.h"
#include "OpenLoop.h"
#include "LCD.h"
#include "bin2dec.h"
#include "UserParms.h"
#include "Estim.h"
/*****************Config bit settings****************/
_FOSC(CSW_FSCM_OFF & XT_PLL16);
//_FOSC(CSW_FSCM_OFF & XT_PLL8);
//_FOSC(CSW_FSCM_OFF & XT_PLL4);
_FWDT(WDT_OFF);
_FBORPOR(PBOR_ON & BORV_20 & PWRT_64 & MCLR_EN);
/************** END OF GLOBAL DEFINITIONS ***********/
//#define TORQUE_MODE
//#define DIAGNOSTICS
//#define SNAPSHOT
#ifdef SNAPSHOT
#define SNAPSIZE 900
#define SNAP_DELAY SNAPSIZE/4
#define SNAP1 ParkParm.qIq
#define SNAP2 ParkParm.qId
#define SNAP3 EncoderParm.qVelMech
int SnapBuf1[SNAPSIZE];
int SnapBuf2[SNAPSIZE];
int SnapBuf3[SNAPSIZE];
int SnapCount;
#endif
unsigned short uWork;
short iCntsPerRev;
short iDeltaPos;
union {
struct
{
unsigned DoLoop :1;
unsigned BeginStop :1;
unsigned DoSnap :1;
unsigned SnapDone :1;
unsigned OpenLoop :1;
unsigned RunMotor :1;
unsigned RunningUpload :1;
unsigned Btn1Pressed :1;
unsigned Btn2Pressed :1;
unsigned Btn3Pressed :1;
unsigned Btn4Pressed :1;
unsigned UploadToMonitor:1;
unsigned ChangeMode :1;
unsigned ChangeSpeed :1;
unsigned Sensorless :1;
unsigned :1;
}bit;
WORD Word;
} uGF; // general flags
union {
long Long;
WORD Word[2];
short Short[2];
BYTE Byte[4];
} DataUnion;
tPIParm PIParmQ;
tPIParm PIParmQref;
tPIParm PIParmD;
tReadADCParm ReadADCParm;
int iRPM,iRPM_old;
WORD iMaxLoopCnt;
WORD iLoopCnt;
WORD iDispLoopCnt;
extern tEstimParm EstimParm;
extern tStartupParm StartupParm;
/******************************************************/
void __attribute__((__interrupt__)) _ADCInterrupt(void);
void SetupBoard( void );
bool SetupPeripherals(void);
void InitUserParms(void);
void DoControl( void );
void Dis_RPM( BYTE bChrPosC, BYTE bChrPosR );
void DiagnosticsOutput(void);
/************* START OF MAIN FUNCTION ***************/
int main ( void )
{
// InitEstimParmLeeson();
InitEstimParm0();
SetupPorts();
InitLCD();
InitUserParms();
while(1)
{
uGF.Word = 0; // clear flags
// init Mode
uGF.bit.OpenLoop = 1; // start in openloop
// init LEDs
pinLED1 = 0;
pinLED2 = !uGF.bit.OpenLoop;
pinLED3 = 0;
pinLED4 = 0;
pinLED_F_R=0;
// init board
SetupBoard();
// init user specified parms and stop on error
if( SetupPeripherals() )
{
// Error
uGF.bit.RunMotor=0;
return;
}
// zero out i sums
PIParmD.qdSum = 0;
PIParmQ.qdSum = 0;
PIParmQref.qdSum = 0;
iMaxLoopCnt = 0;
Wrt_S_LCD("Vector Control ", 0 , 0);
Wrt_S_LCD("S4-Run/Stop ", 0, 1);
// Enable ADC interrupt and begin main loop timing
IFS0bits.ADIF = 0;
IEC0bits.ADIE = 1;
if(!uGF.bit.RunMotor)
{
// Initialize current offset compensation
while(!pinButton1) //wait here until button 1 is pressed
{
ClrWdt();
// Start offset accumulation //and accumulate current offset while waiting
MeasCompCurr();
}
while(pinButton1); //when button 1 is released
uGF.bit.RunMotor = 1; //then start motor
}
// Run the motor
uGF.bit.ChangeMode = 1;
// Enable the driver IC on the motor control PCB
pinPWMOutputEnable_ = 0;
Wrt_S_LCD("RPM= ", 0, 0);
Wrt_S_LCD("(ENC)", 11, 0);
Wrt_S_LCD("S5-Cls. Lp S6-2x", 0, 1);
//Run Motor loop
while(1)
{
ClrWdt();
// Write vector control variables to output compare channels
// for observation on oscilloscope.
#ifdef DIAGNOSTICS
DiagnosticsOutput();
#endif
// The code that updates the LCD display and polls the buttons
// executes every 50 msec.
if(iDispLoopCnt >= dDispLoopCnt)
{
//Display RPM
Dis_RPM(5,0);
// Button 1 starts or stops the motor
if(pinButton1)
{
if( !uGF.bit.Btn1Pressed )
uGF.bit.Btn1Pressed = 1;
}
else
{
if( uGF.bit.Btn1Pressed )
{
// Button just released
uGF.bit.Btn1Pressed = 0;
// begin stop sequence
uGF.bit.RunMotor = 0;
pinPWMOutputEnable_ = 1;
break;
}
}
//while running button 2 will toggle open and closed loop
if(pinButton2)
{
if( !uGF.bit.Btn2Pressed )
uGF.bit.Btn2Pressed = 1;
}
else
{
if( uGF.bit.Btn2Pressed )
{
// Button just released
uGF.bit.Btn2Pressed = 0;
uGF.bit.ChangeMode = 1;
uGF.bit.OpenLoop = ! uGF.bit.OpenLoop;
pinLED2 = !uGF.bit.OpenLoop;
}
}
// Changes 19 dec 2006
//****************************
//while running button 4 will toggle sensored and sensorless control
if(pinButton4)
{
uGF.bit.Btn4Pressed = 1;
} else
{
if (uGF.bit.Btn4Pressed)
{
uGF.bit.Sensorless= uGF.bit.Sensorless ^ 1;
uGF.bit.Btn4Pressed = 0;
if(uGF.bit.Sensorless==1)
{
Wrt_S_LCD("(SL )", 11, 0);
} else
{
CurModelParm.qAngFlux=EstimParm.qRho;
Wrt_S_LCD("(ENC)", 11, 0);
}
}
}
/*********************************************************************/
//while running button 3 will double/half the speed or torque demand
if(pinButton3)
{
if( !uGF.bit.Btn3Pressed )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -