第5章
CHAPTER 5


基 础 应 用









本章主要介绍智能平衡移动机器人TMS320F28069片内外设的使用,了解片内外设的基本原理,并结合MATLAB/Simulink实现TMS320F28069单片机外设的模型搭建实验环境及自动代码生成。
5.1GPIO
TMS320F28069有54个GPIO,对应芯片输出的54个引脚。这些引脚分为A、B两组: A组包括GPIO0~GPIO31,B组包括GPIO32~GPIO58,其中B组的引脚中不含GPIO45~GPIO49引脚。每个引脚都有自己的复用功能,可以根据使用手册进行配置。
GPIO在当作通用I/O口使用的时候,可以通过GPxDIR配置I/O口的方向(1为输出,0为输入)。GPxMUXn用于配置GPIOn的复用功能,GPxPUD用于配置I/O口的上拉功能(0为使能上拉),也可以使用量化寄存器GPxQSEL对输入信号进行量化限制,从而消除数字量I/O引脚的噪声干扰。
此外,还有4种方式可对GPIO引脚进行读写操作: 可以通过GPxDAT寄存器独立读/写I/O口信号; 使用GPxSET寄存器写1对I/O口进行置位操作; 使用GPxCLEAR寄存器写1对I/O口进行清零操作; 使用GPxTOOGLE寄存器写1对I/O口进行电平翻转操作。需要注意的是,以上操作写0时均无效。


视频讲解



5.1.1GPIO_OUTPUT控制LED灯
作为第一个应用案例,以“点亮一个LED灯”开始。硬件上的蓝色LED灯对应的引脚为GPIO31,与红色LED灯对应的引脚为GPIO25,如图5.1所示。由于这两个LED灯都是共阴连接方式,当GPIO为高电平(置1)时,则LED灯被点亮; 当GPIO为低电平(置0)的时候,则LED灯熄灭。首先对整个模型进行配置此处基本配置适用于所有模型,后续实验模型的基本配置都可参考本节设置。。
打开Simulink的模型在Simulation工具栏下打开模型配置参数(Model Configuration Pararmeters)界面或者直接单击工具,如图5.2所示。


图5.1LED灯引脚连接图




图5.2模型参数配置



首先配置Solver选项卡,如图5.3所示,设置Stop Time为inf。Solver selection为定步长离散解算器,也就是Type选择Fixedtep,并选择discrete(no continuous states)。定步长设置根据实际情况确定,默认为auto,单位为秒,此定步长相当于定时器0的中断时间间隔。


图5.3解算器配置


在配置过程中需要注意的是,解算器类型必须选择固定点解算器。固定点Solver中提供了多种算法,此模型由于没有连续状态,所以可以选择discrete方法。步长默认为auto,在简单的通用嵌入式代码生成过程中此参数没有实际作用,可以采用默认或设置0.005s。而在针对目标芯片定制的代码生成过程中,硬件驱动工具箱往往会将步长step size作为其外设或内核中定时器的中断周期,使得生成的算法代码在硬件芯片中以同样的时间间隔执行。由于解算器步长为整个模型提供了一个基础采样频率,故被称为基采样率(baserate)。
在Diagonostics选项卡的Data Validity选项中,将Multitask data store配置为none。
在Hardware Implementation中选择Hardware board为TI Piccolo F2806x或者TI Piccolo F2806x(boot from flash),前者为将程序烧写到RAM中,适合调试,程序在芯片掉电后丢失; 后者为将程序烧写到Flash中,适合运用到实际应用中,掉电后不丢失,提供的示例模型选择为后者。这时Simulink会在Device type中自动选定TI C2000系列。然后配置该界面下Build action为Build,load and run(默认)。Device Name为F28069。选中Use custom linker command file复选框,如图5.4所示。然后在Clocking选项中,外部晶振默认为10MHz,将系统时钟配置最高为90MHz,LSPCLK低速时钟外设设置为SYSCLKOUT/4分频,如图5.5所示。其他外设模块按自己需要配置。


图5.4硬件配置





图5.5时钟配置



在Code Generation选项卡中使用的Toolchain为Texas Instruments Code Composer(C2000)。在Code generation objectives的Prioritized objectives中将执行效率、ROM效率、RAM效率设置为优先的代码生成目标,如图5.6所示。在Report中选中Generate model Web view复选框,使生成的代码可以进行模型与代码之间相互的跟踪,如图5.7所示。


图5.6自动代码生成配置





图5.7自动代码生成报告



以上便完成了一个模型最基本的配置。
在Simulink界面上,搭建点亮一个LED灯的模型,系统步长为0.005s,Counter Limited设置Upper limit为400,Compare To Constant设置Constant value为200,将GPIOx选择为GPIO31,如图5.8所示,LED流水灯模型如图5.9所示。
整个控制效果为: 当计数值大于或等于200时,也就是大概有0.005×200=1sGPIO31是置1的,另外1s是置0的。这样便实现了一个LED灯一亮一灭的效果。
要想实现流水灯的实验,可搭建如图5.10所示的模型。在下载模型之前也可以通过仿真查看是不是预计的控制效果,如图5.11所示,加入Scope模块,单击“运行”按钮或者按Ctrl+R键,观察仿真结果如图5.12所示。由仿真结果可以看出,此控制模型为我们所要的结构,然后单击“编译”按钮或者按Ctrl+B键将此模型编译下载到主控板,观察实验现象,验证控制算法在实际硬件上运行时是否跟仿真结果一致。



图5.8GPIO模块配置




图5.9LED流水灯模型






图5.10LED流水灯模型




图5.11LED流水灯模型





图5.12控制波形图




视频讲解



5.1.2GPIO_INPUT扫描_NORMAL模式

在配置GPIO输入模式的时候,使用按键的端口输入值,作为GPIO输出模块的控制量。使用按键(对应GPIO42)控制其中一个LED灯(对应GPIO25)的亮灭,另一个LED灯(GPIO31)用于验证模型是否下载到硬件中,按键硬件原理图如图5.13所示。


图5.13按键硬件原理图



配置GPIO的PUD(上拉禁止寄存器)使能GPIO42的电平上拉,当按键按下时,GPIO42检测到低电平(置0),当没按下时GPIO42为高电平(置1)。因此需要在模型中先将GPIO42使能上拉,如图5.14所示。


图5.14初始化配置GPIO42



注意: 通过执行EALLOW指令允许CPU自由写入受保护的寄存器。在修改寄存器之后,可以通过执行EDIS指令清除EALLOW位使它们再次受到保护,EALLOW和EDIS一般是成对出现的。
GPIO DI选择GPIO25,GPIO31需要选择Toggle,Toggle表示电平翻转。搭建的按键控制模型如图5.15所示,仿真步长为0.5s。


图5.15按键实验模型



在上述配置完成,并完成模型的搭建后,将模型编译下载到主控板。先观察红色的LED灯有没有闪烁,再通过控制按键按下与否来控制蓝色LED灯的状态。


视频讲解



5.1.3GPIO_INPUT扫描_EXTERNAL模式
需要注意的是,Simulink的External模式默认使用的是SCIA,波特率为115200b/s,并且默认复用I/O口是GPIO28、GPIO29,对应开发板上的SCIA接口是RXA、TXA,如图5.16所示。所以在进行External模式操作的时候,通过一根USB转TTL通信线,将USB的RX、TX分别接在F28069主控板的TXA、RXA引脚。注意,USB和F28069的控制板要共地,同时不能将线序接反,否则Simulink无法通过SCI转USB与DSP进行通信。使用External模式可极大地方便对数据的观测。


图5.16SCI配置


首先需要在模型配置时对外部模式进行设置,如图5.17所示。将Communication interface设置为串行通信,然后在“设备管理器”中找到串行通信的COM口,输入到Serial port中,如图5.18所示。GPIO外部模式模型如图5.19所示。


图5.17配置外部模式





图5.18串口配置



注意: GPIO DI模块输出数据类型选择uint8,如图5.20所示。



图5.19GPIO外部模式模型




图5.20GPIO DI模块数据类型配置



在上述配置完成后,再次单击Simulink界面的“运行”按钮将代码下载到开发板上,可以看到,Simulink处于仿真运行状态,按下主控板按键,可以在Display模块中看到数值的变化。
由于GPIO4默认上拉使能,所以在按键未按下前Dispaly显示1,按下后显示0,如图5.21所示。同时观察蓝色LED灯的亮灭情况可以判断Display显示是否正确,如图5.22所示。



图5.21按键按下实验现象





图5.22按键松开实验现象



5.1.4GPIO_INPUT中断控制LED灯
GPIO不仅可以实现通用I/O数字量输出的功能,还可以配置成外部中断实现控制目的。比如将最常用的按键配置成外部中断,在中断中执行参数或模式的修改,这样比常用的按键扫描方式要节省资源。
在Simulink中搭建模型,配置GPIO42为外部中断触发源,并将中断配置为下降沿触发,对应外部中断3。在中断函数中分别进行对应的LED的翻转,GPIO42对应LED1灯(GPIO31)、LED2灯(GPIO25)。仿真模型如图5.23所示,系统仿真步长为0.05s。


图5.23中断仿真模型


其中System Initialize中写入的是GPIO42的初始化代码,如图5.24所示。



图5.24GPIO初始化配置



硬件中断模块配置如图5.25所示,中断号为CPU12,PIE1也就是外部中断XTIN3,任务优先级默认,Preemption flags输入1表示中断可以被抢占。输入0表示中断不能被抢占。更多的详细信息请单击该模块的Help按钮了解。


图5.25中断配置



Trigger子系统里面为LED灯的控制模型,如图5.26所示,且在控制模型的GPIO Do模块中不选中Toggle。



图5.26GPIO中断触发模型


在上述配置完成,并完成模型的搭建后,将生成的工程代码下载到主控板上。按下一次按键,可以发现对应的LED灯电平便翻转一次。


视频讲解



5.2ADC
5.2.1ADC基本原理
1. ADC转换步骤



A/D转换器(ADC)将模拟量转换为数字量通常要经过4个步骤: 采样、保持、量化和编码。


图5.27A/D采样原理

所谓采样,就是将一个时间上连续变化的模拟量转化为时间上离散变化的模拟量,如图5.27所示。
将采样结果存储起来,直到下次采样,这个过程称作保持。一般地,采样器和保持电路一起总称为采样保持电路。

将采样电平归化为与之接近的离散数字电平,这个过程称作量化。
将量化后的结果按照一定数制形式表示就是编码。
将采样电平(模拟值)转换为数字值时,主要有两类方法: 直接比较型与间接比较型。
(1) 直接比较型: 就是将输入模拟信号直接与标准的参考电压比较,从而得到数字量。这种类型常见的有并行ADC和逐次比较型ADC。
(2) 间接比较型: 输入模拟量不是直接与参考电压比较,而是将二者变为中间的某种物理量再进行比较,然后将比较所得的结果进行数字编码。这种类型常见的有双积分型的ADC。
2. ADC转换原理
采用逐次逼近法的A/D转换器由比较器、D/A转换器、N位寄存器及控制逻辑电路组成,如图5.28所示。


图5.28逐次逼近式A/D转换器原理图



基本原理是从高位到低位逐位试探比较,好像用天平称物体,从重到轻逐级增减砝码进行试探。逐次逼近法的转换过程是: 初始化时将逐次逼近寄存器各位清零,转换开始时,先将逐次逼近寄存器最高位置1,送入D/A转换器,经D/A转换后生成的模拟量送入比较器,称为U0,与送入比较器的待转换的模拟量UX进行比较,若U0<UX,则该位1被保留,否则被清除。然后再置逐次逼近寄存器次高位为1,将寄存器中新的数字量送D/A转换器,输出的U0再与UX比较,若U0<UX,则该位1被保留,否则被清除。重复此过程,直至逼近寄存器最低位。转换结束后,将逐次逼近寄存器中的数字量送入缓冲寄存器,得到数字量的输出。逐次逼近的操作过程是在一个控制电路的控制下进行的。
采用双积分法的A/D转换器由电子开关、积分器、比较器和控制逻辑等部件组成,如图5.29所示。


图5.29双积分法的A/D转换器



基本原理是将输入电压变换成与其平均值成正比的时间间隔,再把此时间间隔转换成数字量,属于间接转换。双积分法A/D转换的过程是: 先将开关接通待转换的模拟量Vi,Vi采样输入到积分器,积分器从零开始进行固定时间T的正向积分,时间T到后,开关再接通与Vi极性相反的基准电压VREF,将VREF输入到积分器,进行反向积分,直到输出为0V时停止积分。Vi越大,积分器输出电压越大,反向积分时间也越长。计数器在反向积分时间内所计的数值,就是输入模拟电压Vi所对应的数字量,实现了A/D转换。
3. ADC关键技术指标
(1) 分辨率(Resolution)指数字量变化一个最小量时模拟信号的变化量,定义为满刻度与2n的比值。分辨率又称精度,通常以数字信号的位数来表示。
(2) 转换速率(Conversion Rate): 也可以称为A/D采样率,是A/D转换一次所需要时间的倒数。单位时间内,完成从模拟转换到数字的次数。积分型A/D的转换时间是毫秒级,属低速A/D; 逐次比较型A/D是微秒级,属中速A/D,全并行/串并行型A/D可达到纳秒级。采样时间则是另外一个概念,是指两次转换的间隔。为了保证转换的正确完成,采样速率(Sample Rate)必须小于或等于转换速率。因此有人习惯上将转换速率在数值上等同于采样速率也是可以接受的。常用单位是ksps和Msps,表示每秒采样千/百万次(kilo/Million Samples per Second)。
(3) 量化误差(Quantizing Error): 由于A/D的有限分辨率而引起的误差,即有限分辨率A/D的阶梯状转移特性曲线与无限分辨率A/D(理想A/D)的转移特性曲线(直线)之间的最大偏差。通常是1个或半个最小数字量的模拟变化量,表示为1LSB、1/2LSB。
(4) 偏移误差(Offset Error): 输入信号为零时输出信号不为零的值,可外接电位器调至最小。
(5) 满刻度误差(Full Scale Error): 满度输出时对应的输入信号与理想输入信号值之差。
(6) 线性度(Linearity): 实际转换器的转移函数与理想直线的最大偏移,不包括以上3种误差。
其他指标还有绝对精度(Absolute Accuracy)、相对精度(Relative Accuracy)、微分非线性、单调性和无错码、总谐波失真(Total Harmonic Distotortion,THD)和积分非线性。
TMS320F2806x的ADC模块主要包括以下内容。
 12位模数转换。
 2个采样保持器(S/H)。
 同步采样或顺序采样。
 模拟电压输入范围0~3.3V。
 16通道模拟输入。
 16个结果寄存器存放ADC转换的结果。
 多个触发源: S/W——软件立即启动,ePWM1~ePWM8,外部中断2脚,定时器0、1、2以及A/D中断1、2。
关于ADC单元寄存器的具体描述在这里不再进行具体介绍,感兴趣的读者可以参考TMS320F28069(以下简写为F28069)的数据手册,里面有详细讲述,F28069主控板关于A/D引脚原理图如图5.30所示。


图5.30A/D引脚原理图


5.2.2ADC_NORMAL模式
ADC_NORMAL模式配置先从配置时钟开始,ADC模块是挂在高速外设时钟线上的外设,Clocking配置为系统90MHz时钟2分频。在ADC配置中,使用默认的分频系数ADCLK=2,得到ADC模块时钟为45MHz,其他使用默认配置。具体配置如图5.31所示。


图5.31ADC模块配置



采样模式为单个采样模式,SOC触发数为SOC0,采样窗口为7,SOCx触发源为软件触发,输出数据类型为uint16,输入通道配置为A0,此模块数据基本为默认。具体配置如图5.32和图5.33所示。


图5.32ADC模块配置





图5.33ADC模块输入通道配置



在以上配置完成后,对ADC采样的值进行转换。由于ADC转换结果寄存器是16位的,且数值是左对齐的12位数据,所以要进行左移4位的操作。官方支持包人性化地做了这一点,只需直接对输出的结果进行转换就可以得到实际的采样值。本例中采集的是外部电位器的0~3.3V的电压,所以直接进行转换(因为是12位的ADC,故满量程为4096,也就是4096对应实际的参考电压3.3V)。当采集到的模拟量少于2048时,使LED2灯闪烁,否则使LED1灯闪烁。模型搭建如图5.34所示。模型中的Rate Transition为高采样速率向低采样速率转换。


图5.34电压采集模型图



在上述配置完成,并完成模型的搭建后,将模型编译下载到主控板。将电位器的中间引脚接在主控板的AD0引脚,其他两个引脚分别接在主控板的3.3V和GND引脚。可以发现,在顺时针和逆时针调节电位器时,两个LED灯都发生了变化。
5.2.3ADC_EXTERNAL模式
先将模型按照前述方法配置为外部模式。
在Simulink中搭建模型,如图5.35所示,将ADC输出值通过一个增益模块赋给PWM的占空比输入,并在显示模块上显示。其中,Gain模块的输出数据为uint16,ePWM模块选择ePWM1,这里WA相当于占空比的大小,相关配置在5.3节有详细介绍。


图5.35外部模式配置



在上述配置完成,并完成模型的搭建后,用USB转TTL线,分别将USB的RX、TX接在F28069主控板的TXA、RXA引脚上。启动仿真,通过调节电位器便能观察到Scope模块的数据变化,如图5.36所示。


图5.36Scope模块显示



视频讲解



5.3Timer_IT
在多数情况下Timer0都作为系统默认的时基,如图5.37所示的Base rate trigger作为Simulink模型的触发率。那么触发步长在Slover中为Fixedstep size(fundamental sample time),如图5.38所示,配置Simulink模型的执行周期为1s,也就是1Hz的执行频率。



图5.37定时器中断配置图




图5.38步长设置图





在上述配置完成,并完成模型的搭建后,如图5.39所示,将模型编译下载到主控板上。最终可以观察到,LED1灯每秒闪烁一次。


图5.39模型搭建图


可以把此模型生成的工程文件在CCS编译器中打开,复制MTLAB的工作路径D:\MBD28069_BalanceCar\Chapter2\2.3Timer_IT,导入到CCS中,可以看到如图5.40所示的一些文件。


图5.40CCS程序图



(1) ert.main.c: 主要是对控制芯片一些初始化操作、while循环和中断函数的调用。
(2) Timer_IT.c: 主要包括初始化函数、定时器0中断操作函数、主函数里面的初始化函数。
(3) 图5.40中的3和4为定时器0中断执行函数,Timer_IT_step()函数为rt_One_Step()函数的子函数,在Simulink中搭建的控制模型基本在定时器0中断函数执行,除了C28x Hardware Interrupt、Idle Task等一些特别声明的模块。
(4) 如图5.41所示,是main主函数的一些命令。


图5.41CCS程序图一


(5) modelBaseRate也就是之前设定的定步长大小,systemClock就是系统时钟大小,Flash烧写初始化。
(6) init_board()主要是对Simulink模型配置参数中的I/O口进行初始化,Timer_IT_initialize()主要是对Simulink中搭建的一些GPIO进行初始化,如图5.42所示,其中的0xFCFFFFFF是对GPIO31的配置。


图5.42CCS程序图二


(7) configureTimer0()是计算定时器0产生中断的时间间隔。
(8) void ConfigCpuTimer(struct CPUTIMER_VARS*Timer,float Freq,float Period),CPUTIMER_VARS*Timer表示选择哪个定时器,Freq表示定时器频率,Period表示定时器周期值。
(9) ConfigCpuTimer(&CpuTimer0,systemClock,baseRate*1000000)。
(10) 计算公式为: T=systemClock*baseRate*1000000/CpuTimer0,如图5.43所示。


图5.43CCS程序图三


(11)  根据之前的设置,可以得到T=90*1*1000000/90000000=1s。
(12) enableTimer0Interrupt()使能定时器0中断,globalInterruptEnable()使能全局中断,如图5.44所示。


图5.44CCS程序图四


(13) while为函数的循环语句,其中Simulink中Idle Task模块就是运行在while中。
首次在CCS中编译Simulink生成的代码前,需要先打开,然后选择对应的仿真器型号,第一次打开默认是XDS100v1,由于主控板使用的是v2,所以选择XDS100v2,先单击右侧的Save按钮,然后再选择对应的设备TMS320F28069,最后单击Test Connection按钮,如图5.45所示,此时计算机会跟主控板通信,最终出现如图5.46所示的界面,说明已经配置成功。


图5.45CCS生成代码设置





图5.46CCS生成代码配置



当配置好ccxml文件后,下次编译工程时就不需要再进行操作了。现在就可以单击形状的“编译”按钮,确认无误,如图5.47所示。


图5.47程序编译



然后再单击形状的“调试”按钮,程序会下载到主控板,之后再单击“运行”按钮,就可观察到LED1灯开始闪烁,证明程序已经运行了。当单击“暂停”按钮时,则程序会暂时停止在芯片上运行,这是LED1灯停止闪烁,当单击“终止”按钮时,则程序停止在线运行,如图5.48所示。关于CCS更多的操作请看合动智能科技公司的《CCS6.2开发入门手册》。


图5.48程序运行与调试



视频讲解



5.4ePWM
脉冲宽度调制(PWM)是一种对模拟信号电平进行数字编码的方法,其根据相应载荷的变化来调制晶体管栅极或基极的偏置,来实现开关稳压电源输出晶体管或晶体管导通时间的改变,这种方式能使电源的输出电压在工作条件变化时保持恒定,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。
关于PWM的控制方法,采样控制理论中有一个重要结论: 冲量相等而形状不同的窄脉冲加在具有惯性的环节上时,其效果基本相同,如图5.49所示。


图5.49采样原理



PWM控制技术就是以该结论为理论基础,对半导体开关器件的导通和关断进行控制,使输出端得到一系列幅值相等而宽度不相等的脉冲,用这些脉冲来代替正弦波或其他所需要的波形。按一定的规则对各脉冲的宽度进行调制,既可改变逆变电路输出电压的大小,也可改变输出频率,如图5.50所示。


图5.50等效PWM波



TMS320F28069有19路脉宽调制输出引脚(这些引脚需要软件进行配置,类似于前面的普通GPIO的配置),这19路脉宽调制输出引脚包括16路增强型PWM(ePWM)和3路普通PWM(ECap模块复用),16路增强型PWM中又有8路可以配置为高分辨率的PWM(HRPWM)。8组PWM模块,每一组又有2路PWM,分别是PWMA和PWMB。
一个ePWM模块包括Timebase(TB)module(时基模块)、Countercompare(CC)module(计数器比较模块)、Actionqualifier(AQ)module(比较方式预设模块)、Deadband(DB)module(死区模块)、PWMchopper(PC)module(斩波模块)、Eventtrigger(ET)module(事件触发模块)、Tripzone(TZ)module(行程区模块)共7个模块。关于各个模块的介绍请参考刘杰编写的《Simulink建模基础及C2000 DSP代码自动生成》。
本次应用案例利用的是EPWM1模块,其原理图如图5.51所示。


图5.51EPWM1模块接口



以下通过3个例子对PWM的功能进行说明。
5.4.1ePWM_单路输出
1. 方法一

ePWM模块输入时钟,直接由系统时钟而来,使用的时候可以根据用户需要进行分频。在ePWM的设置界面的General选项卡中,配置为ePWM1模式,对PWM模块进行初始化配置,时钟周期单元选择Clock cycles,计数模式选择UpDown计数,如图5.52所示。


图5.52ePWM模块配置



TBCLK=SYSCLKOUT/(HSPCLKDIV*CLKDIV),本次实验系统时钟SYSCLKOUT设置为80MHz,取HSPCLKDIV选择4分频,TBCLK分频选择2分频,所以ePWM1的时基时钟为TBCLK=80/(2*4)=10MHz,设置周期寄存器值为10000,因此ePWM1的输出频率为10MHz/10000=1kHz。
在ePWMA选项卡配置使能ePWMA,当计数等于0的时候不动作,等于比较寄存器CAU的值的时候复位,等于比较寄存器CAD的值的时候置高,其他时间不动作。ePWMB、死区时间、事件触发以及错误联防均不配置,如图5.53所示。


图5.53ePWMA计数模式配置



对Counter Compare的配置: 将CMPA units设置为Percentage(百分比); 比较寄存器CMPA设置成Specify via dialog内部指定为50,即占空比为50%,如图5.54所示。
通过以上配置,可以得到模型如图5.55所示。



图5.54占空比配置




图5.55ePWM1模块



2. 方法二
在General选项卡中,配置为ePWM1模式,对PWM模块进行初始化配置,时钟周期单元选择Seconds,计数模式选择UpDown计数,关闭同步功能,分频系数TBCLK和HSPCLKDIV均为1(不对系统时钟分频),如图5.56所示。


图5.56PWM周期配置



对ePWMA配置同方法一,这里配置CMPA units设置为Percentage(百分比); 比较寄存器CMPA设置成Input port(由外部输入),CMPA初始值设为0,如图5.57所示。

通过以上配置,可以得到模型如图5.58所示。



图5.57占空比配置




图5.58ePWM模块配置



在上述配置完成,并完成模型的搭建后,将模型编译下载到主控板,然后在CCS中打开模型生成的工程文件,先单击“编译”按钮,再单击“调试”按钮,然后将图5.59中的两个变量添加到Expressions中,单击“运行”按钮,可以看到TBPRD、CMPA的值,如图5.59所示。可以将主控板的PWM1A引脚连接到示波器的信号线,主控板和示波器记得要共地,便能观测到输出的PWM的频率是否为1kHz,占空比是否为50%。注意,要单击Expressions的实时刷新按钮,否则数据不会变化。


图5.59变量观察



5.4.2ePWM_双路互补输出
对General选项卡和ePWMA选项卡的配置同5.4.1节中的方法一,因为要输出两路互补的PWM,所以这里使能ePWM1B配置与ePWM1A相反,如图5.60所示。


图5.60ePWMB计数模式配置



对Counter Compare的配置: 将CMPA units设置为Clock cycles(时钟周期); 比较寄存器CMPA设置成Input port输入端口,初始值设为0; 对CMPB的操作一样,如图5.61所示。


图5.61ePWM周期配置



搭建的模型如图5.62所示。


图5.62两路占空比不同的PWM



在上述配置完成,并完成模型的搭建后,将模型编译下载到主控板,然后在CCS中打开模型生成的工程文件,先单击“编译”按钮,再单击“调试”按钮,然后将图563中的3个变量添加到Expressions中,单击“运行”按钮,可以看到TBPRD、CMPA、CMPB的值,如图5.63所示。可以将主控板的PWM1A引脚和PWM1B引脚分别连接到示波器的信号线,主控板和示波器记得要共地,便能观测到两路PWM的频率是否都为1kHz,占空比是否分别为60%和40%,波形是否互补。注意,要单击图5.63右上方的实时刷新按钮,否则数据不会变化。


图5.63变量观察



5.4.3ePWM_中断
PWM中断配置在5.4.2节的PWM实验的基础上改动。在前面的配置不变的情况下,在Event Trigger选项卡中,使能ePWM中断,并配置为在第一个事件发生时就进入中断,其他设置默认。配置如图5.64所示。



图5.64ePWM中断配置



在上述配置完成后,调用C28x Hardware Interrupt模块,将PWM1中断的CPU级中断号3以及PIE级中断号1写入,其余配置默认,如图5.65所示。


图5.65中断模块配置



中断函数中,使用StateFlow搭建了一个简单的逻辑功能模块,使LED灯每秒翻转一次。其中计数器计数最大值为1000,如图5.66所示。


图5.66中断函数



该模型的系统时钟为80MHz,定步长为0.5s。完成上面的配置之后,将生成的代码下载到开发板上,可以看到,在PWM波产生的同时,LED2灯在以1Hz的频率闪烁,LED1灯以每0.5s的频率闪烁,如图5.67所示。



图5.67ePWM中断实现



视频讲解



5.5eCAP
5.5.1eCAP基本介绍


TMS320F28069的捕获单元模块能够捕获外部输入引脚的逻辑状态(电平的高或低、电平翻转时的上升沿或下降沿),并利用内部定时器对外部事件或者引脚状态变化进行处理。控制器给每个捕获单元模块都分配了一个捕获引脚,在捕获引脚上输入待测波形,捕获模块就会捕获到指定捕获的逻辑状态,所以捕获单元可以用于测量脉冲周期以及脉冲的宽度。TMS320F28069上面有4路增强型捕捉模块eCAP,CAP模块是应用定时器来实现事件捕获功能的,主要应用在速度测量、脉冲序列周期测量等方面。
eCAP模块包括以下资源。
 可分配的输入引脚。
 32b时间基准(计数器)。
 4个32b时间窗捕获控制寄存器。
 独立的边缘极性选择。
 输入信号分频(2~62)。
 4个捕获事件均可引起中断。
1. eCAP模块的组成
eCAP模块可以设置为捕捉模式或者是APWM模式,一般而言,前者比较常用,因此在这里只对第一种情况进行分析介绍。在捕捉模式下,一般可以将eCAP模块分为以下几部分: 事件分频、边沿极性选择与验证、中断控制。
1) 事件分频
输入事件信号可通过分频器分频处理(分频系数2~62),或直接跳过分频器。这个功能通常适用输入事件信号频率很高的情况。
2) 边沿极性选择与验证
4个独立的边沿极性(上升沿/下降沿)选择通道; Modulo4序列发生器对Eachedge(共4路)进行事件验证; CAPx通过Mod4对事件边沿计数,CAPx寄存器在下降沿时被装载。32b计数器(TSCTR)此计数器为捕捉提供时钟基准,而时钟的计数则是基于系统时钟的。当此计数器计数超过范围时,则会产生相应的溢出标志,若溢出中断使能,则产生中断。此计数器在计算事件周期时非常有效,关于CAP的详细资料请参阅数据手册。
3) 中断控制
中断能够被捕获事件(CEVT1~CEVT4、CTROVF)触发,计数器(TSCTR)计数溢出同样会产生中断。事件单独地被极性选择部分以及序列验证部分审核。这些事件中的一个被选择用来作为中断源送入PIE。
设置CAP中断的过程可表述如下。
(1) 关闭全局中断。
(2) 停止eCAP计数。
(3) 关闭eCAP的中断。
(4) 设置外设寄存器。
(5) 清除eCAP中断标志位。
(6) 使能eCAP中断。
(7) 开启eCAP计数器。
(8) 使能全局中断。
2. 加深理解eCAP模块原理
配置好eCAP模块的引脚后,外部事件由引脚输入,首先通过模块的分频部分,分频系数为2~62,也可以选择跳过分频部分,此功能主要是针对输入事件信号频率很高的情况。经过分频后的信号(通常频率会降低),送至边沿及序列审核部分,边沿审核即设置为上升沿或下降沿有效,序列审核则是指分配当前对哪个寄存器(CAP1~CAP4)作用的问题,之后就是中断执行控制部分。
5.5.2eCAP捕获PWM脉冲
在5.4节中知道了如何配置TMS320F28069的ePWM模块使其输出PWM波形,而本实验则是通过利用捕获模块功能来测量配置的PWM波的占空比是否正确。实验时,只需要将ECAP1引脚用杜邦线先后与EPWM1A引脚和EPWM1B连接起来,即可完成实验。其原理图如图5.68所示。
第一步,在Solver中设置定步长为0.5s,在Hardware Implementation中配置系统时钟为90MHz,LSPCLK低速时钟外设4分频,eCAP的ECAP1 pin assignment引脚选择GPIO5,如图5.69所示。



图5.68eCAP原理图




图5.69eCAP模块配置



第二步,初始化好10个全局变量,如图5.70所示。用来实现对一方波信号的频率、周期、占空比的测量。


图5.70变量初始化


(1) t1表示第一个捕捉事件发生时计数器的值。
(2) t2表示第二个捕捉事件发生时计数器的值。
(3) t3表示第三个捕捉事件发生时计数器的值。
(4) T1表示t2-t1的差,也就是测试方波的高电平时间对应的计数值。
(5) T2表示t3-t1的差,也就是测试方波的整个周期对应的计数值。
(6) CLK表示系统时钟周期,Duty表示实际方波的占空比,Frequence表示方波的频率,Period表示方波的周期,Flag表示检测完成标志位。
第三步,生成两路频率为10kHz,一个是占空比为50%的PWM,另一个是占空比为60%的PWM,如图5.71所示。



图5.71ePWM模块配置



第四步,设置eCAP模块,中断中配置如图5.72和图5.73所示,使用的是eCAP1模块,配置为连续控制模式,并在第三次事件之后停止计数并重置,第一次事件的触发极性为上升沿,第二次事件的触发极性为下降沿,第三次触发极性为上升沿,计数时间的数据类型为无符号的32位整型。中断配置为捕捉到第三次事件之后触发中断。在eCAP输出接上demux模块,并将输出的值赋予t1、t2、t3。



图5.72eCAP模块搭建




图5.73eCAP模块配置



第五步,计算T1、T2并对Flag置位,表示一次检测完毕,如图5.74所示。



图5.74计算T1、T2





图5.75eCAP中断配置

第六步,封装子系统,配置硬件中断,根据eCAP1的中断向量号(它属于CPU中断的第四组下的第1个PIE中断),配置C28x硬件中断模块,如图5.75所示。
第七步,标志位触发,在Whlie(1)中触发计算模块,对输入方波的频率、周期、占空比进行计算,如图5.76所示。其中,CLK=1/90000000。如图5.77所示为eCAP的Simulink模型图。


图5.76PWM参数计算






图5.77eCAP实验



这里需要注意一点,请在Diagonostics选项卡中的Data Validity选项中,将Multitask data store配置为none,否则会出现如图5.78所示的错误。



图5.78错误诊断



在上述配置完成,并完成模型的搭建后,将模型编译下载到主控板,然后在CCS中打开模型生成的工程文件,先单击“编译”按钮,再单击“调试”按钮,然后将图5.79和图5.80中的10个变量添加到Expressions中,在单击“运行”按钮前,先将eCAP3引脚用杜邦线与EPWM1A引脚连接起来。然后再单击“运行”按钮可以看到各个变量的值。要想看EPWM1B的数值,ECAP1引脚用杜邦线与EPWM1B引脚连接起来。这里有一点点误差,是芯片自身问题。图5.79为EPWM1A数据监测图,图5.80为EPWM1B数据监测图。



图5.79EPWM1A数据监测






图5.80EPWM1B数据监测




视频讲解



5.6SCI串行通信
5.6.1SCI通信基本原理


SCI(Serial Communication Interface)意为“串行通信接口”,是相对于并行通信来说的,是串行通信技术的一种总称,最早由Motorola公司提出。它是一种通用异步通信接口,与MCS51的异步通信功能基本相同。
SCI模块用于串行通信,如RS422、RS485、RS232,在SCI中,通信协议体现在SCI的数据格式上。通常将SCI的数据格式称为可编程的数据格式,原因就是它可以通过SCI的通信控制寄存器SCICCR来进行设置,规定通信过程中所使用的数据格式,如图5.81所示。



图5.81典型的SCI数据帧格式



TMS320F28069上面有两个UART口: SCIA、SCIB。本实验针对SCIB。SCI的原理以及特点如下所述。
(1) 外部引脚。
发送引脚: SCITXD,接收引脚: SCIRXD。
(2) 波特率可编程。
当BRR≠0时: 波特率=LSRCLK÷((BRR+1)×8)。
当BRR=0时: 波特率=LSPCLK÷16。
(3) 数据格式。
1个开始位,1~8个数据位,奇校验/偶检验/无校验可选,1或2个停止位。
(4) 4个错误检测标志: 校验、溢出、帧、断点检测。
(5) 全双工和半双工模式可以缓冲接收和发送。
(6) 串口数据发送和接收过程可以通过中断方式或查询方式。
本实验选取TMS320F28069的SCIB模块进行实验,分别设置GPIO15和GPIO58作为SCIB的发送和接收功能引脚,并配置为波特率9600b/s,8位数据位,1位停止位,无奇偶校验,原理图如图5.82所示。



图5.82SCIB原理图



5.6.2SCI收发数据
在Solver中设置定步长为0.1s,在Hardware Implementation中配置系统时钟为90MHz,LSPCLK低速时钟外设4分频,SCI_B的字符长度为8位,波特率设为115000b/s,Tx的引脚设为GPIO58,Rx的引脚设为GPIO15,如图5.83所示。



图5.83SCIB模块配置



设置SCI Receive的SCI module为B,其他的参数默认,此模块负责接收串口助手发送过来的数据; SCI Transmit的SCI module为B,如图5.84所示,其他参数默认,此模块负责发送数据给串口助手。



图5.84SCI收发配置



搭建整个模型如图5.85所示,控制流程为: SCI接收到数据与53比较,如果等于53则输出1,1大于0则输出Counter Limited的数(Upper limit设定为10,当累加到10变归0重新计数),否则一直输出2。



图5.85整个模型搭建



在上述配置完成,并完成模型的搭建后,将模型编译下载到主控板。
将套件中附带的USB线一端与计算机连接,并将另一端插到智能平衡移动机器人套件中主控制板的USB插口处。当用USB直接连接计算机时,要想看到系统识别串口,需要打开设备管理器,选择TI XDS100 ChannelB,在右键快捷菜单中选择“属性”命令,在“高级”选项卡中选中“加载VCP”选项,拔掉USB连接线,再次插入时将显示系统已经识别到COM口,可以打开串口调试工具进行下一步实验,如图5.86所示。



图5.86串口配置



接下来打开串口猎人软件。可以看见几个主要的部分,如图5.87所示。



图5.87串口软件配置


选择对应的端口号COM9,波特率为115200b/s,在没有发送数据之前,数据接收界面一直显示2,说明搭建的模型是正确的,如图5.88所示。



图5.88串口软件显示



在左下角的方框中输入35(十六进制),则数据接收显示界面会一直显示0~10的数,如图5.89所示。



图5.89串口软件测试



在高级收码工具栏下方的通道设置的来源选择提取每一帧,然后单击“启动高级收码”按钮,便可以在历史数据看见有0~10的十进制数显示,如图5.90所示。



图5.90串口软件测试



在波形显示界面将Y轴倍率设为10/格,周期为0.1/格,可以看见一个0~10的阶梯状图形,如图5.91所示。


图5.91串口软件波形显示



5.7SPI串行通信
5.7.1SPI概述


SPI即Serial Peripheral Interface是高速同步串行输入/输出端口,SPI最早是由Freescale(原属Motorola)公司在其MC68HCxx系列处理器上定义的一种高速同步串行接口。SPI目前被广泛用于外部移位寄存器、D/A、A/D、串行EEPROM、LED显示驱动器等外部芯片的扩展。与前面介绍的SCI的最大区别是,SPI是同步串行接口。SPI总线包括1根串行同步时钟信号线(SCI不需要)以及2根数据线,实际总线接口一般使用4根线,即SPI四线制: 串行时钟线、主机输入/从机输出数据线、主机输出/从机输入数据线和低电平有效的从机片选线。有的SPI接口带有中断信号线,有的SPI接口没有主机输出/从机输入线。在TMS320F28069中使用的是前面介绍的SPI四线制。
SPI接口的通信原理简单,以主从方式进行工作。在这种模式中,必须要有一个主设备,可以有多个从设备。通过片选信号来控制通信从机,SPI时钟引脚提供串行通信同步时钟,数据通过从入主出引脚输出,从出主入引脚输入。通过波特率寄存器设置数据速率。SPI向输入数据寄存器或发送缓冲器写入数据时就启动了从入主出引脚上的数据发送,先发送最高位。同时,接收数据通过从出主入引脚移入数据寄存器最低位。选定数量位发送结束,则整个数据发送完毕。收到的数据传送到SPI接收寄存器,右对齐供CPU读取。SPI的通信链接如图5.92所示。



图5.92SPI通信原理



TMS320F28069的SPI接口具有以下特点。
1. 4个外部引脚
 SPISOMI: SPI从输出/主输入引脚。
 SPISIMO: SPI从输入/主输出引脚。
 SPISTE: SPI从发送使能引脚。
 SPICLK: SPI串行时钟引脚。
2. 2种工作方式: 主和从工作方式
波特率: 125种可编程波特率。
当SPIBRR=3~127时,波特率=LSPCLK(SPIBRR+1)。
当SPIBRR=0,1,2时,波特率=LSPCLK4。
数据字长: 可编程的1~16个数据长度。
3. 4种计时机制(由时钟极性和时钟相应控制)
(1) 无相位延时的下降沿: SPICLK为高电平有效。在SPICLK信号的下降沿发送数据,在SPICLK信号的上升沿接收数据。
(2) 有相位延时的下降沿: SPICLK为高电平有效。在SPICLK信号的下降沿之前的半个周期发送数据,在SPICLK信号的下降沿接收数据。
(3) 无相位延迟的上升沿: SPICLK为低电平有效。在SPICLK信号的上升沿发送数据,在SPICLK信号的下降沿接收数据。
(4) 有相位延迟的上升沿: SPICLK为低电平有效。在SPICLK信号的下降沿之前的半个周期发送数据,而在SPICLK信号的上升沿接收数据。
 接收和发送可同时操作(可以通过软件屏蔽发送功能)。
 通过中断或查询方式实现发送和接收操作。
 9个SPI模块控制寄存器: 位于控制寄存器内,帧开始地址7040H。
注意: 这个模块中的所有寄存器是被连接至外设帧2的16位寄存器。当一个寄存器被访问时,低字节(7~0)和高字节(15~8)内的寄存器数据被读作零。对高字节的写入没有效果。
4. 增强型特性
 4级发送/接收FIFO。
 经延迟的发射控制。
 支持双向3线SPI模式。
 借助SPISTE翻转的音频数据接收支持。
5.7.2SPI控制PWM占空比
第一步,在Solver中设置定步长为0.05s,在Hardware Implementation中配置系统时钟为90MHz,LSPCLK低速时钟外设4分频,主要设置SPI_A的Enable loopback,将SIMO pin assignment、SOMI pin assignment、CLK pin assignment、STE pin assignment这4个引脚配置为如图5.93所示的I/O口。



图5.93SPIA配置



第二步,搭建占空比选择子系统,如图5.94所示,关于MASK子系统的介绍可以查看网页: https://ww2.mathworks.cn/help/simulink/gui/maskeditoroverview.html?searchHighlight=Mask%20Editor%20Overview&s_tid=doc_srchtitle。



图5.94占空比配置



第三步,选择SPI Transmit和SPI Receive的模块为SPI_A,如图5.95所示,其他参数默认。




图5.95收发配置



第四步,配置PWM输出,定时器计数次数为64000,计数方式为向上计数UP,不分频。
使能ePWM1A,当计数值等于定时器周期值PRD时置低,当计数值等于向上计数的CAU时置高,其他计数为Do nothing(不动作)。
使能ePWM1B,当计数值等于定时器周期值PRD时置高,当计数值等于向上计数的CBU时置低,其他计数为Do nothing(不动作)。
比较计数,选择Clock cycles,CMPA initial value、CMPB initial value的值由外部输入,初值为0,如图5.96所示。



图5.96ePWM配置



第五步,在上述配置完成,并完成模型的搭建后,如图5.97所示。选择占空比为75%,将模型编译下载到主控板。



图5.97整个模型搭建





图5.98两路PWM的占空比分别为75%,25%


第六步,然后在CCS中打开模型生成的工程文件,先单击“编译”按钮,再单击“调试”按钮,然后将图5.98中的两个变量添加到Expressions中,单击“运行”按钮,可以看到TBPRD、CMPA、CMPB的值。可以将主控板的PWM1A引脚和PWM1B引脚分别连接到示波器的信号线,主控板和示波器记得要共地,便能观测到两路PWM的频率是否都为1kHz,占空比是否分别为75%和25%,波形是否互补。注意,要单击右上方的实时刷新按钮,否则数据不会变化。

第七步,在Simulink中选择占空比为50%,重新编译下载,然后在CCS中观察数据,如图5.99所示。



图5.99两路PWM的占空比都为50%



第八步,在Simulink添加两个Scope,如图5.100所示,选择External模式,主控板连接USB转TTL模块,选择对应的COM口,波特率为115200b/s,选择占空比为75%,单击“运行”按钮,可以观测Scope1的数据是否和Scope的数据一致,在运行状态下可以改变占空比的大小,查看Scope1的数据变化,如图5.101所示。


图5.100模型图




图5.101波形图



5.8IdelTask模块介绍
在常规的MCU编程中,Whlie(1)是几乎都会使用到的一个函数,它可以使一些对工作周期要求不高的外设对所要执行的功能进行循环扫描,例如,矩阵键盘或者OLED显示等功能。在TI提供的硬件支持包中,也很人性化地提供了这个功能模块——Idle Task。添加Idle Task模块后生成的代码如下。



