网上做题扣分在哪个网站上做,玉林市网站建设,东莞企业网站建设营销,电子商务网站建设评估工具有哪些目录概述Timer_A 模块16 位主定时器连续计数模式增计数模式增减计数模式主定时器的一般设置捕获/比较模块 CCRx捕获模块比较模块小结Grace中配置Timer_ATimer0_A3 - Overview介绍用例#xff1a;定时器的启动/停止用例#xff1a;使用定时器比较模式产生周期性间隔用例#…
目录概述Timer_A 模块16 位主定时器连续计数模式增计数模式增减计数模式主定时器的一般设置捕获/比较模块 CCRx捕获模块比较模块小结Grace中配置Timer_ATimer0_A3 - Overview介绍用例定时器的启动/停止用例使用定时器比较模式产生周期性间隔用例定时器PWM模式用例使用定时器溢出产生周期性间隔用例计时器捕获模式上机实战500ms的中断Grace配置main.cInterruptVectors_init.c现象50Hz PWMGrace配置main.c现象改变占空比main.c现象平台 Code Composer Studio 6.2.0 Grace 2.2.0 MSP430G2553 LaunchPad™ Development Kit (MSP-EXP430G2ET) 以下大部分内容摘自《LaunchPad口袋实验平台 —— MSP-EXP430G2篇》傅强、杨艳 编著TI大学计划嵌入式微控制器技术丛书
概述 定时器在任何单片机中都具有极其重要的作用。我们都知道单片机是顺序执行指令我们把CPU看成是人一个每次只能干一件事的人。没有定时器的帮助人就会像在监狱服刑一样早上起床吃早饭干苦力、放风、吃晚饭、睡觉、早上起床…偶尔有的变数就是有人探监外部中断。可怕的是如果吃饭时“耳背”狱警喊停没听见那作为犯人就必须一直吃下去干苦力时出了岔子就更悲催了。 定时器是什么呢实际就是能够对时钟进行计数的计数器类似我们的闹钟。定时器的出现才使单片机成为几乎无所不能的完整的自由人。一个自由主人的一天是这样的
起床相当于main循环的起始。刷牙相当于执行各种inital操作此task主人CPU必须亲力亲为并且不能被其他事打扰。烧水代表不需要人CPU一直干的task主人灌好烧水壶后只需打开灶台火焰即可。不巧的是烧水壶并没有水烧好的鸣响器外设中断怎么办最傻的办法是主人得一直盯着看烧水的全过程。但是有定时器主人就不必要这么做了。因为烧好一壶水的时间基本是知道的主人设定好闹钟就可以去看报纸其他任务或者打瞌睡了休眠。待闹钟响起人去关火泡咖啡…敲门有访客敲门相当于突发事件event。假设主人住在大庄园里又恰巧没有门铃外部中断怎么办难道要主人成天蹲在大门口吗不用有定时器呢。假定访客敲门都最少会敲5分钟主人将定时器设定为5分钟响一次每5分钟去门口看一次这样就不会错过客人来访了。其他时间主人可以打dota或者发呆。吃药假如主人每隔1小时需要吃药一次这相当于对时间要求严格的task按理说这不就是用个闹钟就完了吗。憋屈的是主人只有1个闹钟已经用在“接客”上了怎么办没关系主人可以数定时5分钟的闹钟响了多少次数够12次就吃药。类似的方法主人可以数着闹钟的“节拍”处理其他对时间要求严格的task。有人来访好了5分钟去大门口看一次真有访客了。访客分两种情况送快递的只需标记下可以后续处理的event或是上门拜访的需要立刻接待处理的event。因为对于快递包裹主人验货收下即可写全局变量标志位以后有时间再研究包裹内的物品。而上门拜访的客人主人立刻亲自接待中断子函数占用CPU。客人赖着不走客人脑子进水了说个没完没了程序跑飞或外设错误影响主人正常生活了怎么办没事幸好有看门狗定时器在每隔设定时间必须喂狗重置看门狗定时器否则设定时间一到看门狗该咬人了重启单片机。主人的一天要重新开始了。 总结一下主人的一天一个住着大庄园的主人却没有仆人有的话成双CPU了。还非常憋屈的没有自动报警的烧水壶庄园大门没有门铃吃药都没有专人伺候。但是依靠闹钟定时器主人还是可以惬意的生活有时间打dota有时间打盹。甚至当“天下大乱”的时候还有看门狗可以让一天重来。 定时器作为单片机中最有用的片内外设就是为弥补CPU顺序执行程序这个“死脑经”缺陷而量身定做的。学会使用定时器的思想才算真正是单片机入了门。
Timer_A 模块 除了概述中最基本的定时器功能外定时器还有很多种不同的构造辅助功能以更方便的为人所利用比如一个倒计时方式的闹钟可能更有用。 MSP430单片机中Timer_A定时器就是一种辅助功能强大的定时器具备捕获和PWM输出等极其有用功能。Timer_A定时器的构造原理与其他高性能单片机定时器的原理非常类似具备“普适价值”。所以我们有必要从原理上理解这一定时神器。 MSP430x2xx系列单片机的Timer_A模块的整体构造如下图所示包括1个16位定时器TimerBlock和3个捕获/比较模块CCRx。
16 位定时器的最大定时值 65535当前计数值被存放在 TAR 寄存器中。CCRx 的捕获模块 Caputre 由 1 个输入 IO 口CCIx控制输入上升沿或下降沿均能 触发比较模块动作捕获发生后的瞬间TAR 值被存入 TACCRx 寄存器。CCRx 的比较模块 Comparator 控制 1 个输出 IO 口TAx去生成各种脉冲波形。当TAR 计数值与预存入 TACCRx 寄存器的值相等时比较模块动作以某种预设规则控制 IO 电平生成波形。其中 CCR0 的 TA0 只能生成 50%占空比方波原因稍后会叙述。由于捕获模块 Caputre 和比较模块 Comparator 共用了 TACCRx 寄存器捕获 Capture的功能是写 TACCRx而比较Comparator 的功能是读 TACCRx 模块所以捕获和比较不能同时使用。 16 位主定时器 Timer_A 的核心单元是一个 16 位的主定时器其实也就是个 16 位计数器如果计数脉冲的频率精确稳定的话计数的同时就是计时。 主定时器的工作模式 MCx 寄存器可配置 4 种模式其中 MCx00 为停止无需解释。剩下 3 种连续计数模式、增计数模式、增减计数模式就算是初学者也必须知道得一清二楚!
连续计数模式 设置 MCx10主定时器将工作在连续计数模式下。
如下图左侧所示主定时器犹如 1 个表盘TAR 寄存器最大值 65535计满则清零指针沿表盘 360°工作。如下图右侧所示时钟的周期仅由时钟源的频率决定频率越高则越快计数至65535TA 周期越短。 增计数模式 设置 MCx01主定时器将工作在增计数模式下。与连续计数不同的是CCR0 模块可以提前将 TAR 寄存器清零。
如下图左侧所示当 TAR 的值与 TACCR0 预设值图中设定为 40959相等时TAR被强迫清零。时钟表盘只能在灰色区域活动。如下图右侧所示定时器的实际周期不再仅由时钟源决定还与 TACCR0 设定值有关。 增减计数模式 设置 MCx11主定时器将工作在增减计数模式下。与增计数不同的是CCR0 模块不是提前将 TAR 寄存器清零而是将主定时器转变为减法器俗称逆袭。
如下图左侧所示当 TAR 的值与 TACCR0 预设值图中设定为 40959相等时TAR减法计数。时钟表盘同样只能在灰色区域活动。当 TAR 减到 0 以后主定时器自动变回加法器。如下图右侧所示定时器的实际周期同样与 TACCR0 设定值有关并且是增计数模式的两倍。 主定时器的一般设置 使用时我们需要对 16 位定时器做一些什么设置呢
确定计数脉冲的来源寄存器 TASSELx 及分频值寄存器 IDx反正翻来覆去就那么几种来源用到再说。确定定时器的工作模式寄存器 MCx如下表所示。
定时器工作模式定时器工作模式定时器工作模式
MCx模式描述00停止Stop停止计数01增计数Up重复从 0 计数到 TACCR010连续计数Continuous重复从0计数到0xFFFF11增减计数 Up/down重复的从0增计数到TACCR0又减计数到0
各种计数模式何时触发中断 TAIFGTimer_A Interrupt Flag呢如下图所示连续计数在 0xFFFF→0 时刻增计数在 TACCR0→0 时刻增减计数模式是在减计数的0x0001→0x0000 时刻。任何时候都可以软件直接读取当前的定时器值寄存器 TAR也可以人为设定 TAR的“初值”这不太常用。此外还有定时器“复位键”TACLR用于重新开始一次计时。TACLR 对分频器也有效是彻底的复位。 捕获/比较模块 CCRx Timer_A 的有捕获/比较模块 CCRx 并不是独立的功能模块它们都必须依靠 16 位主定时器工才能工作。
捕获模块 Capture可以判断输入信号的边沿并瞬间用 TACCRx 寄存器记录下边沿时刻TAR 值用于精确测定脉宽或频率。比较模块 Comparator通过将 TAR 寄存器值与 TACCRx 中预设值比较自动按“预设方案”反转 IO 电平可以自动生成各种波形。捕获/比较共用了 TACCRx 寄存器所以不能同时使用CAP 寄存器位用于选择捕获/比较工作模式。CAP0 为比较CAP1 为捕获。
捕获模块 将 CAP 设置为 1CCRx 工作于捕获模式。主定时器一般设置为连续计数模式当CCRx 检测到 CCIx某带捕获功能的 IO 口的电平边沿时瞬间读取 TAR 寄存器的值并写入 TACCRx。 CCRx可以选择检测上升沿或下降沿或者都检测。CCRx用于测定信号脉宽时只需要分别记录信号上升沿时刻和下降沿时刻两时刻相减就是脉宽;而测量频率时连续记录两次上升沿时刻相减就是周期。 如果大家用过 51 单片机测脉宽和频率初一看这和外部中断的方法不是差不多吗两者大不一样。
外部中断法边沿被检测→触发中断→进中断子函数→读取定时器值这时读取的定时器值和实际边沿的时刻有较大的误差。捕获法边沿被检测→立刻读取定时器值 TAR 锁存到 CCRx 模块内 TACCRx 寄存器→触发中断→爱什么时候读什么时候去读 TACCRx。这样的误差延迟就仅有十纳秒级。 使用捕获模块的一般步骤:
把主定时器设为连续计数模式这样就有最长的“刻度尺”可用。当“尺子”长度 还不够的时候可以设定尺子每溢出1次中断服务给全局变量Count1,这样就能测量任意时间长度了。把CCRx模块对应的寄存器CAP设为1,捕获模式。选择CCRx 模块的捕获源寄存器CCISx也就是具体单片机哪个管脚作为捕获输入口CClx。设定CMx寄存器决定是上升沿捕获还是下降沿还是上升下降都捕获。设定SCS寄存器决定是同步捕获还是异步捕获。咋一看起来异步捕获响应要快但是捕获后的有效数据是来自定时器的计数值响应再快也超不过时钟的分辨率。所以一般均设为同步捕获这样可以减小电路毛刺避免竞争冒险。标志位COV为1代表上次TACCRx的数据没被取走而又新来数据覆盖了TACCRx的异常情况。前面提到的“爱什么时候读什么时候去读TACCRx 说的有些夸张不能等下次捕获来临还不读取上次的捕获数据。
比较模块 当 CAP0 时CCRx 工作于比较模式。CCR0 在比较模式中将用于设定定时器的周期所以我们暂时当 CCR0“牺牲”了只讨论 CCR1 和 CCR2 的工作情况。 如下图所示当 CCR1/2 发现 TAR 的值与 TACCR0 或它们自己的 TACCRx 相等时便会自动改变输出 IO 口 TAx 的输出电平从而生成波形。改变的规则由 OUTMODx 寄存器决定共有 8 种规则。 这 8 种规则配合主定时器 TAR 的 3 种模式连续计数、增计数、增减计数可以无需CPU 干预生成各种波形。这样的排列组合将有 24 种但是只有几种组合是“有用的”用于生成以下 4 种特定波形
单稳态波形。 2. 普通PWMCCR1和CCR2各可生成1路。普通PWM的占空比可调范围0~100%。 3. 带死区控制的双路对称PWM。死区PWM的占空比可调范围必须小于50%具体留多少余量由死区时间决定。 4. 3路50%占空比方波相位可调。 下面我们将结合下表的 8 种模式阐述如何得到上述 4 类波形。 如图 6.12-图 6.15 所示展示了如何通过设定主定时器的模式 MCx 和 CCRx 的输出模式OUTMODx 的组合得到的各种“高价值”波形。 每个图的最下面都有中断事件的时间轴当主定时器被 CCR0 清零每个比较模块CCRx 的 TACCRx 与 TAR 相等时都会引发中断。标明了主定时器中断 TAIFG 位置以及CCR0 的中断 EQU0 位置CCR1 的中断 EQU1 位置CCR2 的中断 EQU2 位置。 OUTMODx 的功能就是决定在发生了 TAIFG 中断或 EQUx 中断时自动按哪种方式改变 IO 的电平在下面的各个波形图中“→”位置标明了控制 IO 改变的规则。
模式 0通过 CCRx 模块各自的 OUT 控制位控制 TAx 输出像操作普通 IO 口那样。一般用于程序预设定 TAx 的电平。模式 1 和模式 5用于生成单稳态脉冲。如图 6.12 所示主定时器计数器设置 为增计数模式使用 OUT 控制位预先置 0/置 1 后就可以得到正/负单稳态脉冲单稳态脉宽由 TACCRx 决定图中是 TACCR1。 模式 3 和模式 7用于产生 PWM 信号有关 PWM 的知识请自行科普。如图 6.13所示主定时器计数器设置为增计数模式。PWM 的频率由 CCR0 的 TACCR0 决定PWM 的占空比由 TACCRx 与 TACCR0 的比值决定。通过 CPU 改写 TACCRx 的值即可改变 PWM 的脉宽同样CPU 所要做的工作仅限于此输出 PWM 仍然是“全自动”的这一功能经常应用于自动反馈控制中。注虽然每个 Timer_A 模块有 3 个捕获/比较模块 CCR0/1/2但是 CCR0 的寄存器TACCR0 已被用于设定 PWM 频率因此用 CCR1 和 CCR2 最多能生成 2 路独立的PWM 信号。 模式 2 和模式 6用于产生带死区时间控制的互补 PWM。如图 6.14 所示两信号均为 0 的时间为 Tall-zeroTall-zero必须大于死区时间 TDEAD。将主定时器计数器设置为增减计数模式同样由 CCR0 的 TACCR0 决定 PWM 频率。CCR1 和 CCR2 分别设定为模式 6 和模式 2只要 TACCR1-TACCR2 TDEAD就可保证安全工作。同样 TACCR1 和TARRC2 与 TACCR0 的比值决定占空比。 注死区时间是什么在控制半桥和全桥驱动器的应用中我们有这么一种特殊需求两路信号不能同时为 1并且当一路信号变 0 以后另一路信号最少要过一段时间 TDEAD 才允许从 0 变 1否者将会引起电路短路。TDEAD 与全桥/半桥电路的器件参数有关一般为微秒数量级。 模式 4用于生成最多 3 路移相波形。前面我们提到 PWM 波形最多能生成 2 路在不需要控制占空比时50%占空比的方波通过模式 4 可得 3 路频率相位均可改变的输出波形。如图 6.15将主定时器计数器设置为增计数模式CCR0 的TACCR0 决定信号输出频率。CCR1/2 的 TACCR1/2 值决定了 TA1/2 超前 TA0 的相位。 小结
定时器极其有用一个仅有闹钟功能的定时器都可以使单片机化腐朽为神奇。Timer_A 定时器是一种有辅助功能的 16 位定时器其辅助功能的结构具备“普适价值”绝对不白学。捕获模块 Caputure 就是一个能把待测信号边沿时刻瞬间“自动”记录的装置能精确记录边沿时刻。区别于 IO 口中断后由 CPU 进中断子函数再去记录“当前时刻”的方式。比较模块 Comparator 可以自动的基于主时钟去产生各种信号而不需要 CPU 操心。这区别于用 CPU 去翻转 IO 口电平而产生信号的方式。
Grace中配置Timer_A 如图所示Grace可配置Timer0_A3与Timer1_A3 进入后勾选Enable Timerx_A3 in my configuration即可启用 Timer0_A3 - Overview Timer1_A3与之相同该页部分内容机翻如下
介绍 Timer0_A3是一个16位的定时器/计数器有三个捕获/比较块。Timer_A可以支持多个捕获/比较、PWM输出和间隔计时。Timer_A还具有广泛的中断能力。中断可以从计数器的溢出条件和每个捕获/比较寄存器中产生。
用例定时器的启动/停止 通过配置TA0CTL寄存器中的MCx位0可以启动或重新启动定时器。MCx位代表定时器的计数模式MCx00意味着定时器的计数器被停止。 用户代码
// Start Timer_A
TA0CTL | MC_1; // Start timer in up mode// Stop Timer_A
TA0CTL ~(MC1 MC0); // Clear MCx bits to stop timer用例使用定时器比较模式产生周期性间隔 定时器被配置为比较模式以产生定期中断。在等待定时器中断被设置的同时器件被置于适当的低功率模式下GIE被启用。当选定的定时器周期过后定时器中断被设置设备从LPM中唤醒为定时器ISR服务。用例还显示了手动中断切换的实现以在LPM和活动模式之间切换。 Grace配置
启用Timer_A并选择Basic User视图选择间隔定时器模式TA0输出关闭输入所需的定时器周期启用捕获比较中断。你可以在 src/grace/InterruptVectors_init.c 中的 TIMER0_A0_ISR_HOOK 内插入你的自定义 ISR 代码。 用户代码
// Enter LPM with global interrupt enabled
__bis_SR_register(LPM0_bits GIE);// On every timer period interrupt, device wakes up to service Timer ISR
// Execute the following after exit from LPM from within Timer ISR
// Fill-in user code here 导航到InterruptVectors_init.c文件在TIMER0_A0 ISR的用户代码部分之间添加以下代码。
/* USER CODE START (section: TIMER0_A0_ISR_HOOK) */// Selected Timer Period elapsed// Fill-in user code here __bic_SR_register_on_exit(LPM0_bits); // Exit LPM0 on exiting ISR. Remove this line to remain in LPM./* USER CODE END (section: TIMER0_A0_ISR_HOOK) */
用例定时器PWM模式 定时器比较模式也可用于产生PWM输出信号。根据Grace配置中选择的定时器计数模式、选择的定时器周期和PWM占空比可以产生适当的PWM输出信号。除非需要改变定时器的PWM周期/占空比否则不需要额外的用户代码。 Grace配置
启用Timer_A并选择Basic User视图选择PWM定时器模式TA0输出关闭输入所需的PWM周期为定时器捕获/比较块#1选择 “PWM Duty Cycle”并从提供的列表中选择一个输出引脚输入所需的PWM占空比
用例使用定时器溢出产生周期性间隔 定时器被配置为使用溢出中断产生周期性间隔。定时器计数器被配置为连续模式溢出中断被启用在每次定时器计数器溢出时触发定时器溢出中断。在等待定时器溢出中断被设置的过程中器件被置于适当的低功耗模式并启用GIE。当选定的定时器计数器溢出时定时器溢出中断被设置器件从LPM唤醒为定时器ISR服务。 Grace配置
启用Timer_A并选择Power User - CCR0视图选择连续计数模式以及定义16位定时器溢出周期的适当时钟和分频器设置启用定时器溢出中断。你可以在 src/grace/InterruptVectors_init.c 中的 TIMER0_A1_ISR_HOOK 内插入你的自定义 ISR 代码。 用户代码
// Enter LPM with global interrupt enabled
__bis_SR_register(LPM0_bits GIE);// On every timer period interrupt, device wakes up to service Timer ISR
// Execute the following after exit from LPM from within Timer ISR
// Fill-in user code here 导航到InterruptVectors_init.c文件在TIMER0_A1 ISR的用户代码部分之间添加以下代码。 /* USER CODE START (section: TIMER0_A1_ISR_HOOK) */// Fill-in user code here /* USER CODE END (section: TIMER0_A1_ISR_HOOK) */用例计时器捕获模式 定时器被配置为在启用定时器捕获中断的情况下在捕获输入引脚上捕获上升/下降/上升和下降边缘事件。在等待输入信号上的选定边沿以触发捕获中断的同时该器件被置于适当的低功率模式下GIE被启用。当检测到捕获输入信号上的选定边沿时TACCR1中断被设置器件被唤醒以服务定时器_A中断服务例程。 Grace配置
启用Timer_A并选择Power User - CCR0视图选择连续计数模式和适当的时钟和分频器设置定义16位定时器的周期在Timer Capture/Compare Block #0下选择Timer OFF选择Power User - CCR1视图在适当的Timer_A.CCIA/B输入引脚上选择输入捕捉模式选择上升沿或下降沿或两个沿的捕获模式选项启用捕获/比较中断。你可以在 src/grace/InterruptVectors_init.c 中的 TIMER0_A1_ISR_HOOK 内插入你的自定义 ISR 代码。 用户代码
// Enter LPM with global interrupt enabled
__bis_SR_register(LPM0_bits GIE);// On input capture interrupt, device wakes up to service Timer ISR
// Execute the following after exit from LPM from within Timer ISR
// Fill-in user code here 导航到InterruptVectors_init.c文件在TIMER0_A1 ISR的用户代码部分之间添加以下代码。 /* USER CODE START (section: TIMER0_A1_ISR_HOOK) */switch (__even_in_range(TA0IV, 10)) // Efficient switch-implementation{case TA0IV_TACCR1: // TA0CCR1// Fill-in user code here break;case TA0IV_TACCR2: // TA0CCR2// Fill-in user code here break;case TA0IV_TAIFG: // Overflow// Fill-in user code here break;default:break;}/* USER CODE END (section: TIMER0_A1_ISR_HOOK) */上机实战
500ms的中断
Grace配置 启用Timer0_A3: 设定时间启用中断 此处可以配置时钟源和分频系数等默认使用12k的ACLK比较不准 参考【MSP430G2553】图形化开发笔记(3) GPIO配置P1.6为输出。
main.c
/** Standard MSP430 includes */
#include msp430.h/** Grace related includes */
#include ti/mcu/msp430/Grace.h/** main */
int main(void)
{Grace_init(); // Activate Grace-generated configuration// Fill-in user code here __bis_SR_register(LPM3_bits GIE);return (0);
}
InterruptVectors_init.c /** Timer0_A3 Interrupt Service Routine */
#pragma vectorTIMER0_A0_VECTOR
__interrupt void TIMER0_A0_ISR_HOOK(void)
{/* USER CODE START (section: TIMER0_A0_ISR_HOOK) *//* replace this comment with your code */if(P1OUT BIT6)P1OUT ~BIT6;elseP1OUT | BIT6;/* USER CODE END (section: TIMER0_A0_ISR_HOOK) */
}现象 可在P1.6上观测到约1Hz的脉冲 产生误差的原因是作为时钟源的12kHz ACLK不准设置ACLK输出后我这片实测为12.5kHz 重新设定计数周期数即可 50Hz PWM
Grace配置 设定时钟源和周期 配置占空比、输出引脚和模式
main.c
/** Standard MSP430 includes */
#include msp430.h/** Grace related includes */
#include ti/mcu/msp430/Grace.h/** main */
int main(void)
{Grace_init(); // Activate Grace-generated configuration// Fill-in user code here while(1){;}
// return (0);
}现象 改变占空比
main.c
/** Standard MSP430 includes */
#include msp430.h/** Grace related includes */
#include ti/mcu/msp430/Grace.h#define MCLK_IN_HZ 16000000#define delay_us(x) __delay_cycles((MCLK_IN_HZ/1000000*(x)))
#define delay_ms(x) __delay_cycles((MCLK_IN_HZ/1000*(x)))/** main */
int main(void)
{char i 0;Grace_init(); // Activate Grace-generated configuration// Fill-in user code here while(1){TA0CCR1 (TA0CCR0 1) * (i/100.) - 1;delay_ms(10);if (i 100)i 0;}
// return (0);
}
现象