目录
一、入门介绍
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是串行执行处理器
步骤:
- 新建工程: 工具栏project----new CCS project----target选择芯片型号、connections选择仿真器、project name工程名字、路径workspace、project templates and examples选择empty----finish。
- Workspace路径下:准备cmd文件、include文件(28335头文件,通常不需要更改)。建立source文件夹:所有c语言文件放这。
- 回到ccs,打开main.c,头文件已经准备好。
- 检查GPIO时钟是否使能确保外设正常工作。F3快捷键—快速定位函数。
- EALLOW { GPAMUX对应引脚设置为普通I/O口。GPADIR设置为1输出引脚。} EDIS
- DINT; //禁止CPU所有中断
- InitPieCtrl(); //初始化所有PIC控制系统寄存器
- IER=0x0000; //禁止所有cpu中断,
- IFR=ox0000; //清除所有标志位
- InitPieTable(); //
- EINT; //全局中断使能
- 可以加一个空的for循环使得程序不会结束。For循环里写对应RUN灯引脚点亮,插入延时DELAY_US();灯灭;延时。
- 编译 build project
- 烧录: 在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)
- EALLOW、EDIS都是什么意思?为什么总感觉它们成对出现在代码中?
答:EALLOW(Edit allow)一般和 EDIS(Edit disable)配套使用。F28335中有一些配置寄存器是受保护的,无法直接操作。在对这些寄存器进行修改之前,需要先取电保护功能。EALLOW指令用于允许对寄存器进行操作,即解除寄存器保护功能。在操作之后,用EDIS指令恢复寄存器的被保护状态。
//代码/
EALLOW; //(Edit ALLOW),允许操作被保护的寄存器
EDIS; //(Edit disable), 禁止操作被保护的寄存器 | 开起写保护
//代码/
- Shadow影子寄存器
怎么理解它,不太恰当的比喻:古代皇帝阅读奏折,最底层九品芝麻官的奏折无法直接递上来给皇帝看的,大部分情况下,都是由丞相审理出来,先过一道手,再交给皇帝。Shadow跟这个有点类似,你不是要给我写东西吗?你先把数据先放到影子寄存器,到某一个时刻,我再从影子寄存器里面取走,拿到我真的用的地方去。那么好处是什么?在环路控制的时候,如果说环路输出值计算完了以后,要往这个寄存器里面装载,刚好这个周期,还没完,如果这时候你让它立即生效的话,就可能会导致环路震荡,你本周期正在执行的,应该是上周期计算出来的理论值,结果你把上一个周期计算的理论值打破了。也就是Shadow寄存器的好处是当我本周期结束的时候,才把计算出来的东西放在下个周期来用,这样来讲要稳定一些。
对于这个计数器,我们重点需要设置的点包括:
1 分频系数: 关系到计数步长,宏观上影响占空比/周期的最小刻度
2 计数方式: Up、Down、Up-Down,前面章节已经介绍过;
3 周期值: 直接影响开关频率
4 同步输入:直接影响周期/占空比
5 同步输出:影响其他 ePWM 模块
6 周期生效方式:在 PFM 场景下,影响环路的控制方式,(上面讲的影子寄存器相关)