CCS入门学习(自用)

目录

一、入门介绍

二、资料处理

三、安装CCS+新建工程

四、CCS中调试文件

五、 存储器映像及CMD文件

六、中断地址

七、时钟和系统控制

八、通用输入输出引脚GPIO

九、写个GPIO程序控制LED

十、CPU定时器

十一、结合CPU定时器和GPIO实现跑马灯

十二、PWM基础知识和EPWM概述

十三、TB和CC

十四、AQ和DB

十五、PC和TZ

十六、事件触发子模块

十七、ADC



一、入门介绍

32位微控制器

有丰富外设:AD(采样)、PWM(脉宽调制,输出脉冲方波)、ECAP(捕获脉冲信号)、EQEP(正交编码器的解码单元)、SCI(串行通信接口RE232\RS484\RS422)、SPI(串行外设接口)、ECAN()、CPU定时器()、完善的中断机制

C82x处理器---使得c2000优于普通MCU:4个集成式高速片上硬件加速器,同时具有MCU和DSP两种功能

(浮点加速器、复数数学和CRC单元(VCU)加速器、三角数学单元(TMU)加速器、控制速率加速器(CLA))

C2000应用:数字电源、电机驱动、电力电子新能源、电力系统、工业自动化、汽车电子。(高性能)

分类(性能/成本):piccolo(入门级)、delfino(高性能和扩展)

C200处理器芯片:

TMS:ti公司合格产品

320:TI DSP系列

F:Flash Eeprom(核电压1.8V/1.9V I/O口电压3.3V)

28:芯片型号

P:芯片封装信息4

65X:温度范围

开发c200所需软硬件:

       软件:code composor studio(CCS)写软件

       硬件:C2000电路板LauchedPad 运行

       仿真器:JTAG连接开发板、USB连接软件

二、资料处理

手段:书、芯片手册

了解:处理器性能、外设、引脚

通用学习:系统控制部分systemcontrol, 存储器、映像、CMD、中断系统、CCS程序架构

方法:跑例程+写项目

竞赛:电子竞赛

建议:多看多学多交流

获取资料软件

ControlSUITE:TI资料库

获取方式:TII官网(注册账号)—搜索框“controlsuite“ –download ---- 打开软件—查看

三、安装CCS+新建工程

安装:TI 官网 ---- TOOLS AND SOFTWARE---- code composer studio-IDE ---- get CODE COMPOSER STUDIO ---- download the lasted version ---- 离线安装包windows ---- 下载完成后setup.exe ---- 退出杀毒软件提醒,选YES ---- accept条款 ---- 安装路径(不能含有中文字符) ---- 处理器勾选“C200 32-bit real-time MCUs“ ---- 仿真器驱动支持包(默认)---- app center不选 ---- finish ---- 创建快捷方式。

第一次点开ccs需要建立工作空间路径—D:/myccs ---- lauch

新建工程:工具栏“Project“ ---- new ccs project ---- target”选择芯片型号(TMS320F28P650DK9)”, connection”选择仿真器(Texas Instruments XDS110 USB Debug Probe)“, project name “输入名字”, compiler version”TI v22.6.1.LTS”, project templates and examples”empty project(with main.c)” ---- finish

备注: .cmd是存储器映像文件

Targetconfigs--.ccxml文件里包含芯片信息

编译文件: 右键单击工程文件 ---- build project ---- 变异成功后debug文件夹会出现一个与工程名一样的.out的可执行文件----/工具栏“小虫子“快捷键

四、CCS中调试文件

将完整文件导入到ccs; 工具栏“project“ ---- import ccs projects ---- browse”选择文件” ---- finish

烧录工程文件导DSP开发板中:右键工程文件—degub as ---- 1 code composer debug section----/工具栏“小虫子“快捷键 ----

运行:resume快捷键

暂停:suspend快捷键

停止:terminate快捷键,重新开始的话需要重新烧录文件

设置断点:debug界面,双击行数。取消也是双击。

查看实时变量:选中变量,右键“add watch expression“。右上角”continuous refresh“实时更新数据,数据产生变化时背景位黄色。改变数据格式:选中数据,右键number format。改变变量观测顺序:直接拖动改变位置。

查看运行时间:设置断点----运行----工具栏“Run“----clock----enable----屏幕右下角出现一个”时钟图标“----再次运行----停止时查看右下角数据:显示”时钟周期数“----计算运行时间=周期数*1/f(中断程序运行时间不能超过中断时间)

曲线观测变量:原理:把观测变量放到数组里面,通过点画曲线。tools----graph----single time ----acquisition buffer size设置为该变量数组大小。Dsp data type设置为该变量类型。Index increment增量设置为1. Qvalue=0. Sampling rateHz = 1. Start address设置为数组名字。Display data size设置为数组大小----OK。设置持续更新。

五、 存储器映像及CMD文件

存储器分类:RAM掉电丢失数据,程序运行速度快;Flash掉电不丢失数据,程序运行速度比ram慢。一般将程序固化到Flash中,运行时由cpu copy到RAM中运行。

存储器映像:memory map每个存储单元都有一个固定地址。

(地址看作门牌号,数据看作快递,cpu看作快递员)

Cmd文件:规定了数据和代码具体的固定存储规格(地图)。

       Sections代码:将数据段/代码段存储到存储器空间。

如何将数据存储到指定空间?

例如:将数组x[100]储存到外扩RAM(起始地址0x100000)中?

主函数中:

Float x[100]; //定义一个数组

#pragma DATA_SECTION(数组名, “数据段名”); //定义一个数据段

Cmd文件中:

地址名: origin = 0x100000, length = 0x004000 //地址长度不能超过存储器本身的长度,也不能低于数组长度。先设置为1K大小。

在sections段:.数据段名 :>地址名, PAGE = 1

六、中断地址

什么是中断interrupt?

假设你写代码叫做程序,这个时候老板打电话过来,因为老板的电话比现在写代码更重要,所以要接电话,接电话就叫中断。

顺序执行

初始化—循环—中断

Cpu中断、PIE中断、外设中断

中断事件

电源

外设:cpu定时器\EPWM\ADC\ECAP\EQIEP\SCI\SPI\CAN. 根据中断可分为软件中断(程序内通过指令中断)、硬件中断(处理器的硬件中断,外设就属于硬件中断)。可屏蔽中断(通过寄存器控制允许/不允许中断产生)/不可屏蔽中断(cpu无条件响应中断)。

中断优先级(多个中断同时向cpu发出请求)

每个外设中断都会在寄存器都会有对应的标志位(表示中断事件是否发生)和使能位(表示中断是否被使能,是否向cpu请求中断)。

定时器0(TINT0)

PIE中断:外设中断的管理系统。组序号和组内序号,都是序号小优先级高。三个寄存器:PIEIFRx标志位,PIEIERx使能位,PIEACKx应答位(cpu是否正在响应cpu中断,不用时应该清零)。

CPU的寄存器:IFR(标志位),IER(使能位),EINT(使能全局中断),EDIS(禁止所有中断)

C2000的三级中断系统:外设级----PIE级----CPU级

七、时钟和系统控制

外部时钟源-晶振:无源(工作时无外接电压,有负载电容)/有源(工作时有外接电压Vcc,),封装(直插/贴片)

晶振频率Hz:20M/12.5M/30M/50M(32.768)

外部晶振---振荡器OSC---锁相环PLL(倍频)---形成clk信号给cpu

主频(频率越高,性能越好):  F28335:30M—150M 

C28346:20M—300M   

F833TD:200M/核

CLKN(主频SYSCLKOUT)通过LOSPCP(低俗外设时钟寄存器)降低频率后变成LSPCLK(低速时钟)供给对于时钟要求不高的外设,或者通过HISPCP(高速外设时钟寄存器)提高频率后变成LSPCLK(高速时钟)

外设

所用时钟源

ADC

HSPCLK

eCAN

SYSCLKOUT/2

eCAP

SYSCLKOUT

ePWM

SYSCLKOUT

eQEP

SYSCLKOUT

I2C

SYSCLKOUT

MCBSP

LSPCLK

SCI

LSPCLK

SPI

LSPCLK

Table 7.1 28335的时钟

ADC:采样率

通信:波特率

外设时钟需要寄存器使能才能使用。

低功耗:只使能工作所需时钟,降低寄存器功耗。

八、通用输入输出引脚GPIO

GPIO: general purpose input output

引脚复用:为了节省资源,既可以作为I/O,也可以作为功能引脚。通过寄存器决定引脚种类。

以28335为例

LQFP.176引脚: 电源类、AD引脚、系统相关(JTAG\GPIO)

GPIO引脚特点:

输入口电平,与TTL电平兼容

       >20V,认为是高电平

       <1.2V, 认为是低电平

输出       3.3V高电平 0V低电平 CMOS电平 驱动能力4mA

EALLOW保护语句:开始写

… //语句

…//语句

…//语句

EDIS:结束语

GPIO寄存器:

控制寄存器:GPxMUX选择       GPxDIR方向  GPxPUD上拉        GPxQsel输入限定选择

