📄 sy bldc motor control v2.c
字号:
/*///////////////////////////////////////////////////
上海三意电机驱动技术有限公司
MCK2812LV 直流无刷马达驱动程序
SUPPORT2 Yangj编写 V1.1 2006.3.29
本程序在220V 3400转 5对级直流无刷电机调试下通过
////////////////////////////////////////////////////*/
#include "DSP281x_Device.h" // DSP281x Headerfile Include File
#include "DSP281x_Examples.h" // DSP281x Examples Include File
#define C_TIME 20
#define pwm_half_per 7500 /*3750 pwm=20khz*//*sytemclk=150MHz*/
/*1875 pwm=40kHz*/
#define pole 2 /*电机的级对数*/
#define timer2_per 60000//234375/* timer2 period with a 1/128 timer prescaler and 150MHz CPUCLK*/
#define PI 3.1415926
unsigned int adc_res;
unsigned int dir=1;
unsigned int ldd=0;
unsigned int PWM_DUTY=6800;
unsigned int I_result[2048];
unsigned int i=0;
unsigned int hall=0x000;
unsigned int time_cnt=C_TIME;
unsigned int hallspeed=0;
unsigned int prehall=0;
unsigned int speed;
unsigned int a=0,b=0,c=0,d=0;
unsigned int displaytime=0;
unsigned int displayflag=0;
// Prototype statements for functions found within this file.
void init_eva(void);
void eva_timer1_isr(void);
void eva_timer2_isr(void);
void DisplaySpeed(void);
//void init_evb(void);
// Global counts used in this example
void main(void)
{
// Step 1. Initialize System Control:
// PLL, WatchDog, enable Peripheral Clocks
// This example function is found in the DSP281x_SysCtrl.c file.
InitSysCtrl();
// Step 2. Initalize GPIO:
// This example function is found in the DSP281x_Gpio.c file and
// illustrates how to set the GPIO to it's default state.
// InitGpio(); // Skipped for this example
// Initialize only GPAMUX and GPBMUX for this test
EALLOW;
// Enable PWM pins
GpioMuxRegs.GPAMUX.all = 0x003F; // EVA PWM 1-6 pins
GpioMuxRegs.GPBMUX.all = 0x0000; // EVB PWM 7-12 pins
GpioMuxRegs.GPAQUAL.all=0x0000;
GpioMuxRegs.GPADIR.bit.GPIOA10=0;//cap3 as input
GpioMuxRegs.GPADIR.bit.GPIOA8=0;//cap1 as input
GpioMuxRegs.GPADIR.bit.GPIOA9=0;//cap2 as input
GpioMuxRegs.GPBDIR.bit.GPIOB12 =1;
EDIS;
// Step 3. Clear all interrupts and initialize PIE vector table:
// Disable CPU interrupts
DINT;
// Initialize PIE control registers to their default state.
// The default state is all PIE interrupts disabled and flags
// are cleared.
// This function is found in the DSP281x_PieCtrl.c file.
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
// Interrupts that are used in this example are re-mapped to
// ISR functions found within this file.
EALLOW; // This is needed to write to EALLOW protected registers
PieVectTable.T1PINT = &eva_timer1_isr;
PieVectTable.T2PINT = &eva_timer2_isr;
EDIS;
// Disable CPU interrupts and clear all CPU interrupt flags:
// Initialize the PIE vector table with pointers to the shell Interrupt
// Service Routines (ISR).
// This will populate the entire table, even if the interrupt
// is not used in this example. This is useful for debug purposes.
// The shell ISR routines are found in DSP281x_DefaultIsr.c.
// This function is found in DSP281x_PieVect.c.
InitPieVectTable();
EvaRegs.T1CON.all=0x0000;
EvaRegs.T2CON.all=0x0000;//disable time1 and timer2
// Step 4. Initialize all the Device Peripherals:
// This function is found in DSP281x_InitPeripherals.c
// InitPeripherals(); // Not required for this example
init_eva();
BC7281Init();
// init_evb();
// Step 5. User specific code, enable interrupts:
// Enable PIE group 2 interrupt 4 for T1PINT
PieCtrlRegs.PIEIER2.all = M_INT4;
// Enable PIE group 3 interrupt 1 for T2PINT
PieCtrlRegs.PIEIER3.all = M_INT1;
// Enable CPU INT2 for T1PINT, INT3 for T2PINT, INT4 for T3PINT
// and INT5 for T4PINT:
IER |= (M_INT2 | M_INT3);
// Enable global Interrupts and higher priority real-time debug events:
EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM
EvaRegs.EVAIMRA.bit.T1PINT = 1;
EvaRegs.EVAIFRA.bit.T1PINT = 1;
EvaRegs.EVAIMRB.bit.T2PINT = 1;
EvaRegs.EVAIFRB.bit.T2PINT = 1;
// Just sit and loop forever:
// PWM pins can be observed with a scope.
for(;;)
{
if (displayflag==1)
{
displayflag=0;
DisplaySpeed();
}
}
}
void init_eva()
{
// EVA Configure T1PWM, T2PWM, PWM1-PWM6
// Initalize the timers
EvaRegs.GPTCONA.bit.TCMPOE = 1;//0
EvaRegs.GPTCONA.bit.T1PIN = 1;//0
EvaRegs.GPTCONA.bit.T2PIN = 1;//0
// Initalize EVA Timer1
EvaRegs.T1PR = pwm_half_per; // Timer1 period
EvaRegs.T1CMPR = PWM_DUTY; // Timer1 compare
EvaRegs.T1CNT = 0x0000; // Timer1 counter
EvaRegs.DBTCONA.all=0x0000; //deadband units off
EvaRegs.ACTRA.all =0x0fff; //pwm pin set active high*/
// Enable compare for PWM1-PWM6
EvaRegs.CMPR1=PWM_DUTY;
EvaRegs.CMPR2=PWM_DUTY;
EvaRegs.CMPR3=PWM_DUTY;
EvaRegs.COMCONA.all = 0xA600;
EvaRegs.T1CON.all = 0x5042;//0x840
// Initalize EVA Timer2
EvaRegs.T2PR = timer2_per; // Timer2 period
//EvaRegs.T2CMPR = 0x3C00; // Timer2 compare
EvaRegs.T2CNT = 0x0000; // Timer2 counter
// TMODE = continuous up/down
// Timer enable
// Timer compare enable
EvaRegs.T2CON.all = 0xf40;
// Setup T1PWM and T2PWM
// Drive T1/T2 PWM by compare logic
// Compare action control. Action that takes place
// on a cmpare event
// output pin 1 CMPR1 - active high
// output pin 2 CMPR1 - active low
// output pin 3 CMPR2 - active high
// output pin 4 CMPR2 - active low
// output pin 5 CMPR3 - active high
// output pin 6 CMPR3 - active low
EvaRegs.DBTCONA.all = 0x1000; // Disable deadband
}
void eva_timer1_isr(void)
{
EvaRegs.EVAIMRA.bit.T1PINT = 1;
EvaRegs.EVAIFRA.all = BIT7;
hall=(++GpioDataRegs.GPADAT.bit.GPIOA10)<<1;
hall=((++GpioDataRegs.GPADAT.bit.GPIOA9)+hall)<<1;
hall=(++GpioDataRegs.GPADAT.bit.GPIOA8)+hall;
hall=hall<<3;
if (prehall!=hall)
{
prehall=hall;
hallspeed++;
}
switch(hall)
{
case 0x08:
{
if(dir==0)/*PWM1-PWM6 ANC*/
{EvaRegs.ACTRA.all =0x0606;//0x0c02
EvaRegs.CMPR3=pwm_half_per-10;
EvaRegs.CMPR1=PWM_DUTY;
EvaRegs.CMPR2=PWM_DUTY;}
else/*pwm5-pwm2*/
{
EvaRegs.ACTRA.all =0x0606; //0x020c
EvaRegs.CMPR3=PWM_DUTY;
EvaRegs.CMPR1=pwm_half_per-10;
EvaRegs.CMPR2=PWM_DUTY;
}
break;
}
case 0x18: /*PWM3-PWM6 BNC*/
{
if(dir==0)
{EvaRegs.ACTRA.all =0x0660;//0xc20
EvaRegs.CMPR3=pwm_half_per-10;
EvaRegs.CMPR1=PWM_DUTY;
EvaRegs.CMPR2=PWM_DUTY;}
else/*pwm5-pwm4*/
{
EvaRegs.ACTRA.all =0x0660;//0x02c0
EvaRegs.CMPR1=PWM_DUTY;
EvaRegs.CMPR2=pwm_half_per-10;
EvaRegs.CMPR3=PWM_DUTY;
}
break;
}
case 0x10: /*PWM3-PWM2 BNA*/
{
if(dir==0)
{EvaRegs.ACTRA.all =0x0066;//0x002c
EvaRegs.CMPR1=pwm_half_per-10;
EvaRegs.CMPR3=PWM_DUTY;
EvaRegs.CMPR2=PWM_DUTY;}
else
{EvaRegs.ACTRA.all =0x0066;//0x00c2/*pwm1-pwm4*/
EvaRegs.CMPR1=PWM_DUTY;
EvaRegs.CMPR3=PWM_DUTY;
EvaRegs.CMPR2=pwm_half_per-10;
}
break;
}
case 0x30: /*PWM5-PWM2 CNA*/
{
if(dir==0)
{EvaRegs.ACTRA.all =0x0606;//0x020c
EvaRegs.CMPR1=pwm_half_per-10;
EvaRegs.CMPR3=PWM_DUTY;
EvaRegs.CMPR2=PWM_DUTY;}
else
{EvaRegs.ACTRA.all =0x0606;//0x0c02/*pwm1-pwm6*/
EvaRegs.CMPR1=PWM_DUTY;
EvaRegs.CMPR3=pwm_half_per-10;
EvaRegs.CMPR2=PWM_DUTY;
}
break;
}
case 0x20: /*PWM5-PWM4 CNB*/
{
if(dir==0)
{
EvaRegs.ACTRA.all =0x0660;//0x02c0
EvaRegs.CMPR2=pwm_half_per-10;
EvaRegs.CMPR1=PWM_DUTY;
EvaRegs.CMPR3=PWM_DUTY;
}
else
{EvaRegs.ACTRA.all =0x0660;//0x0c20/*pwm3-pwm6*/
EvaRegs.CMPR2=PWM_DUTY;
EvaRegs.CMPR1=PWM_DUTY;
EvaRegs.CMPR3=pwm_half_per-10;
}
break;
}
case 0x28: /*PWM1-PWM4 ANB*/
{
if(dir==0)
{
EvaRegs.ACTRA.all =0x0066;//0x00c2
EvaRegs.CMPR2=pwm_half_per-10;
EvaRegs.CMPR1=PWM_DUTY;
EvaRegs.CMPR3=PWM_DUTY;}
else
{
EvaRegs.ACTRA.all =0x0066;//0x002c/*pwm2-pwm3*/
EvaRegs.CMPR2=PWM_DUTY;
EvaRegs.CMPR1=pwm_half_per-10;
EvaRegs.CMPR3=PWM_DUTY;
}
break;
}
default:
{
EvaRegs.ACTRA.all =0x0fff;
}
}
// EvaRegs.CMPR1=PWM_DUTY;
// EvaRegs.CMPR2=PWM_DUTY;
// EvaRegs.CMPR3=PWM_DUTY;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP2;
}
void eva_timer2_isr(void)
{
GpioDataRegs.GPBDAT.bit.GPIOB12++;
// Enable more interrupts from this timer
EvaRegs.EVAIMRB.bit.T2PINT = 1;
EvaRegs.EVAIFRB.all = BIT0;
speed=(int)hallspeed/0.205/6/pole*60;
hallspeed=0;
displaytime++;
if (displaytime>=10)
{
displayflag=1;
displaytime=0;
}
// Acknowledge interrupt to receive more interrupts from PIE group 3
PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
}
void DisplaySpeed(void)
{
int count1;
/* int tmr;
unsigned char lett;
static unsigned char* displaystring;*/
count1=speed;
// delay_loop();
d=(int)(count1/1000);
count1=count1-d*1000;
c=(int)(count1/100);
count1=count1-c*100;
b=(int)(count1/10);
count1=count1-b*10;
a=(int)(count1);
//a=0x0;b=0x1;c=0x2;d=0x3;
if(a==16) a=0;
if(b==16) b=0;
if(c==16) c=0;
if(d==16) d=0;
BC7281Write(0x15,(0x10+c++));
BC7281Write(0x15,d++);
BC7281Write(0x15,(0x20+b++));
BC7281Write(0x15,(0x30+a++));
}
//===========================================================================
// No more.
//===========================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -