DSP应用技术.docx
《DSP应用技术.docx》由会员分享,可在线阅读,更多相关《DSP应用技术.docx(31页珍藏版)》请在冰豆网上搜索。
DSP应用技术
课题名称:
DSP应用技术
学院:
电气信息工程学院
专业:
自动化
姓名:
xxxxx
班级学号:
11-1-28
指导教师:
吴勇
2014年12月22日-2014年12月26日
目录
一、开发板调试3
1.1实习目的3
1.2实习要求3
1.3实习内容3
1.3.1CPU定时器0实验3
1.3.2CPU定时器2实验4
1.3.3EVtime1实验5
1.3.4数码管显示实验9
1.3.5外部RAM实验11
1.3.6外部Flash读写实验12
1.3.7直流电机控制实验14
二、基于DSP的直流电动机的闭环调速的系统设计16
2.1硬件设计16
2.1.1系统硬件设计总体框图16
2.1.2主电路17
2.1.3驱动电路17
2.1.4电流电压采样电路18
2.1.5电动机转速检测电路18
2.1.6控制电路21
2.1.7保护电路22
2.1.8显示电路22
三、总结23
3.1实习心得23
一、开发板调试
1.1实习目的
1)学习DSP内部定时器0、定时器2的使用
2)掌握DSP的SPI工作原理
3)理解DSP控制步进电机原理
1.2实习要求
1)通过使用DSP内部的定时器0来实现对LED灯的控制实现LED灯循环闪烁
2):
QQ2812通过SPI接口控制LED数码管实现数码管从0~F循环显示
3)由DSP输出的PWM3~6做为步进电机的4个信号线输入完成DSP控制步进电机
1.3实习内容
1.3.1CPU定时器0实验
#include"DSP28_Device.h"//8个LED灯的地址,由CPLD得知
unsignedint*Led8=(unsignedint*)0x4100;
unsignedintLedCount;
Uint16LedCode[]={0xfe,0xfd,0xfc,0xf7};左四循环右四灭
//定时器0中断函数,这里我们是另外写了,大家也可以把他直接放在#include"DSP28_Device.h"中.
interruptvoidISRTimer0(void);
voidmain(void)
{
/*初始化系统*/
InitSysCtrl();
/*关中断*/
DINT;
IER=0x0000;
IFR=0x0000;//清中断
LedCount=0;
/*初始化PIE*/
InitPieCtrl();
/*初始化PIE中断矢量表*/
InitPieVectTable();
/*初始化定时器0*/
InitCpuTimers();
/*初始化外设*/
InitPeripherals();
/*受EALLOW保护的定时器0中断矢量*/
EALLOW;//允许访问EALLOW保护的寄存器
PieVectTable.TINT0=&ISRTimer0;//指向中断服务寄存器定时器0的地址
EDIS;//重新EALLOW保护
/*设置CPU,配置定时器0多长时间中断一次,这里的配置可参见课本P61*/
ConfigCpuTimer(&CpuTimer0,10,1000000);
CpuTimer0Regs.TCR.bit.TSS=0;///开启CPU定时器0
//StartCpuTimer0();
/*开中断,查看中断向量表可知CPU定时器0位于INT1.7,见课本P82*/
IER|=M_INT1;
PieCtrl.PIEIER1.bit.INTx7=1;
EINT;//开放全局中断,EnableGlobalinterruptINTM
ERTM;//开放全局实时中断,EnableGlobalrealtimeinterruptDBGM
for(;;);
}
interruptvoidISRTimer0(void)
{
//响应中断寄存器清除,写1清0,进而才能接收下一外围中断
PieCtrl.PIEACK.bit.ACK7=1;
//向CPLD控制的LED灯地址写数据,进而实现对灯的控制
*Led8=LedCode[LedCount];LedCount++;
if(LedCount>=6)LedCount=0;
}
1.3.2CPU定时器2实验奇亮偶灭
#include"DSP28_Device.h"
unsignedint*Led8=(unsignedint*)0x4100;//二极管地址,由CPLD提供
unsignedintLed_Flag;//二极管全亮,全灭标志位
interruptvoidISRTimer2(void);//中断服务寄存器定时器2函数
voidmain(void)
{
/*初始化系统*/
InitSysCtrl();
/*关中断*/
DINT;
IER=0x0000;
IFR=0x0000;
Led_Flag=0;
/*初始化PIE*/
InitPieCtrl();
/*初始化PIE中断矢量表*/
InitPieVectTable();
/*初始化外设*/
InitPeripherals();
EALLOW;
PieVectTable.TINT2=&ISRTimer2;
EDIS;
/*设置CPU*/
ConfigCpuTimer(&CpuTimer2,50,1000000);
CpuTimer2Regs.TCR.bit.TSS=0;//启动定时器2
///StartCpuTimer2();
/*开中断*/
IER|=M_INT14;//内部定时器在PIE分组中位于14
EINT;//EnableGlobalinterruptINTM
ERTM;//EnableGlobalrealtimeinterruptDBGM
for(;;);
}
interruptvoidISRTimer2(void)
{
CpuTimer2.InterruptCount++;//中断计数
if(Led_Flag==1)
{
*Led8=0x55;//全亮
Led_Flag=0;
}
else
{
*Led8=0xaa;//全灭
Led_Flag=1;
}
}
1.3.3EVtime1实验
实验目的:
了解事件管理器的定时器的应用,大家在学习时要结合第四章的事件管理器来进行实验说明:
这里我们只使用了EvaTimer1来控制LED灯的亮灭,你在学习中可通过它来了解
EV的定时器工作原理,对以后做电机之类的控制时可以引用部分函数
实验结果:
可看到板上8个发光二极管产生左2灭右2亮中间4循环的效果
#include"DSP28_Device.h"
#include"DSP28_Globalprototypes.h"
unsignedint*Led8=(unsignedint*)0x4100;//LED控制寄存器
constUint16LedCode[]={0xcb,0xc7,0x4f,0x8f};
//Prototypestatementsforfunctionsfoundwithinthisfile.
interruptvoideva_timer1_isr(void);
interruptvoideva_timer2_isr(void);
interruptvoidevb_timer3_isr(void);
interruptvoidevb_timer4_isr(void);
//Globalcountsusedinthisexample
Uint32EvaTimer1InterruptCount;
Uint32EvaTimer2InterruptCount;
Uint32EvbTimer3InterruptCount;
Uint32EvbTimer4InterruptCount;
Uint16LedCount=0;
voidmain(void)
{
/*初始化系统*/
InitSysCtrl();
/*关中断*/
DINT;
IER=0x0000;
IFR=0x0000;
/*初始化PIE*/
InitPieCtrl();
/*初始化PIE中断矢量表*/
InitPieVectTable();
/*初始化外设*/
InitPeripherals();
/*初始化GPIO*/
InitGpio();
InitXIntrupt();
EALLOW;//ThisisneededtowritetoEALLOWprotectedregisters
PieVectTable.T1PINT=&eva_timer1_isr;
PieVectTable.T2PINT=&eva_timer2_isr;
PieVectTable.T3PINT=&evb_timer3_isr;
PieVectTable.T4PINT=&evb_timer4_isr;
EDIS;//ThisisneededtodisablewritetoEALLOWprotectedregisters
//EnablePIEgroup2interrupt4forT1PINT
PieCtrl.PIEIER2.all=M_INT4;
//EnablePIEgroup3interrupt1forT2PINT
PieCtrl.PIEIER3.all=M_INT1;
//EnablePIEgroup4interrupt4forT3PINT
PieCtrl.PIEIER4.all=M_INT4;
//EnablePIEgroup5interrupt1forT4PINT
PieCtrl.PIEIER5.all=M_INT1;
//EnableCPUINT2forT1PINT,INT3forT2PINT,INT4forT3PINT
//andINT5forT4PINT:
IER|=(M_INT2|M_INT3|M_INT4|M_INT5);
//EnableglobalInterruptsandhigherpriorityreal-timedebugevents:
EINT;//EnableGlobalinterruptINTM
ERTM;//EnableGlobalrealtimeinterruptDBGM
//Step6.IDLEloop.Justsitandloopforever:
for(;;);
}
//Step7.InsertalllocalInterruptServiceRoutines(ISRs)andfunctionshere:
//IflocalISRsareused,reassignvectoraddressesinvectortableas
//showninStep5
/*这里的配置需参照课本第四章的事件管理器的中断寄存器的设置*/
interruptvoideva_timer1_isr(void)
{
EvaTimer1InterruptCount++;///EV中断计数累加
//Enablemoreinterruptsfromthistimer
EvaRegs.EVAIMRA.bit.T1PINT=1;////EVA的中断屏蔽寄存器的通用定时器1的周
////期中断位使能
//Note:
Tobesafe,useamaskvaluetowritetotheentire
//EVAIFRAregister.Writingtoonebitwillcausearead-modify-write
//operationthatmayhavetheresultofwriting1'stoclear
//bitsotherthenthoseintended.
EvaRegs.EVAIFRA.all=BIT7;
//AcknowledgeinterrupttorecievemoreinterruptsfromPIEgroup2
PieCtrl.PIEACK.all=PIEACK_GROUP2;////响应中断组
/*下面就是我们写进去的数据给CPLD来控制LED的亮灭*/
*Led8=LedCode[3-LedCount];
LedCount++;
if(LedCount>3)LedCount=0;
}
interruptvoideva_timer2_isr(void)
{
EvaTimer2InterruptCount++;
//Enablemoreinterruptsfromthistimer
EvaRegs.EVAIMRB.bit.T2PINT=1;
//Note:
Tobesafe,useamaskvaluetowritetotheentire
//EVAIFRBregister.Writingtoonebitwillcausearead-modify-write
//operationthatmayhavetheresultofwriting1'stoclear
//bitsotherthenthoseintended.
EvaRegs.EVAIFRB.all=BIT0;
//AcknowledgeinterrupttorecievemoreinterruptsfromPIEgroup3
PieCtrl.PIEACK.all=PIEACK_GROUP3;
}
interruptvoidevb_timer3_isr(void)
{
EvbTimer3InterruptCount++;
//Note:
Tobesafe,useamaskvaluetowritetotheentire
//EVBIFRAregister.Writingtoonebitwillcausearead-modify-write
//operationthatmayhavetheresultofwriting1'stoclear
//bitsotherthenthoseintended.
EvbRegs.EVBIFRA.all=BIT7;
//AcknowledgeinterrupttorecievemoreinterruptsfromPIEgroup4
PieCtrl.PIEACK.all=PIEACK_GROUP4;
}
interruptvoidevb_timer4_isr(void)
{
EvbTimer4InterruptCount++;
//Note:
Tobesafe,useamaskvaluetowritetotheentire
//EVBIFRBregister.Writingtoonebitwillcausearead-modify-write
//operationthatmayhavetheresultofwriting1'stoclear
//bitsotherthenthoseintended.
EvbRegs.EVBIFRB.all=BIT0;
//AcknowledgeinterrupttorecievemoreinterruptsfromPIEgroup5
PieCtrl.PIEACK.all=PIEACK_GROUP5;
}
voidDelay(Uint16data)
{
Uint16i;
for(i=0;i}
1.3.4数码管显示实验
实验目的:
通过学习本实验来掌握DSP的SPI工作原理**
实验说明:
QQ2812通过SPI接口控制LED数码管SPI是一高速同步的串行输入输出口,它的通信速率和通信数据长度都是可编程的,可以接收和发送16位的数据位,并且带有双缓冲的.SPI的4个外部引脚由:
从输出主输入(SPISOMI),从输入主输出(SPISIMO),从发送使能(/SPISTE),串行时钟引脚(SPICLK)组成。
主要硬件部分:
DSP,CPLD,74HC595(串入并出的移位器)共阳数码管。
SPIMOSI和SPICLK直接从DSPJIE接到了74HC595的**
SER和SRCLK,作为数据和时钟信号的输入,SPICS由CPLD引出来控制74HC595的选通。
实验结果:
可看到数码管从0~F循环显示
#include"DSP28_Device.h"
voidWriteLED(unsignedchardata);//送给数码管的数据函数
//voiddelay(unsignedlongt);
unsignedint*SPI_CS=(unsignedint*)0x4500;//0X4500是CPLD的SPICS地址
unsignedlonginta;
Uint16SpiCode[]={0x2222,0xe0e0,0xb1b1,0x6868,0xa1a1,0xa3a3,0xffff};
//数码管的笔画对应关系如下:
//6
//37
//4
//20
//15
//就是说0~7分别对应笔画的a~h,在原理图看就是分别连接的Q0~Q7
//这个数码管的型号是LG3611BH,是共阳级的,也就是说某个笔画为0的时候,
//这个笔画被点亮。
//我们以"1",0x7E7E为例说明
//7E的二进制是01111110,对应点亮的就是Q0和Q7,也就是'1'了。
//其他的自己拿笔画一下就清楚了。
voidmain(void)
{intk;
/*初始化系统*/
InitSysCtrl();
/*关中断*/
DINT;
IER=0x0000;
IFR=0x0000;
/*初始化PIE控制寄存器*/
InitPieCtrl();
/*初始化PIE参数表*/
InitPieVectTable();
/*初始化外设寄存器*/
InitPeripherals();
/*设置CPU*/
EINT;//EnableGlobalinterruptINTM
ERTM;//EnableGlobalrealtimeinterruptDBGM
*SPI_CS=0x00;//写0,低电平选中
for(;;)
{
for(k=0;k<17;k++)//循环发送16个数据
{WriteLED(SpiCode[k]);//发送数据函数
for(a=0;a<500000;a++);
}
}
}
voidWriteLED(unsignedchardata)
{
if(Spi_TxReady()==1)//当检测到SPI发送准备信号致1时,开始发送数据
SpiaRegs.SPITXBUF=data;//把数据写如SPI发送缓冲区
while(Spi_TxReady()!
=1);//没检测到发送准备信号
*SPI_CS=0x01;//关片选
*SPI_CS=0x00;//退出时开片选
}
/*voiddelay(unsignedlongt)
{
while(t>0)
t--;
}*/
1.3.5外部RAM实验
实验目的:
通过学习DSP与外部RAM的读写数据
实验说明:
能够为以后写比较大的程序时,在仿真运行时内部RAM不够用时,可利用外部RAM来进行,当然这需要.CMD文件来配置
实验结果:
在指定位置设置断点后可观察通过函数来写到地址里面的值
#include"DSP28_Device.h"
#include"ext_inf.h"
voidmain(void)
{
/*初始化系统*/
InitSysCtrl();
/*关中断*/
DINT;
IER=0x0000;
IFR=0x0000;
/*初始化PIE*/
InitPieCtrl();
/*初始化PIE中断矢量表*/
InitPieVectTable();
InitExRam(0);//以下任一行停下后观察内存地址的值
RamRead(0x4000);//这里设置断点可查看到外部RAM中写入我们的数据
InitExRam1(0x0);
for(;;);//这里设置断点可查看到外部RAM里面全部清0
}
1.3.6外部Flash读写实验
实验目的:
通过学习外部FLASH实验,了解FLASH的读写
实验说明:
这里我们是和前面讲的外部RAM实验联合进行的,先是给外部RAM里面写写入数据,然后把数据写到外部FLASH里面。
实验结果:
在指定位置设置断点后可观察通过函数来写到FLASH里面的值。
#include"DSP28_Device.h"
#include"ext_inf.h"
voidSendData(Uint16data);
externUint16SectorErase(Uint16SectorNum);//扇区擦除
externUint16BlockErase(Uint16BlockNum);//块擦除
externUint16ChipErase(void);//芯片擦除
externUint16FlashWrite(Uint32RamStart,Uint32RomStart,U