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

📄 pmsm.c.bak

📁 基于DSP 2812的永磁同步电动机矢量控制程序
💻 BAK
字号:

#include "DSP281x_Device.h"       // DSP281x Headerfile Include File
#include "DSP281x_Examples.h"     // DSP281x Examples Include File

// 子程序定义
void init_eva(void);              // EVA PWM 1-6
void init_evb(void);              // EVB PWM 7 :ADS7864_clk
void xintf_zone_timing(void);     // xintf读写时序匹配
interrupt void XINT1_ISR (void);  // ADS7864中断服务
void scia_loopback_init(void);    // SCI寄存器设置
void scia_fifo_init(void);        // 初始化SCI_FIFO
void scia_xmit(int a);            // SCI发送

// 变量定义
long i=0;

// Adc(内部AD)变量
Uint16 Voltage1;
Uint16 Voltage2;
Uint16 Voltage3;
Uint16 Voltage4;

Uint16 CHA0_result = 0;           // CHA0(IA)转换结果
Uint16 CHA1_result = 0;           // CHA1(IB)转换结果
unsigned int * CHA0_address = (unsigned int *) 0x00080000;    // CHA0转换结果存储地址
unsigned int * CHA1_address = (unsigned int *) 0x00080001;    // CHA1转换结果存储地址

unsigned int * DA_address = (unsigned int *) 0x00002001;      // DA待转换数据存储地址

Uint16 AD2S1200_data_P                                        // AD2S1200:数字位置量
Uint16 AD2S1200_data_S                                        // AD2S1200:数字速度量
unsigned int * AD2S1200_address = (unsigned int *) 0x00100001;// 数字角度量存储地址

Uint16 SendChar;                  // SCI发送变量
Uint16 ReceivedChar;

