DSP实习报告

时间:2024.4.30

 课程设计(实习)报告

课题名称:     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版)》 王晓明 北京航空航天大学出版社

更多相关推荐:
实习报告心得体会范文

【实习心得体会范文】(六篇)[1]总之,这次实习是有收获的,自己也有许多心得体会。首先,感受颇深的一点是,理论学习是业务实战的基础,但实际工作与理论的阐述又是多么的不同,在工作的闲暇之间,在同一些工作多年的会计…

万能实习报告

实习报告第一次参加实习,我明白中学生实习是引导我们学生走出校门,走向社会,接触社会,了解社会,投身到社会的良好形式;是培养锻炼才干的好渠道;是提升思想,修身养性,树立服务社会的思想的有效途径。通过参加实习,有助…

实习报告总结

有一名话叫做:不经过风雨,怎么见彩虹?我想改一下:不真正进入社会,怎能了解社会呢?在这次实习中,给我收获最大的是我觉得很多工作需要我去摸索和探讨,要不怕吃苦,勇于激流勇进,有的工作虽然单挑又重复,但这是磨练意志…

5000字实习报告

实习报告我是一名商务英语专业的学生在即将面临毕业的这半年里听从学校的安排开始寻找一个合适的工作单位实习到目前为止我的实习工作算是告一段落了差不多两个月的时间里确实也是学到了挺多的东西这些东西我相信在我以后的工作...

公司实习报告

实习总结报告实习性质:专业实习实习单位:院、系名称:班级:学生姓名:学号成绩:20xx年x月实习是大学学习中的一个关键环节,是我们走向社会的纽带和桥梁,是我们由学生角色向工作者角色转换的转折点。实习中,我学到了…

实习报告

陆水电厂实习项目陆水水力发电厂作为举世闻名的三峡水利枢纽的试验电厂在中国水利水电建设史上曾留下了辉煌的一页19xx年12月26日电站第一台8800千瓦机组发电19xx年4月正式并入湖北电网机组容量相同的其它三台...

社区实习报告

摘要作为居民代言人我们不仅要充分发挥党支部的战斗堡垒作用更要千方百计调动支部每一位成员的积极性和主动性让他们为社区居民服好务一直以来民一社区坚持对社区管理体制进行创新改革推出了各项亲民为民举措围绕内强素质提效能...

实习报告

实习报告许宜文企管120120xx05910524这是第二次参加实习了实习是引导我们学生走出校门走向社会接触社会了解社会投身到社会的良好形式是培养锻炼才干的好渠道是提升思想修身养性树立服务社会的思想的有效途径通...

实习报告

前言随着社会的快速发展用人单位对大学生的要求越来越高对于即将毕业的电气信息工程专业在校生而言为了能更好的适应严峻的就业形势毕业后能够尽快的融入到社会同时能够为自己步入社会打下坚实的基础毕业实习是必不设计制造及其...

实习报告

专科毕业实习报告学习中心函授站专业姓名学号实习单位实习岗位实习时间远程与继续教育学院201X年月日北京交通大学实习报告成绩评议表北京交通大学实习单位评议表目录11级标题4112级标题4122级标题421级标题错...

实习报告

广西工学院鹿山学院实习报告实习课程名称参观实习报告实习单位柳化柳州华力花红药业桂柳化工实习时间20xx年4月24日至20xx年4月27日指导教师班级化工111姓名学号20xx0633成绩评定指导教师签字20xx...

实习报告

在集团有限公司的实习报告20xx年1月4月我在集团有限公司进行了为期4个月的实习期间主要负责办公室内勤会议纪要人员招聘档案管理和工伤保险的申报等工作通过这次实习使我快速的接触社会融入社会也为我在毕业后进入职场做...

实习报告(49篇)