数据寄存器:GPxDAT数据 GPxSET置位  GPxCLEAR清除     GPxTOGGLE翻转

外部中断源

低功耗模式唤醒选择寄存器

GPxMUX功能选择:每两位作为一个选择口

GPxDIR方向:每位都决定引脚方向 0输入 1输出

GPxPUD上拉: 默认有一个上拉电阻,从不定态上拉至固定态。上电时。默认上拉是禁止的,而其他上拉复位后默认是使能的。0开启 1禁止

GPxQsel输入限定选择:作为输入时,采样。DSP连续采样来判定电平高低。连续n次全部相同电平才能判定电平(优点:滤波,提高稳定性)。

GPxDAT数据 :0低  1高

GPxSET置位:只能作为输出 0无效 1高电平置位

GPxCLEAR清除:只能作为输出 0无效 1高电平清除

GPxTOGGLE翻转:只能作为输出 0无效 1高电平翻转

九、写个GPIO程序控制LED

目的:用GPIO控制28335上面的“RUN”灯,周期性闪烁

DSP是串行执行处理器

步骤:

  1. 新建工程: 工具栏project----new CCS project----target选择芯片型号、connections选择仿真器、project name工程名字、路径workspace、project templates and examples选择empty----finish。
  2. Workspace路径下:准备cmd文件、include文件(28335头文件,通常不需要更改)。建立source文件夹:所有c语言文件放这。
  3. 回到ccs,打开main.c,头文件已经准备好。
  4. 检查GPIO时钟是否使能确保外设正常工作。F3快捷键—快速定位函数。
  5. EALLOW { GPAMUX对应引脚设置为普通I/O口。GPADIR设置为1输出引脚。} EDIS
  6. DINT;   //禁止CPU所有中断
  7. InitPieCtrl();    //初始化所有PIC控制系统寄存器
  8. IER=0x0000;    //禁止所有cpu中断,
  9. IFR=ox0000;    //清除所有标志位
  10. InitPieTable(); //
  11. EINT;       //全局中断使能
  12. 可以加一个空的for循环使得程序不会结束。For循环里写对应RUN灯引脚点亮,插入延时DELAY_US();灯灭;延时。
  13. 编译 build project
  14. 烧录: 在targetConfigs文件夹里打开.ccxml文件,点击Test Connection检查软件是否和仿真器连接,测试成功显示succeeded。

Debug as等待烧录完成后,点击运行resume,板子的led显示灯会闪烁(如果有这个功能),

十、CPU定时器

28335里面有3个定时器

4个输入:reset、 timer reload、sysclkout、TCR.4(定时器启动)

一个输出:!TINT

XH:X           XH代表寄存器的高位 后一个X代表寄存器低位

工作原理:

PRD定时器装载到TIM计数器里,每隔一个TIMCLK信号的TIM计数器会-1直到0后生一个TINT信号输出。TIMCLK信号由TDDR分频器装载到PSC预定标计数器内每隔一个SYSCLKOUT系统时钟信号-1直到0输出。

分频器TDR,周期寄存器PRD,这两个值固定的情况下cpu完成一个周期的计数需要多少时间(换言之,周期是多少)?

Time=(1+PRD)*TIMCLK  单位:s秒

TIMCLK=(1+TDR)*SYSCLKOUT

Cpu定时器周期中断:0优先级高

十一、结合CPU定时器和GPIO实现跑马灯

跑马灯原理:LED按照顺序从前往后逐个点亮熄灭,又从后往前,循环。

每个灯点亮时间要保证肉眼可见:加入延时

状态切换保持时间:加入延时

电路板共阳极3.3V,接二极管,电阻,接阴极接GPIO。当GPIO为低电平时,二极管导通,灯亮。

在timer.c内写程序:

头文件

InitSysCtrl();                 //初始化

InitGpio();                    //初始化GPIO,MUX=0功能为IO口,DIR=1 io口作为输出

InitCpuTimer();             //初始化CPU定时器

DINT;                           //禁止所有中断

InitPieCtrl();                 //初始化PIE中断

IER= 0x0000;             //禁止cpu中断

IFR=0x0000;                 //清除cpu中断标志位

InitPieVectTable();        //初始化PIE中断向量表

EALLOW;                     //

PieVectTable.TINT0 = &ISRTimer0;   

//指定TINT0的入口函数,也可以使用系统默认的中断函数

EDIS;                           //

IER |= M_INT1;             //使能CPU中断1。M_INT1=0x0001,IER或上M_INT1后为1,使能

PieCtrlRegs.PIEIER1.BIT.INTx7 = 1;      //使能PIE中断7