// 主程序
void main(void)
{

// 系统初始化,系统时钟=150M,使能外设时钟(高速,低速),在DSP281x_SysCtrl.c文件中
  InitSysCtrl();

// GPIO为片内外设
  EALLOW;
  GpioMuxRegs.GPAMUX.all = 0x003F;   // GPIOA0-GPIO5 : EVA PWM 1-6  
  GpioMuxRegs.GPBMUX.all = 0x0001;   // GPIOB0 : EVB PWM 7 :ADS7864_clk
  GpioMuxRegs.GPFMUX.all = 0x0030;   // GPIOF4 : SCITXDA
  EDIS;
    
// 禁止CPU中断
  DINT;

// PIE初始化,禁止PIE中断,PIE中断标志清零,在DSP281x_PieCtrl.c文件中
  InitPieCtrl();

// 禁止CPU中断,CPU中断标志清零
  IER = 0x0000;
  IFR = 0x0000;

// PIE向量表初始化,在DSP281x_PieVect.c文件中
  InitPieVectTable();
   
// EVA PWM 1-6
  init_eva();

// EVB PWM 7 :ADS7864_clk
  init_evb();

// xintf时序匹配
  xintf_zone_timing();

// Adc(内部AD)初始化,在DSP281x_Adc.c文件中
  InitAdc();
  AdcRegs.ADCTRL3.bit.ADCCLKPS = 8;
  AdcRegs.ADCMAXCONV.all=0x0003;
  AdcRegs.ADCCHSELSEQ1.bit.CONV00=0x0008;
  AdcRegs.ADCCHSELSEQ1.bit.CONV01=0x0009;
  AdcRegs.ADCCHSELSEQ1.bit.CONV02=0x00010;
  AdcRegs.ADCCHSELSEQ1.bit.CONV03=0x00011;

  scia_fifo_init();      // 初始化SCI_FIFO
  scia_loopback_init();  // SCI寄存器设置

// 使能PIE外部中断1,且发生在上升沿
  XIntruptRegs.XINT1CR.all=0x0005;
  PieCtrlRegs.PIEIER1.bit.INTx4=1;
   
// 取PIE外部中断1服务子程序地址,注意屏蔽掉DSP281x_DefaultIsr.c文件中XINT1_ISR子程序
  EALLOW;
  PieVectTable.XINT1=&XINT1_ISR;
  EDIS;

// 使能PIE外部中断1
  IER|=M_INT1;

// 使能CPU中断
  EINT;
  ERTM;

  for(;;)
  {
//  读Adc(内部AD)结果
    AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 1;
    while(AdcRegs.ADCST.bit.SEQ1_BSY == 1) { }
    Voltage1 = (AdcRegs.ADCRESULT0/16)&0x0FFF;
    Voltage2 = (AdcRegs.ADCRESULT1/16)&0x0FFF;
    Voltage3 = (AdcRegs.ADCRESULT2/16)&0x0FFF;
    Voltage4 = (AdcRegs.ADCRESULT3/16)&0x0FFF;
    AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;
    
//  ADS7864  开始   
//  使能ADS7864_HOLDA,启动AD转换
    EALLOW;
    GpioMuxRegs.GPBMUX.bit.PWM8_GPIOB1 = 0x0;
    GpioMuxRegs.GPBDIR.bit.GPIOB1 = 0x1;
    GpioMuxRegs.GPBQUAL.all = 0x0000;
    EDIS;
//  置1,至少15ns
    GpioDataRegs.GPBSET.bit.GPIOB1 = 0x1;
    asm(" RPT #5 ||NOP");
    for (i=0;i<100;i++);
//  置0,至少20ns
    GpioDataRegs.GPBCLEAR.bit.GPIOB1 = 0x1;
    asm(" RPT #5 ||NOP"); 
    for (i=0;i<1000;i++);
//  ADS7864  结束

//  DAC7625  开始
//  DAC7625关脚设置
    EALLOW;
    GpioMuxRegs.GPBMUX.bit.PWM11_GPIOB4 = 0x0;
    GpioMuxRegs.GPBDIR.bit.GPIOB4 = 0x1;
    GpioMuxRegs.GPBMUX.bit.PWM12_GPIOB5 = 0x0;
    GpioMuxRegs.GPBDIR.bit.GPIOB5 = 0x1;
    GpioMuxRegs.GPBMUX.bit.T3PWM_GPIOB6 = 0x0;
    GpioMuxRegs.GPBDIR.bit.GPIOB6 = 0x1;
    GpioMuxRegs.GPBQUAL.all = 0x0000;
    EDIS;
	
    GpioDataRegs.GPBSET.bit.GPIOB4 = 0x1;
    GpioDataRegs.GPBSET.bit.GPIOB5 = 0x1;
    GpioDataRegs.GPBSET.bit.GPIOB6 = 0x1;
    asm(" RPT #5 ||NOP");
    for (i=0;i<100;i++);
	
    GpioDataRegs.GPBCLEAR.bit.GPIOB4 = 0x1;
    GpioDataRegs.GPBCLEAR.bit.GPIOB5 = 0x1;
    GpioDataRegs.GPBCLEAR.bit.GPIOB6 = 0x1;
    asm(" RPT #5 ||NOP"); 
    for (i=0;i<1000;i++);

    * DA_address = 0x0F00;    // 待转换数据
//  DAC7625  结束
    
//  AD2S1200  开始
    EALLOW;
//  GPIOB2:SAMPLE信号
//  GPIOB3:旋变位置速度(P/S)信号
	GpioMuxRegs.GPBMUX.bit.PWM9_GPIOB2 = 0x0;    //GPIOB2设为IO口
	GpioMuxRegs.GPBDIR.bit.GPIOB2 = 0x1;         //GPIOB2设为输出
	GpioMuxRegs.GPBMUX.bit.PWM10_GPIOB3 = 0x0;   //GPIOB3设为IO口
	GpioMuxRegs.GPBDIR.bit.GPIOB3 = 0x1;         //GPIOB3设为输出
	GpioMuxRegs.GPBQUAL.all = 0x0000;
	EDIS;
	    
//  SAMPLE信号置0时间:6.67*55=366
    GpioDataRegs.GPBSET.bit.GPIOB2 = 0x1;
	GpioDataRegs.GPBCLEAR.bit.GPIOB2 = 0x1;
	asm(" RPT #55 ||NOP");
	GpioDataRegs.GPBSET.bit.GPIOB2 = 0x1;
	
	asm(" RPT #74||NOP");
	
//  读旋变位置信号    P/S置1
	GpioDataRegs.GPBSET.bit.GPIOB3 = 0x1;
	asm(" RPT #1||NOP");  
	AD2S1200_data_P= * AD2S1200_address;
	asm(" RPT #2||NOP");
	GpioDataRegs.GPBCLEAR.bit.GPIOB3 = 0x1;
	
	asm(" RPT #200||NOP");
	
//  读旋变速度信号    P/S置0
	GpioDataRegs.GPBCLEAR.bit.GPIOB3 = 0x1;
	asm(" RPT #1||NOP"); 	
	AD2S1200_data_S= * AD2S1200_address;
	asm(" RPT #2||NOP");
	GpioDataRegs.GPBSET.bit.GPIOB3 = 0x1;
//  AD2S1200  结束

//  SCI串口通信
    SendChar = CHA0_result/256;    // SCI发送变量的高8位
    SendChar &= 0x00FF;   
    scia_xmit(SendChar);     // SCI发送
    while(SciaRegs.SCIFFRX.bit.RXFIFST !=1) { }    //等待发送完
    // 判断接收数据
    ReceivedChar = SciaRegs.SCIRXBUF.all;	
       
    SendChar = CHA0_result;        // SCI发送变量的低8位
    SendChar &= 0x00FF;
    scia_xmit(SendChar);     // SCI发送
    while(SciaRegs.SCIFFRX.bit.RXFIFST !=1) { }    //等待发送完
    // 判断接收数据
    ReceivedChar = SciaRegs.SCIRXBUF.all;	
  };

}

