课程设计(实习)报告
课题名称: DSP应用技术
学 院: 电气信息工程学院
专 业: 自动化
姓 名: 曾涛
班级学号: 08-1-33
指导教师: 吴 勇
20##年12月30日
目录
第一部分 开发板调试... 3
1.1实习目的... 3
1.2实习要求... 3
1.3实习内容... 3
1.3.1 CPU 定时器0实验... 3
1.3.2 CPU 定时器2实验... 4
1.3.3 EVtime1 实验... 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 电动机转速检测电路... 19
2.1.6 控制电路... 20
2.1.7 保护电路... 21
2.1.8 显示电路... 22
第三部分 总结... 23
3.1 实习心得... 23
3.2 参考文献... 24
第一部分 开发板调试
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.1 CPU 定时器0实验
#include "DSP28_Device.h" //8个LED灯的地址,由CPLD得知
unsigned int * Led8 = (unsigned int *) 0x4100;
unsigned int LedCount;
Uint16 LedCode[]={0xfe,0xfd,0xfc,0xf7}; 左四循环右四灭
//定时器0中断函数,这里我们是另外写了,大家也可以把他直接放在#include "DSP28_Device.h"中.
interrupt void ISRTimer0(void);
void main(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; // 开放全局中断,Enable Global interrupt INTM
ERTM; // 开放全局实时中断,Enable Global realtime interrupt DBGM
for(;;);
}
interrupt void ISRTimer0(void)
{
//响应中断寄存器清除,写1清0,进而才能接收下一外围中断
PieCtrl.PIEACK.bit.ACK7=1;
//向CPLD控制的LED灯地址写数据,进而实现对灯的控制
*Led8 = LedCode[LedCount]; LedCount++;
if (LedCount>=6) LedCount=0;
}
1.3.2 CPU 定时器2实验 奇亮偶灭
#include "DSP28_Device.h"
unsigned int * Led8 = (unsigned int *) 0x4100;//二极管地址,由CPLD提供
unsigned int Led_Flag; //二极管全亮,全灭标志位
interrupt void ISRTimer2(void); //中断服务寄存器定时器2函数
void main(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; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM
for(;;);
}
interrupt void ISRTimer2(void)
{
CpuTimer2.InterruptCount++; //中断计数
if(Led_Flag == 1)
{
*Led8 = 0x55; //全亮
Led_Flag = 0;
}
else
{
*Led8 = 0xaa; //全灭
Led_Flag = 1;
}
}
1.3.3 EVtime1 实验
实验目的:了解事件管理器的定时器的应用,大家在学习时要结合第四章的事件管理器来进行 实验说明:这里我们只使用了EvaTimer1来控制LED灯的亮灭,你在学习中可通过它来了解
EV的定时器工作原理,对以后做电机之类的控制时可以引用部分函数
实验结果:可看到板上8个发光二极管产生左2灭右2亮中间4循环的效果
#include "DSP28_Device.h"
#include "DSP28_Globalprototypes.h"
unsigned int *Led8 = (unsigned int *)0x4100; //LED 控制寄存器
const Uint16 LedCode[]={0xcb,0xc7,0x4f,0x8f};
// Prototype statements for functions found within this file.
interrupt void eva_timer1_isr(void);
interrupt void eva_timer2_isr(void);
interrupt void evb_timer3_isr(void);
interrupt void evb_timer4_isr(void);
// Global counts used in this example
Uint32 EvaTimer1InterruptCount;
Uint32 EvaTimer2InterruptCount;
Uint32 EvbTimer3InterruptCount;
Uint32 EvbTimer4InterruptCount;
Uint16 LedCount = 0;
void main(void)
{
/*初始化系统*/
InitSysCtrl();
/*关中断*/
DINT;
IER = 0x0000;
IFR = 0x0000;
/*初始化PIE*/
InitPieCtrl();
/*初始化PIE中断矢量表*/
InitPieVectTable();
/*初始化外设*/
InitPeripherals();
/*初始化GPIO*/
InitGpio();
InitXIntrupt();
EALLOW; // This is needed to write to EALLOW protected registers
PieVectTable.T1PINT = &eva_timer1_isr;
PieVectTable.T2PINT = &eva_timer2_isr;
PieVectTable.T3PINT = &evb_timer3_isr;
PieVectTable.T4PINT = &evb_timer4_isr;
EDIS; // This is needed to disable write to EALLOW protected registers
// Enable PIE group 2 interrupt 4 for T1PINT
PieCtrl.PIEIER2.all = M_INT4;
// Enable PIE group 3 interrupt 1 for T2PINT
PieCtrl.PIEIER3.all = M_INT1;
// Enable PIE group 4 interrupt 4 for T3PINT
PieCtrl.PIEIER4.all = M_INT4;
// Enable PIE group 5 interrupt 1 for T4PINT
PieCtrl.PIEIER5.all = M_INT1;
// Enable CPU INT2 for T1PINT, INT3 for T2PINT, INT4 for T3PINT
// and INT5 for T4PINT:
IER |= (M_INT2 | M_INT3 | M_INT4 | M_INT5);
// Enable global Interrupts and higher priority real-time debug events:
EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM
// Step 6. IDLE loop. Just sit and loop forever:
for(;;);
}
// Step 7. Insert all local Interrupt Service Routines (ISRs) and functions here:
// If local ISRs are used, reassign vector addresses in vector table as
// shown in Step 5
/*这里的配置需参照课本第四章的事件管理器的中断寄存器的设置*/
interrupt void eva_timer1_isr(void)
{
EvaTimer1InterruptCount++;///EV中断计数累加
// Enable more interrupts from this timer
EvaRegs.EVAIMRA.bit.T1PINT = 1;////EVA的中断屏蔽寄存器的通用定时器1的周
////期中断位使能
// Note: To be safe, use a mask value to write to the entire
// EVAIFRA register. Writing to one bit will cause a read-modify-write
// operation that may have the result of writing 1's to clear
// bits other then those intended.
EvaRegs.EVAIFRA.all = BIT7;
// Acknowledge interrupt to recieve more interrupts from PIE group 2
PieCtrl.PIEACK.all = PIEACK_GROUP2;////响应中断组
/*下面就是我们写进去的数据给CPLD来控制LED的亮灭*/
*Led8 = LedCode[3-LedCount];
LedCount++;
if (LedCount>3) LedCount = 0;
}
interrupt void eva_timer2_isr(void)
{
EvaTimer2InterruptCount++;
// Enable more interrupts from this timer
EvaRegs.EVAIMRB.bit.T2PINT = 1;
// Note: To be safe, use a mask value to write to the entire
// EVAIFRB register. Writing to one bit will cause a read-modify-write
// operation that may have the result of writing 1's to clear
// bits other then those intended.
EvaRegs.EVAIFRB.all = BIT0;
// Acknowledge interrupt to recieve more interrupts from PIE group 3
PieCtrl.PIEACK.all = PIEACK_GROUP3;
}
interrupt void evb_timer3_isr(void)
{
EvbTimer3InterruptCount++;
// Note: To be safe, use a mask value to write to the entire
// EVBIFRA register. Writing to one bit will cause a read-modify-write
// operation that may have the result of writing 1's to clear
// bits other then those intended.
EvbRegs.EVBIFRA.all = BIT7;
// Acknowledge interrupt to recieve more interrupts from PIE group 4
PieCtrl.PIEACK.all = PIEACK_GROUP4;
}
interrupt void evb_timer4_isr(void)
{
EvbTimer4InterruptCount++;
// Note: To be safe, use a mask value to write to the entire
// EVBIFRB register. Writing to one bit will cause a read-modify-write
// operation that may have the result of writing 1's to clear
// bits other then those intended.
EvbRegs.EVBIFRB.all = BIT0;
// Acknowledge interrupt to recieve more interrupts from PIE group 5
PieCtrl.PIEACK.all = PIEACK_GROUP5;
}
void Delay(Uint16 data)
{
Uint16 i;
for (i=0;i<data;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"
void WriteLED(unsigned char data); //送给数码管的数据函数
//void delay(unsigned long t);
unsigned int * SPI_CS = (unsigned int *) 0x4500; //0X4500是CPLD的SPICS地址
unsigned long int a;
Uint16 SpiCode[]={0x2222,0xe0e0,0xb1b1,0x6868,0xa1a1,0xa3a3,0xffff};
//数码管的笔画对应关系如下:
// 6
// 3 7
// 4
// 2 0
// 1 5
//就是说0~7分别对应笔画的a~h,在原理图看就是分别连接的Q0~Q7
//这个数码管的型号是LG3611BH,是共阳级的,也就是说某个笔画为0的时候,
//这个笔画被点亮。
//我们以 "1",0x7E7E为例说明
//7E的二进制是01111110,对应点亮的就是Q0和Q7,也就是'1'了。
//其他的自己拿笔画一下就清楚了。
void main(void)
{ int k;
/*初始化系统*/
InitSysCtrl();
/* 关中断 */
DINT;
IER = 0x0000;
IFR = 0x0000;
/* 初始化PIE控制寄存器 */
InitPieCtrl();
/* 初始化PIE参数表 */
InitPieVectTable();
/* 初始化外设寄存器 */
InitPeripherals();
/*设置CPU*/
EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM
*SPI_CS=0x00; //写0,低电平选中
for(;;)
{
for(k=0;k<17;k++) //循环发送16个数据
{WriteLED(SpiCode[k]); //发送数据函数
for(a=0;a<500000;a++);
}
}
}
void WriteLED(unsigned char data)
{
if(Spi_TxReady() == 1) //当检测到SPI发送准备信号致1时,开始发送数据
SpiaRegs.SPITXBUF = data; //把数据写如SPI发送缓冲区
while( Spi_TxReady()!=1); //没检测到发送准备信号
*SPI_CS=0x01; //关片选
*SPI_CS=0x00; //退出时开片选
}
/*void delay(unsigned long t)
{
while(t>0)
t--;
}*/
1.3.5 外部RAM实验
实验目的:通过学习DSP与外部RAM的读写数据
实验说明:能够为以后写比较大的程序时,在仿真运行时内部RAM不够用时,可利用外部RAM来进行,当然这需要.CMD文件来配置
实验结果:在指定位置设置断点后可观察通过函数来写到地址里面的值
#include "DSP28_Device.h"
#include "ext_inf.h"
void main(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"
void SendData(Uint16 data);
extern Uint16 SectorErase(Uint16 SectorNum); //扇区擦除
extern Uint16 BlockErase(Uint16 BlockNum); //块擦除
extern Uint16 ChipErase(void); //芯片擦除
extern Uint16 FlashWrite(Uint32 RamStart, Uint32 RomStart, Uint16 Length);
extern void FlashRead(Uint32 RamStart, Uint32 RomStart, Uint16 Length);
extern void InitExRam(Uint16 Start);
extern void InitExRam(Uint16 Start);
extern void RamRead(Uint16 Start);
unsigned int *USB = (unsigned int *)0x5700;
void main(void)
{
/*初始化系统*/
InitSysCtrl();
/*关中断*/
DINT;
IER = 0x0000;
IFR = 0x0000;
/*初始化PIE*/
InitPieCtrl();
/*初始化PIE中断矢量表*/
InitPieVectTable();
*USB=0;
//在下面任一行设断点后,查看内存即可观察到实验现象
InitExRam(0); //初始化外部RAM,将外部RAM里面写入我们的数据
ChipErase(); //擦除FLASH里面的数据
RamRead(0x4000); //设置断点,读外部RAM里面的数据,地址为0X00100000
FlashWrite(0,0,0x4000); //此行是将内存地址0x100000的内容复制到FLASH地址的0x80000中,长度为0x4000
BlockErase(0); //设置断点,可观察到将外部RAM中的数据复制到外部FLASH之后,里面的值是相同的
InitExRam1(0x0); //此行是将起始地址为0x0000的内存初始化为0,
FlashRead(0,0,0x4000); //此行是将外部FLASH的内容复制到RAM中,长度为0x4000
for(;;);
}
1.3.7 直流电机控制实验
实验目的:通过学习直流电机实验,了解PWM波如何配置,来控制电机的转动。大家在学习时还是要在去熟悉下我们课本的事件管理器那一章,对其寄存器有个了解,好再去看程序,就都明白了
实验说明:因为直流电机就两根线,我们取了DSP的PWM1和PWM2来进行控制,然后经过了两级放大输出。
实验结果:运行程序可看到电机在转动,若要改变电机转速或转向,可在DSP28_EV.c文件里按相应注释修改,即实现PWM波来控制电机
#include "DSP28_Device.h"
void main(void)
{
/*初始化系统*/
InitSysCtrl();
/*关中断*/
DINT;
IER = 0x0000;
IFR = 0x0000;
/*初始化PIE控制寄存器*/
InitPieCtrl();
/*初始化PIE矢量表*/
InitPieVectTable();
/*初始化GPIO*/
InitGpio();
/*初始化EV*/
InitEv();
EINT;
ERTM;
for(;;)
{
KickDog(); //剔除看门狗,防止对DSP进行复位
}
}
#include "DSP28_Device.h"
/*这里的配置大家可参照课本时间管理器*/
void InitEv(void)
{
EvaRegs.ACTR.all = 0x0006; ///通过对比较方式控制寄存器的配置,得PWM2低有效,PWM1高有效,改变设置可使电机反转
EvaRegs.DBTCONA.all = 0x0530;///使能死区定时器,分频45/16=2.8125M,死区时间5*0.356us=1.78us
EvaRegs.COMCONA.all = 0xa600; ///比较器控制A
EvaRegs.T1PR =5000; ////定时器1周期值0.356us*N
EvaRegs.T1CMPR =2500; ///定时器1比较值,没什么用,没用这种方式
EvaRegs.T1CNT = 0; ///定时器1初值设为0
EvaRegs.T1CON.all = 0x144E; ///连续增模式,TPS系数45M/2/16,T1使能
/*
EvaRegs.T2PR = 5000; ////定时器2周期值0.356us*N
EvaRegs.T2CMPR =4000; ///定时器2比较值
EvaRegs.T2CNT = 0; ///定时器2初值设为0
EvaRegs.T2CON.all = 0x144E; ///连续增模式,TPS系数45M/2/16,T2使能
EvaRegs.GPTCONA.bit.TCOMPOE=1;
EvaRegs.GPTCONA.bit.T1PIN=1;
EvaRegs.GPTCONA.bit.T2PIN=2;
*/
EvaRegs.CMPR1=500;// 占空比越小,转得越快
//EvaRegs.CMPR2=2000;
//EvaRegs.CMPR3=3000;
}
第二部分 基于DSP的直流电动机的闭环调速的系统设计
2.1 硬件设计
2.1.1系统硬件设计总体框图
该设计包含DSP控制单元、功率驱动单元、检测单元、显示单元、通信单元五个部分。
DSP控制单元:对来自上位机的给定信号和来自传感器的反馈信号按一定的算法进行处理,输出相应的PWM波,经过光电隔离部分,送给功率驱动单元;
功率驱动单元:对来自DSP控制器的PWM信号进行功率放大后送给直流电动机的电枢两端,驱动电机与负载;
速度检测单元:采集电机的速度信息,并送给主控制器;
显示单元:将采集到的电机转速信息予以显示;
通信单元:负责主控制器与上位机及外设的信息交换。
2.1.2主电路
2.1.3驱动电路
本设计的功率驱动电路采用的是基于双极型H桥型脉宽调制方式(PWM)的集成电路L298N[14]。L298N是SGS公司的产品,内部包含二个H桥的高电压大电流桥式驱动器,接收标准TTL逻辑电平信号,可驱动46伏、2安培以下的电机,工作温度范围从零下25°到130°。表3-1是其使能引脚,输入引脚和输出引脚之间的逻辑关系。EnA是控制使能端,控制OUT1和OUT2之间电机的停转, IN1、IN2脚接入控制电平,控制OUT1和OUT2之间电机的转向。当使能端EnA为高,IN1为高电平IN2为低电平时,电机正转;反之电机则反转。当IN1和IN2电平相同时,电机停转。
表L298N功能逻辑表
图中的EnA(PWM)输入对应LF2407上的IOPA6引脚,IN1和IN2分别对应LF2407上的IOPF3和IOPF4引脚。接口电路如图3-3所示。图中二极管的作用是消除电机的反向电动势,保护电路,因此采用整流二极管比较合适。
需要注意的是,三个引脚信号都应通过光电隔离的变换后再作用于L298N,目的是为了防止因电机启动停止瞬间产生的尖峰脉冲对主控制器的影响。本设计中的光电隔离采用的是高速光耦6N137,信号经过6N137的隔离后不改变逻辑状态。
当电机要求正转时,IOPF3给出高电平信号,IOPF4给出低电平信号,此时IOPA6的逻辑信号就决定了电机正转的速度,也就是说DSP产生的PWM信号的占空比决定了电机两端电枢电压的大小,从而实现电机调速。
同样,当电机要求反转时,IOPF3给出低电平信号,IOPF4给出高电平信号。
L298N接口电路
2.1.4电流电压采样电路
2.1.5电动机转速检测电路
电机测速模型如图1-5.1,将栅格圆盘变化通过光电发射器和接收器以及外围转换电路的作用送给DSP通过数学运算得到电机的转速。
图1-5.1 电机测速模型
光电对管产生的脉冲在经过施密特触发器SN74LS14后送入LF2407的捕获单元,捕获单元可以记录在某个时间段内捕获到的脉冲数,从而计算出电机的转速。具体的接口电路如图1-5.2所示。
图1-5.2 速度检测电路
需要注意的是,光电对管出来的信号一般为+5V的方波信号,为此需要经过一个电平转换芯片SN74LVC245隔离才能与LF2407的CAP电路进行相连。电路如图1-5.3所示。
图1-5.4 电平转换电路
2.1.6控制电路
直流电动机转速n的表达式为:
(3-1)
公式(3-1)中,U为电枢端电压;I为电枢电流;R为电枢电路总电阻;Φ中为每极磁通量;K为电动机结构参数。
所以直流电动机的转速控制方法可分为两类:对励磁磁通进行控制的励磁控制法和对电枢电压进行控制的电枢控制法。其中励磁控制法在低速时受磁极饱和的限制,在高速时受换向火花和换向器结构强度的限制,并且励磁线圈电感较大,动态响应较差,所以这种控制方法用得很少。现在,大多数应用场合都使用电枢控制法。绝大多数直流电机采用开关驱动方式。开关驱动方式是使半导体功率器件工作在开关状态,通过脉宽调制PWM来控制电动机电枢电压,实现调速[2]。
PWM调速控制原理图和电压波形
图3-2是利用开关管对直流电动机进行PWM调速控制的原理图和输入输出电压波形。图中,当开关管MOSFET的栅极输入高电平时,开关管导通,直流电动机电枢绕组两端有电压。t1秒后,栅极输入变为低电平,开关管截止,电动机电枢两端电压为0。t2秒后,栅极输入重新变为高电平,开关管的动作重复前面的过程。这样,对应着输入的电平高低,直流电动机电枢绕组两端的电压波形如图中所示。电动机的电枢绕组两端的电压平均值为:
(3-2)
公式(3-2)中为占空比,=。占空比表示了在一个周期T里,开关管导通的时间与周期的比值。如,一个PWM的频率是1000Hz,那么它的时钟周期就是1ms,就是1000us,如果高电平出现的时间是200us,那么低电平的时间肯定是800us,那么占空比就是200:1000,也就是说PWM的占空比就是1:5。占空比的变化范围为0l。由此式可知,当电源电压不变的情况下,电枢的端电压的平均值取决于占空比的大小,改变值就可以改变端电压的平均值,从而达到调速的目的,这就是PWM调速原理。
2.1.7保护电路
为了实时地监控下位机的工作状态,本设计还建立了上位机与下位机通信的电路模块[1]。利用TMS320LF2407的串行通信接口与RS-232串行口进行DSP与PC机之间的异步通信。上位机PC都带有RS-232接口,所以可以利用上位机(PC)的串行口与下位机(DSP)进行通信,进行上位机与下位机之间的数据交换,有效的实现监控。由于上位机的RS-232C电平与下位机的TTL电平不一致,本设计中利用电平转换芯片MAX232进行串行通信,另外,由于本设计中的TMS320LF2407属于低功耗芯片,它采用+3.3V供电。所以在MAX232与TMS320LF2407之间也需进行电平转换。接口电路如下图所示。
通信单元接口电路
2.1.8显示电路
1602的V0口外接一个10K的电位器,用以调节液晶显示器的对比度,接正电源时对比度最弱,接地电源时对比度最高;RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器,与芯片的IOPA3口连接;R/W为读写信号线,高电平进行读操作,低电平进行写操作,与芯片的IOPA4口连接;E为使能端,下降沿使能,和芯片的IOPA5口连接。数据端和LF2407的IOPC口连接。具体电路连接如图3-9所示。
液晶显示接口电路
主程序主要完成系统和各子程序的初始化,并启动系统定时器,进入循环体,并定时进行按键中断扫描和调用显示子程序[16]。主程序流程图如图所示。
主程序流程图
第三部分 总结
3.1 实习心得
在为期一周的实习过程中,我学到了许多书本上学不到的知识,本以为十分枯燥的设计过程却让我得到了很多乐趣,同时也为我今后的进一步学习奠定了基础。
当老师布置完题目后,由于对需要掌握的知识还不是十分理解,于是我通过看教材和查资料等方式掌握了一些关于DSP的基本知识,经过几天的编程和调试,最终成功地完成了整个系统的设计。
在设计的过程中编程部分是个难点,编程的过程中我们遇到了很多的问题,比如说当我把之前设计出的基本模块整合在一起的时候,出现了很多错误,但是在经过细致的分析整个程序后,通过进一步的修正,程序才运行正常。这个问题也提醒我们在编程的时候需要细心和耐心,要具有整体设计的思想,考虑要周全,这样才不会出现一些因为马虎而出现的错误。
另外,本次实习没有像以往在实验课里那样单纯的在仿真软件上模拟,而是需要通过调试开发板,在具体的设备上完成整个设计的实现。在调试的过程中,不论是程序的设计,还是程序的下载,都给予我很多新的锻炼,在解决了一个个问题之后,使我更加相信了我的动手实践能力。经过这次的实际动手操作,让我明白不仅要充分的掌握课本上的知识,而且要活学活用、学以致用,不能过分强调基本理论的掌握,而应该侧重于基本知识和实际的相结合,我觉得,具有一定的系统分析能力和设计能力才是本次实习的目的。
本次实习使我把学到的理论知识和实际的硬件相结合,对DSP这门课程有了新的理解和认识,这对于我今后的学习会有事半功倍的效果。非常感谢本次实习给了我这样一个锻炼我的机会,在此也感谢老师对我的指导!
3.2 参考文献
《DSP原理与应用》 方华刚 机械工业出版社
《TMS320X281x DSP原理与应用(第2版) 》徐科军 北京航空航天大学出版社
《DSP技术及应用》黎步银 北京大学出版社
《电动机的DSP控制--TI公司DSP应用(第2版)》 王晓明 北京航空航天大学出版社