📄 pmsm.c.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 + -