// EVA PWM 1-6
void init_eva()
{
  EvaRegs.T1PR = 0x0EA6;         // 20K,150000/20/2=3750=0x0EA6
  EvaRegs.T1CNT = 0x0000;      
  EvaRegs.T1CON.all = 0x1040;    // 连续增

  EvaRegs.CMPR1 = 0x0C00;
  EvaRegs.CMPR2 = 0x0900;
  EvaRegs.CMPR3 = 0x0600;
    
  EvaRegs.ACTRA.all = 0x0666;
  EvaRegs.DBTCONA.all = 0x0000;  // 禁止死区
  EvaRegs.COMCONA.all = 0xA600;

} 

//EVB PWM 7 :ADS7864_clk
void init_evb()
{
  EvbRegs.T3PR = 0x0009;         // 7.5M,150/7.5/2-1=9=0x0009
  EvbRegs.T3CNT = 0x0000;
  EvbRegs.T3CON.all = 0x1040;    // 连续增

  EvbRegs.CMPR4 = 0x0005;
 
  EvbRegs.ACTRB.all = 0x0666;
  EvbRegs.DBTCONB.all = 0x0000;  // 禁止死区
  EvbRegs.COMCONB.all = 0xA600;
}

// xintf读写时序匹配
void xintf_zone_timing()
{
// All Zones---------------------------------
// XTIMCLK = SYSCLKOUT 
  XintfRegs.XINTCNF2.bit.XTIMCLK = 0;
// 当前写缓冲区有3个值
  XintfRegs.XINTCNF2.bit.WRBUFF = 3;
// 使能XCLKOUT 
  XintfRegs.XINTCNF2.bit.CLKOFF = 0;
// XCLKOUT = XTIMCLK 
  XintfRegs.XINTCNF2.bit.CLKMODE = 0;
    
// Zone 0    DAC7625-------------------
// 写时序
  XintfRegs.XTIMING0.bit.XWRLEAD = 1;
  XintfRegs.XTIMING0.bit.XWRACTIVE = 8;   // 8+1=9 9*6.67=60.03>50
  XintfRegs.XTIMING0.bit.XWRTRAIL = 1;
// 读时序
  XintfRegs.XTIMING0.bit.XRDLEAD = 1;
  XintfRegs.XTIMING0.bit.XRDACTIVE = 1;    
  XintfRegs.XTIMING0.bit.XRDTRAIL = 0;
// LEAD,ACTIVE,TRAIL信号不加倍
  XintfRegs.XTIMING0.bit.X2TIMING = 0;
// 不采样READY信号 
  XintfRegs.XTIMING0.bit.USEREADY = 0;
  XintfRegs.XTIMING0.bit.READYMODE = 0;  
// 必须为11
  XintfRegs.XTIMING0.bit.XSIZE = 3;
  asm(" RPT #7 || NOP"); 

// Zone 2    ADS7864-------------------
// 写时序
  XintfRegs.XTIMING2.bit.XWRLEAD = 1;
  XintfRegs.XTIMING2.bit.XWRACTIVE = 1;
  XintfRegs.XTIMING2.bit.XWRTRAIL = 1;
// 读时序
  XintfRegs.XTIMING2.bit.XRDLEAD = 1;
  XintfRegs.XTIMING2.bit.XRDACTIVE = 4;    // 4+1=5 5*6.67=33.35>30
  XintfRegs.XTIMING2.bit.XRDTRAIL = 0;
// LEAD,ACTIVE,TRAIL信号不加倍
  XintfRegs.XTIMING2.bit.X2TIMING = 0;
// 不采样READY信号 
  XintfRegs.XTIMING2.bit.USEREADY = 0;
  XintfRegs.XTIMING2.bit.READYMODE = 0;  
// 必须为11
  XintfRegs.XTIMING2.bit.XSIZE = 3;
  asm(" RPT #7 || NOP");
  
// Zone 6     AD2S1200-----------------
// 写时序
    XintfRegs.XTIMING6.bit.XWRLEAD = 1;
    XintfRegs.XTIMING6.bit.XWRACTIVE = 1;
    XintfRegs.XTIMING6.bit.XWRTRAIL = 1;
// 读时序
    XintfRegs.XTIMING6.bit.XRDLEAD = 1;
    XintfRegs.XTIMING6.bit.XRDACTIVE = 4;
    XintfRegs.XTIMING6.bit.XRDTRAIL = 0;
// LEAD,ACTIVE,TRAIL信号不加倍 
    XintfRegs.XTIMING6.bit.X2TIMING = 0;
// 不采样READY信号 
    XintfRegs.XTIMING6.bit.USEREADY = 0;
    XintfRegs.XTIMING6.bit.READYMODE = 0;  
// 必须为11
    XintfRegs.XTIMING6.bit.XSIZE = 3;
   asm(" RPT #7 || NOP");  

}