EINT;                           //使能全局中断

ERTM;                          //使能全局实时中断DBGM

ConfigCpuTimer(&CpuTimer0,150,1000000);         

//配置cpu定时器,使用定时器0,时钟频率MHz,定时时长us

StartTimer();                //启动定时器



for( ; ;)    //写跑马灯

在defaultIsr里定义跑马灯任务函数

十二、PWM基础知识和EPWM概述

PWM:pulse width modulation 脉宽调制:可以调节宽度的方波

作用:驱动各种开关器件,例如IGBT

常用参数:

频率f:

周期T(频率倒数)

幅值(低电平到高电平的电压差)

占空比D=高电平的时间H/T

相位

死区时间

操作:频率f通常是固定的,通过调节占空比D实现PWM功能

互补PWM

PWM1和PWM2是完全对称互补的方波,

但实际上,由于器件的开关特性,并不会准时的开通或关断,这就可能导致了电路短路。

解决方法:一个完全关闭以后,另一个延时再开通,这个延时称作死区时间Deadtime。

三相

三个PWM错开一定的角度,称作相位Phase。

以28335为例,有6个EPWM模块,内部结构完全一样,功能也完全一样

每一个EPWM有7个子模块:TB时间基准、CC比较器、AQ动作限定、DB死区时间限定、PC斩波、ET事件触发中断、TZ故障捕获。

(斩波:一个T里面变成多个的高频T)

(TZ:如果电路发生故障,马上封锁EPWM模块,起到保护电路作用)

一个EPWM模块可以输出两个EPWMA+EPWMB,即可以独立输出也可以互补输出。

十三、TB和CC

Time Base时间基准

Counter Compator比较功能

EPWM生成PWM:

方法:载波(三角波)、调制波。载波频率通常是调制波的整数倍。载波和调制波的交点处电平跳变产生PWM波形。

SPWM:三角载波同正弦调制波。

TB:

作用:产生同步信号;计数;

同步用处:例如同时使用多个EPWM模块,需要同步

计数:计数寄存器、周期寄存器

CC:

工作(增减计数)在三角载波中,计数寄存器CTR与比较寄存器作对比。一旦CTR=CMP,触发比较事件(事件也有可能是CTR=0或者CTR=PRD,根据情况设置),PWM发生电平跳转。

PRD寄存器决定了PWM的周期/频率

CMP寄存器决定了PWM的占空比

计数器和周期的关系:

增/减计数器生成PWM的周期=PRD+1

增减计数器生成PWM的周期=PRD*2

EPWM模块有两个输出EPWMA和EPWMB分别需要对应两个比较寄存器CMPA和CMPB。

TB计数时钟TBCLK,由SYSCLKOUT分频而来:

受两位控制,HSPCLKDIV,CLKDIV。对于HSPCLKDIV功能位是x,当x=0时,分频系数是1。x不等于0时,分频系数是2x。当x=0时,TBCLK的频率=SYSCLKOUT/2^Y。当x不等于0时,TBCLK的频率=SYSCLKOUT/(2x * 2^Y)。对于CLKDIV功能位是y,当y=0时,分频系数是2^y。

EPWM的周期=PRD的周期/TBCLK的周期。

EPWM的同步链条:

同步输入信号EPWM1SYNCI来自于外部输入GPIO,输出可以给到epwm2或者4。3从2获得,6从5,5从4。 同步功能可以使用也可以忽略。

十四、AQ和DB

AQ的作用:设定这两个引脚在不同计数器事件发生的时候,引脚电平如何变化来产生PWM波形。

可能触发的6个事件:CTR=PRD;  CTR=0;  CTR=CMPA;  CTR=CMPB;  CTR_Dir=0/1;

CTR_Dir表明是增或者是减计数器。

事件可能的4个结果:无变化;  高电平;  低电平;  电平翻转;

DB作用:避免短路,尤其在大功率电路中

图:DB内部结构

DBCTL死区控制寄存器

功能位IN_MODE:有00,01,10,11分别代表S4,S5开关的选择

极性位POLSEL:选择开关S2,S3是否取反

OUT_MODE::选择开关S1,S0的输出

图:典型的死区方案(具有死区互补输出的两路PWM信号)

DBRED死区上升沿寄存器:作用是延时; 时间=DBRED*TBCLK

DBFED死区下降沿寄存器:作用是延时; 时间=DBFED*TBCLK

十五、PC和TZ

PC PWM Chopper斩波:通过高频载波信号对由AQ/BD输出的PWM波形调制。

应用:控制高开关频率的功率器件。

可以选择通过PC,也可以不经过PC直通输出。

