This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

C2000入门必备

Other Parts Discussed in Thread: CONTROLSUITE, TMS320F28335, CCSTUDIO

1、经常看到有网友发帖问相关DSP入门的问题,我们在这里针对C2000入门来总结一下:

(1)  在咨询C2000入门的同时,要想清楚自己感兴趣的方向,兴趣结合C2000系列才能快速入门,并且可以不断深入。举个例子,有些人对电力电子、运动控制等方向比较感兴趣,这就毫无疑问地选择C2000系列,C2000在控制领域的优越性加上个人的控制理论,最终电机的转动、闭环的实现都很有成就感。假如让一个只有信号处理功底的人去看C2000的事件管理器,理解起来可能更费劲些,因为他们缺少了H桥和光电编码器等方面的知识。

(2)  学习是一种投资,想要学习C2000还是建议买一块开发板吧,只有结合开发板做了练习和外设功能的实现,才能更深入的理解。C2000的开发板多种多样,如果资金紧张,可以考虑TI提供的一些板上集成下载器的EVM板,这样可以省去买仿真器的钱。当然如果有能力可以考虑自己画板,这样就可以熟悉C2000硬件功能和外设基本功能,控制器可以考虑向TI申请样片。

(3)  从个人经验来看,在大学选择学习C2000是最值得干的一件事,总体来说C2000的门槛比较高,只要你入门并深入学习了,其他各类单片机和控制器你会很快入门;同时对你的编程思想有很大的影响,你会考虑工程代码的整体结构框架(TI提供的头文件),习惯用结构体、联合体实现功能等。

(4)  一定要找对资源。C2000的各种资料在网络上有很多,但是找对可以快速带你入门的资料很重要,也可以选择一些视频,如TI提供的各种入门视频。

2、入门资源汇总:

(1)    开发板选择:

国内有很多开发板厂家,这里就不一一列出,大家可以根据需要选择;同时一些论坛会搞活动免费赠送开发板,比如21IC中国电子网经常有免费赠送开发板的活动,大家可以多多关注。TI商场提供了各种评估板可以选择(https://estore.ti.com/Basket.aspx )。

(2)    仿真器选择:

仿真器的选择很重要,一定要选择一款稳定性比较好的仿真器,速度可以根据自己的需求选择。经常有网友遇到连接失败,下载失败等问题,很大可能都是仿真器不稳定造成的,多次插拔或者重启电脑后可以正常连接,这种情况容易造成在固化flash的过程中突然停止,造成C2000控制器的损害。选择仿真器的时候一定要关注仿真器所能支持的CCS版本和控制器的型号。

(3)    CCS安装使用:

要正确的找到下载地址:http://processors.wiki.ti.com/index.php/Download_CCS,下载前肯定是需要注册的,也有很多人找到后下载不成功,具体下载步骤如下:

 

 

(4)    入门学习:

  • 关于入门学习给大家分享一些经典资料,资料可以带领我们入门学习,熟悉CCS使用和丰富的外设结构,并且有工程代码参考。

    (5)    目标板硬件问题排查:

    a、检查仿真器是否插好;
    b、检查CPU供电问题,1.8V,3.3V的供电是否正常;
    c、检查DSP引脚是否虚焊(一般先检查JTAG的那几个引脚);
    d、检查晶振是否起振;
    e、检查JTAG的那几个引脚电平是否正确,特别注意TCK是否有脉冲输出,以检测仿真器
       是否好坏;
    f、检查DSP上电是否正常复位(复位电平或者说是复位电路是否正常工作)、工作,可
    d、查看CLKOUT 引脚,看是否有脉冲输出。

    (6)    程序在线仿真工作正常,烧写后不执行问题总结:

    程序烧到Flash之后,请用不要断开仿真器,用Load Symbols将程序加载,然后运行,Flash在线调试,看看程序跑到什么地方了? 另外,程序中是否使用Delay_us()函数,此函数是否已经copy到Ram中执行。

    l  Stack的大小开的是否足够?

    l  看看程序是否进入了什么illegal ISR?

    请确认是否正确初始化FLASH waitstates,通过以下方法:

    MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);

    // Call Flash Initialization to setup flash waitstates

    // This function must reside in RAM

          InitFlash();

    //

    • ./*** Copy all FLASH sections that need to run from RAM (use memcpy() from RTS library) ***/

    // Section secureRamFuncs contains user defined code that runs from CSM secured RAM

    memcpy(        &secureRamFuncs_runstart,

    &secureRamFuncs_loadstart,

    &secureRamFuncs_loadend - &secureRamFuncs_loadstart);

    //copy from the flash to the ram  for change the registers of the flash,

    /*** Initialize the FLASH ***/

    InitFlash();

  • PWM模块原理及使用

    F280278PWM(四个模块),4HRPWM,特别对设计高精度电源提供了方便,每个PWM模块中又包括以下几个子模块:时基(Time-base)模块、计数比较(Counter-compare)模块、功能限定(Action-qualifier)模块、死区控制(Dead-band)模块、斩波(PWM-chopper)模块、事件触发(Event-trigger)模块、制动(Trip-zone)(不知道这样翻译恰当否)模块、数字比较(Digital Compare)模块。从这些模块的命名上看,用它来做个电源,是再恰当不过的了。
    一、时基子模块(TB
    每一个ePWM模块,都有自己的TB,它产生PWM的所有定时事件,且有同步逻辑,可以使多个PWM模块有序工作。
    TBPRDPWM的计数周期寄存器。
    TBPHS:相位控制寄存器,在多个PWM模块级联时,可以控制每路输出的相位。当时基模块的同步脉冲到来时,使计数器从TBPHS设置的值开始计数(丢弃当前计数值)。
    TBCTLTB的控制寄存器,可以对相位方向(只在up-down时有用)控制,决定是上计数时同步(PHSDIR=1)还是下计数时同步(PHSDIR=0);决定TB输入时钟的分频系数;向下一级输出的同步脉冲的输出方式;计数值重装方式、计数方式、同步允许等控制。
    TBCTR:计数寄存器。TB模块的当前计数值。
    TBSTSTB的状态寄存器。
    二、计数比较子模块(CC
    此模块实现与TB的比较及控制。产生CMPACMPB比较事件;控制PWM的占空比。
    CMPCTL:计数比较控制寄存器。决定是否使用影子寄存器及计数值的重装方法。
    CMPA:计数比较值设定寄存器A
    CMPAMCMPA的影子寄存器。
    CMPB:计数比较值设定寄存器B
    三、功能限定子模块(AQ
    这个子模块主要对TBCC模块产生的事件,作出相应的响应,如计数器到达设定同期时、到达0时、到达CMPA时、到达CMPB时,相应的EPWMxAEPWMxB的输出状态。
    AQCTLA:设定EPWMxA在以上事件时的输出
    AQCTLB:设定EPWMxB在以上事件时的输出
    四、死区控制子模块(DB
    在同步整流及桥式电机驱动时,上下臂的控制开关(晶体管或MOS管)的导通与关闭会出现一定的延时,这有可能导致上下臂开关的同时导能现象。DB子模块可以有效地防止这种现象的发生。
    DBCTLDB通用控制寄存器,主要产生死区控制的方法。
    DBRED:上升沿延时控制寄存器,产生延迟的周期数。
    DBFED:下降沿延时控制寄存器,产生延迟的周期数。
    五、PWM斩波模块(PC
    PWM的周期较长,用高频变压器作驱动器,就会达不到目的,并有可能烧坏器件。使用PC模块可以将PWM波经过“再调制”后的高频波作驱动就可以解决这个问题。
    PCCTLPC控制寄存器,实现“再调制”波的duty控制、“调制”频率控制等。
    六、制动子模块(TZ
    TZ模块是当系统出现问题,或者发出制动信号时,达到所期望的系统响应。F280273TZ外部信号输入,TZ信号可以连接到任意一个PWM模块。当制动条件产生后,它可以使EPWMxA EPWMxB产生:高电平输出、低电平输出、高阻输出、不动作。可以一次性(one-shot)或逐周期(cycle-by-cycle)控制。可以受DC子模块控制等
    TZSELTZ选择寄存器,用来选择TZ
    TZCTLTZ控制寄存器,用来EPWMxAEPWMxB的输出。
    TZEINTTZ中断允许寄存器。
    TZDCSEL:数字比较事件选择寄存器。
    七、事件触发子模块(ET
    它由TBCCDC子模块触发源输入,产生CPU中断及触发ADC SOCstart of converter),
    ETSEL:事件触发选择寄存器,选择触发源,SOC、中断允许控制,EPWMxSOCAEPWMxSOCB输出控制,
    ETPS:触发事件分频寄存器,控制由n次事件产生后引发中断或响应。
    ETFRC:强制触发寄存器。用于强制产生某一响应。
    从以上可见,模块相互的作用及产生事件并不用CPU干预,这是实时控制所需要的,因为这样可以尽快地作为响应。如PWM输出后的某一时间产生ADC转换,都是由模块自己协调的,CPU只用设置好相应的寄存器就可以了。
    八、程序示例
    EPWM1A EPWM1B输出互补PWM波,并并使用TZ1TZ2对它作制动控制。例程中还用timer1控制PWM的占空比以作演示。
    1InitEPwm1Gpio(),对IO口初始化
           ……
        GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1;   // Configure GPIO0 as EPWM1A
        GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1;   // Configure GPIO1 as EPWM1B
    2InitTzGpio(),TZ口初始化
           ……
       GpioCtrlRegs.GPAQSEL1.bit.GPIO12 = 3;  // Asynch input GPIO12 (TZ1)
       GpioCtrlRegs.GPAQSEL2.bit.GPIO16 = 3;  // Asynch input GPIO16 (TZ2)
    3PWM模块设置
        // Enable TZ1 and TZ2 as one shot trip sources
        EALLOW;
        EPwm1Regs.TZSEL.bit.OSHT1 = 1;
        EPwm1Regs.TZSEL.bit.OSHT2 = 1;
        // What do we want the TZ1 and TZ2 to do?
        EPwm1Regs.TZCTL.bit.TZA = TZ_FORCE_HI;
        EPwm1Regs.TZCTL.bit.TZB = TZ_FORCE_LO;
        // Enable TZ interrupt
        EPwm1Regs.TZEINT.bit.OST = 1;
        EDIS;
        EPwm1Regs.TBPRD = 6000;                         // Set timer period
        EPwm1Regs.TBPHS.half.TBPHS = 0x0000;          // Phase is 0
        EPwm1Regs.TBCTR = 0x0000;                       // Clear counter
        // Setup TBCLK
        EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;       // Count up
        EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;        // Disable phase loading
        EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW; //loaded from its shadow register
        EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;     // Clock ratio to SYSCLKOUT
        EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;
        EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;  // Load registers every ZERO
        EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
        EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
        EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
        // Setup compare
        EPwm1Regs.CMPA.half.CMPA = 3000;
        // Set actions
        EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;  //当计数值等于CMPA时,将PWM1A输出置高
        EPwm1Regs.AQCTLA.bit.PRD = AQ_CLEAR;
        EPwm1Regs.AQCTLB.bit.CAU = AQ_CLEAR;          // Set PWM1A on Zero
        EPwm1Regs.AQCTLB.bit.PRD = AQ_SET;
        // 触发ADC SOC
        //EPwm1Regs.ETSEL.bit.SOCAEN = 1;
    ……
    4 ConfigCpuTimer(&CpuTimer1, 60, 1000);//设置Timer1
    5Timer1中断:
    interrupt void INT13_ISR(void)     // INT13 or CPU-Timer1
    {
       GpioDataRegs.GPATOGGLE.bit.GPIO3 = 1;
       EPwm1Regs.CMPA.half.CMPA++;
       if ( EPwm1Regs.CMPA.half.CMPA > 5999 )
          EPwm1Regs.CMPA.half.CMPA =1;
       //PieCtrlRegs.PIEACK.all |= ;
    }
    九、编译运行
    发现,接在EPWM1A EPWM1B的两个LED由暗至亮交替。

  • F28XX系列FLASH搬移到RAM里运行实现方法

    http://www.deyisupport.com/question_answer/microcontrollers/c2000/f/56/t/104838.aspx