// 外部中断1服务子程序 : ADS7864
interrupt void XINT1_ISR (void)
{ 
  XIntruptRegs.XINT1CR.all=0x0004;   // 禁止PIE外部中断1
    
  CHA0_result = *CHA0_address;       // 读CHA0转换结果
  CHA1_result = *CHA1_address;       // 读CHA1转换结果
  
  XIntruptRegs.XINT1CR.all=0x0005;   // 使能PIE外部中断1
  PieCtrlRegs.PIEACK.all=PIEACK_GROUP1;
  return;
}

// SCI寄存器设置
void scia_loopback_init()
{
  SciaRegs.SCICCR.all =0x0007;       // 1个结束位,禁止回送测试,无奇偶校验位
                                     // 选择空闲线协议,8位数据位
  SciaRegs.SCICTL1.all =0x0003;      // 使能TX,RX,SCICLK,SCI软件复位
  SciaRegs.SCICTL2.all =0x0000; 
  SciaRegs.SCIHBAUD    =0x0001;
  SciaRegs.SCILBAUD    =0x00E7;      // Baud:9600
  SciaRegs.SCICCR.bit.LOOPBKENA =1;  // 使能回送测试  
  SciaRegs.SCICTL1.all =0x0023;      // 重启SCI 
}

// SCI发送
void scia_xmit(int a)
{
  SciaRegs.SCITXBUF=a;               // a为待发送数据
}

// 初始化SCI_FIFO
void scia_fifo_init()										
{
  SciaRegs.SCIFFTX.all=0xE040;       // 
  SciaRegs.SCIFFRX.all=0x605f;       //
  SciaRegs.SCIFFCT.all=0x0000;       //
}

//===========================================================================
// No more.
//===========================================================================

⌨️ 快捷键说明

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