PCCLK=SYSCLKOUT/8

只有一个控制寄存器PCCTL,通过赋值CHPFREQ(取值范围0~7)和CHPDUTY(取值范围0~6)得到:   

PC的频率=SYSCLKOUT/8(CHPFREQ+1)

占空比D=(1+CHPDUTY)/8

将原来的PWM波形与高频调制信号PSCLK做逻辑与生成斩波。每个周期内的第一个载波脉冲one shot宽度可编程(加宽),目的:使得第一个周期的脉冲携带较大的能量,功率器件能可靠的开通。首次脉冲宽度可以通过PCCTL[OSHTWTH]来设置,取值范围0~15.

首个脉冲宽度Tfirst_pulse=Tsysclkout *8* (1+OSHTWTH)

OSHT信号和斩波信号做或与XOR运算得到首脉冲调制的斩波信号。

TZ trip zone故障捕获

6个输入引脚,外部信号可以通过这几个引脚模拟外部故障或其他事件,从而EPWM模块可以对此发出响应(比如将所有PWM信号置为低电平),起到保护作用。

输入可以配置成两种触发方式:

单次触发one shot trip:一旦触发,会根据TZCTL寄存器设定的情况强制输出EPWM且保持不变,直到人为清除故障信息并复位EPWM。

周期性触发cycle-by-cycle trip:以TBCLK计数周期为单位,在每个周期内,如果捕获到故障信号,EPWM的输出立即强制等于TZCTL设定的状态。当TBCLK计数到0且故障不存在时,EPWM的强制状态清除。

十六、事件触发子模块

CTR:时间基准子模块里的计数器寄存器

CTR_DIR:决定增计数/减计数

EPWMxINT:中断请求信号,请求PIE

SOCA/B:启动转换的信号。启动AD外设(可以通过软件启动,或者外设启动)。

产生ADC启动信号ADCSOC

ETSEL选择事件触发方式,当SOCACNT计数器计数到足够次数的事件后,产生脉冲信号并且ETFLG标志信号生成,输出SOCA启动信号。与EPWM信号不同的是,不管FLG信号是否挂起,只要SOCACNT计数到次数后就会产生脉冲信号。

十七、ADC

定义:将物理信号转换成数字信号的处理器。

指标:

精度:位数越高精度越高价格越高

信号范围:引脚接收电压信号的范围 0-3V? 正负3V?

转换时间:

       采样率:每秒钟采样次数 AD7606最高采样率能达到200kps

EPWM模块代码学习(基于TMS320F28335

  1. EALLOW、EDIS都是什么意思?为什么总感觉它们成对出现在代码中?

答:EALLOW(Edit allow)一般和 EDIS(Edit disable)配套使用。F28335中有一些配置寄存器是受保护的,无法直接操作。在对这些寄存器进行修改之前,需要先取电保护功能。EALLOW指令用于允许对寄存器进行操作,即解除寄存器保护功能。在操作之后,用EDIS指令恢复寄存器的被保护状态。

//代码/

EALLOW;    //(Edit  ALLOW),允许操作被保护的寄存器

EDIS;           //(Edit  disable), 禁止操作被保护的寄存器 | 开起写保护

//代码/

  1. Shadow影子寄存器

怎么理解它,不太恰当的比喻:古代皇帝阅读奏折,最底层九品芝麻官的奏折无法直接递上来给皇帝看的,大部分情况下,都是由丞相审理出来,先过一道手,再交给皇帝。Shadow跟这个有点类似,你不是要给我写东西吗?你先把数据先放到影子寄存器,到某一个时刻,我再从影子寄存器里面取走,拿到我真的用的地方去。那么好处是什么?在环路控制的时候,如果说环路输出值计算完了以后,要往这个寄存器里面装载,刚好这个周期,还没完,如果这时候你让它立即生效的话,就可能会导致环路震荡,你本周期正在执行的,应该是上周期计算出来的理论值,结果你把上一个周期计算的理论值打破了。也就是Shadow寄存器的好处是当我本周期结束的时候,才把计算出来的东西放在下个周期来用,这样来讲要稳定一些。

对于这个计数器,我们重点需要设置的点包括:

1 分频系数: 关系到计数步长,宏观上影响占空比/周期的最小刻度

2 计数方式: Up、Down、Up-Down,前面章节已经介绍过;

3 周期值: 直接影响开关频率

4 同步输入:直接影响周期/占空比

5 同步输出:影响其他 ePWM 模块

6 周期生效方式:在 PFM 场景下,影响环路的控制方式,(上面讲的影子寄存器相关)

  • 16
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值