while (runModel) {

stopRequested = !( rtmGetErrorStatus(Ideltask_M) == (NULL));

runModel = !(stopRequested);

idletask_num1();

idletask_num2();

}





Idle Task模块的配置界面如图5.102所示,分别设置Task numbers以及Preemption flags。



图5.102Idle Task模块配置



这里的抢占式优先级不同于中断的抢占式优先级。它的功能是: 当Preemption flag设置为0的时候,每次进入Whlie循环的开始,关掉全局中断,执行完毕后打开。当Preemption flag设置为1时,则不做上述处理,当中断来临时,优先执行中断。
下面为Preemption flag设置为的0时生成的代码,可以看到生成的代码中出现了开关中断的指令,而从Preemption flag设置为1时的生成代码可以看到,没有开关中断的指令。



Void idletask_num1(void)

{

DINT;

Idle_num1_task_fcn();

EINT;

}

Void idletask_num2(void)

{






Idle_num2_task_fcn();

}

Void enable_interrupts()

{

EINT;

ERTM;

}





所以在使用的时候,可以根据自己的需要选择。搭建如图5.103所示模型,左边子系统是给GPIO31一个高电平,右边子系统是给GPIO25一个低电平,电平不翻转。编译下载可以观察主控板的LED1灯亮,LED2灯灭。



图5.103模型搭建



下面为该模型生成的代码,idle_num1_task_fcn()函数为图5.103中右边子系统生成的代码,idle_num2_task_fcn()函数为左边子系统生成的代码。



void idle_num1_task_fcn(void)

{

/* Call the system: Root/GPIO_25 */

{

/* S-Function (idletask): 'Root/Idle Task' */

/* Output and update for function-call system: 'Root/GPIO_25' */

/* S-Function (c280xgpio_do): 'S2/GPIO25' incorporates:

*  Constant: 'S2/Constant'

*/






{

if (Ideltask_P.Constant_Value)

GpioDataRegs.GPASET.bit.GPIO25 = 1;

else

GpioDataRegs.GPACLEAR.bit.GPIO25 = 1;

}

/* End of Outputs for S-Function (idletask): 'Root/Idle Task' */

}

}

/* Idle Task Block: 'Root/Idle Task' */

void idle_num2_task_fcn(void)

{

/* Call the system: Root/GPIO_31 */

{

/* S-Function (idletask): 'Root/Idle Task' */

/* Output and update for function-call system: 'Root/GPIO_31' */

/* S-Function (c280xgpio_do): 'S1/GPIO31' incorporates:

*  Constant: 'S1/Constant'

*/

{

if (Ideltask_P.Constant_Value_a)

GpioDataRegs.GPASET.bit.GPIO31 = 1;

else

GpioDataRegs.GPACLEAR.bit.GPIO31 = 1;

}

/* End of Outputs for S-Function (idletask): 'Root/Idle Task' */

}

}




可以从Idletask.h头文件代码中看到当Constant_Value为0,LED2灯灭,Constant_Value_a为1,LED1灯亮。



/* Parameters (default storage) */

struct P_Ideltask_T_ {

real_T Constant_Value;          /* Expression: 0

* Referenced by: 'S2/Constant'

*/

real_T Constant_Value_a;        /* Expression: 1

* Referenced by: 'S1/Constant'

*/

};

P_Ideltask_T Ideltask_P = {

 0.0,                              /* Expression: 0

* Referenced by: 'S2/Constant'

*/






1.0/* Expression: 1

* Referenced by: 'S1/Constant'

*/

}





5.9WatchDog模块介绍
意外难免会发生,部分意外发生的时候,系统程序会跑飞或进入死循环,系统需要有一定自恢复的功能,这就需要看门狗。意外有很多,对强电类控制电路来说,最让人头疼的就是琢磨不透又抓不着的EMI干扰,以及电源设计,对于软件而言有内存泄漏、程序健壮性等问题。看门狗(Watchdog timer)从本质上来说就是一个定时器电路,一般有一个输入和一个输出,其中的输入叫作喂狗,输出一般连接到另外一个部分的复位端,在这里就是TMS320F28069的复位端。CPU工作正常时,按照设定的程序,每隔一段时间就输出一个信号到喂狗端,实际操作是给看门狗计数器清零,如果超过了一定时间没有信号到喂狗端进行喂狗,来做清零操作,一般就认为程序运行出了意外,不管意外类型是怎样的,这时候看门狗电路就会给出一个复位信号给CPU的复位端,使CPU强制复位,从而可能改变程序跑飞或死循环的状态。设计者必须了解看门狗的溢出时间以决定在适当的时候清看门狗。清看门狗也不能太过频繁,否则会造成资源浪费。在系统设计初以及调试的时候,不建议使用看门狗,因为系统设计初的时候意外的可能性太多,且有些意外是必须处理的,看门狗电路的复位信号很可能会引入更多的困扰。合理利用看门狗电路,可以检测软件和硬件运行的状态,进一步提高系统的可靠性。
在使用看门狗之前首先要对看门狗的内部计数器进行配置。打开模型配置界面,在Watchdog选项卡中,使能看门狗,再配置看门狗计数器的计时时间为0.209715s触发一次Time out event(从配置中可以看到,看门狗的时钟直接来自OSCCLK也就是外部晶振的时钟10MHz),然后配置Time Out event为Chip reset。具体配置如图5.104所示。




图5.104看门狗模块



将看门狗模块的复位源信号设置为Timer0中断的周期,在Sample time中填入-1,如图5.105所示。



图5.105看门狗模块配置



同时在Timer0的中断中使两LED的电平在中断中翻转。模型如图5.106所示。



图5.106模型搭建



然后可以做两次对比性实验,一次实验的系统步长设置为0.5s(大于看门狗的溢出时间),另一次设置为0.1s(小于看门狗的溢出时间)。分别生成代码之后下载到开发板上观察实验现象。
从图5.107中的代码可以看到,每进行一次定时器中断,便将看门狗计数器复位,也就是所说的喂狗。


图5.107自动生成代码



在对比实验中,可以清楚地看到,当中断周期大于看门狗定时器的时间,芯片会一直复位,LED灯无法按照设定的频率翻转; 反之则LED灯正常工作。
5.10本章小结
本章主要介绍了智能平衡移动机器人片内外设模块的基本原理及MATLAB/Simulink的仿真实验,包括GPIO模块、ADC模块、Timer_IT模块、ePWM、eCAP及SCI串行通信和SPI串口通信的基本原理,以及对MATLAB/Simulink系统的设置过程,并结合MATLAB/Simulink对每个模块进行了模型搭建实验及自动代码生成。