2716|6

574

帖子

11

TA的资源

一粒金砂(高级)

楼主
 

电设之F5529(4)定时器 [复制链接]

本帖最后由 sunduoze 于 2015-8-28 17:01 编辑


电设之F5529(1)UCS
电设之F5529(2)OLED(外设)
电设之F5529(3)SPI
电设之F5529(4)定时器
电设之F5529(5)KEY(外设)
电设之F5529(6)ADS1118(外设)
电设之F5529——我的核心系统板



内部包含了TA0,又单独的定时功能模块、PWM模块同时包含了WDT定时功能
PWM模块可以长生双路的PWM同时还支持死区配置
可以自行更改占空比、频率(保证小于IO的翻转速度)、
时钟源等

功能:  1、定时器TA0、WDT(仅使用定时功能)
             2、定时器TA0 配置的PWM(可双路输出、死区设置)
说明;  内部有详细说明,自行配置
         

先上TA0定时部分
  1. /*
  2. * TA0.h
  3. *
  4. *  Created on: 2015年7月24日
  5. *      Author: Clover
  6. */

  7. #ifndef TA0_H_
  8. #define TA0_H_
  9. #include <msp430.h>

  10. void TA0_Init()
  11. {
  12.         TA0CCTL0 = CCIE;                          // CCR0 interrupt enabled
  13.         TA0CCR0 = 10;
  14. //        TA0CTL = TASSEL_1 + MC_1 + TACLR;         // ACLK, upmode, clear TAR
  15.         TA0CTL = TASSEL_2 + MC_1 + TACLR;         // SMCLK, upmode, clear TAR
  16. }
  17. #endif /* TA0_H_ */
复制代码
先上TA0_PWM
  1. /*
  2. * TA0_PWM.h
  3. *
  4. *  Created on: 2015年8月2日
  5. *      Author: Clover
  6. */

  7. #ifndef TA0_PWM_H_
  8. #define TA0_PWM_H_

  9. #define DEADTIME 20                                                        //预设死区时间,以TA的clk为单位
  10. /*******设定TA输出IO,目前设定为MSP430F5529          Time A0********/
  11. #define TA01_SET         P1SEL |= BIT2; P1DIR |= BIT2                //P1.2
  12. #define TA02_SET         P1SEL |= BIT3; P1DIR |= BIT3                //P1.3
  13. #define TA03_SET         P1SEL |= BIT4; P1DIR |= BIT4                //P1.4
  14. #define TA04_SET         P1SEL |= BIT5; P1DIR |= BIT5                //P1.5

  15. #define TA01_OFF         P1SEL &= ~BIT2;                                         //P1.2
  16. #define TA02_OFF         P1SEL &= ~BIT3;                                         //P1.3
  17. #define TA03_OFF         P1SEL &= ~BIT4;                                         //P1.4
  18. #define TA04_OFF         P1SEL &= ~BIT5;                                         //P1.5
  19. /******************************************************************************************************
  20. * 名       称:TA0_PWM_Init()
  21. * 功       能:TA0定时器作为PWM发生器的初始化设置函数
  22. * 入口参数:Clk:时钟源 'S'=SMCLK;   'A'=ACLK ;   'E'=TACLK(外部输入); 'e'= TACLK(TACLK取反)
  23.                         Div:时钟分频系数: 1/2/4/8
  24.                         Mode1:通道1的输出模式 'F'设为超前PWM(模式7),'B'滞后PWM(模式3),'D'带死区增PWM(模式6),0=禁用
  25.                         Mode2:通道2的输出模式 'F'设为超前PWM(模式7),'B'滞后PWM(模式3),'D'带死区减PWM(模式2),0=禁用
  26.                         设置输出带死区控制的PWM时,两通道均需使用,且均为死区模式。
  27. * 出口参数:1表示设置成功,0表示参数错误,设置失败。
  28. * 说       明 : 在调用PWM相关函数之前,需要调用该函数设置TA的模式和时钟源。
  29. * 范       例 : TA0_PWM_Init('A',1,'F','F')TA时钟设为ACLK,通道1和通道2均为超前PWM输出
  30.                                 TA0_PWM_Init('S',4,'D','D')TA时钟设为SMCLK/4, 通道1为死区增PWM、通道2为死区减PWM
  31.                                 TA0_PWM_Init('A',1,'F',0)TA时钟设为ACLK,通道1超前PWM输出,通道2不作TA用。
  32. ******************************************************************************************************/
  33. char TA0_PWM_Init(char Clk,char Div,char Mode1,char Mode2)
  34. {
  35.   TA0CTL =0;                                                                                                                                                // 清除以前设置

  36.   switch(Mode1)//为定时器选择计数模式
  37.   {
  38.           case 'F': case 'f':                                                                                                                                //普通PWM
  39.                           TA0CTL |=MC_1; break;                                                                                        //单调增模式 定时器循环地从0增到TACCR0的值
  40.           case 'B':case 'b':
  41.                           TA0CTL |=MC_1; break;                                                                                        //连续模式  定时器循环地从0连续增加到0FFFFH
  42.           case 'D': case 'd':                                                                                                                                //死区PWM
  43.                           TA0CTL |=MC_3; break;                                                                                        //主定时器为增减计数模式 定时器循环地从0增到TACCR0的值再连续减至0
  44.           default : return(0);                                                                                                                        //其他情况都是设置参数有误,返回0
  45.   }
  46.   switch(Clk)//为定时器TA选择时钟源
  47.   {
  48.                 case 'A': case 'a':          TA0CTL|=TASSEL_1; break;                           //ACLK
  49.                 case 'S': case 's':         TA0CTL|=TASSEL_2; break;                          //SMCLK
  50.                 case 'E':                    TA0CTL|=TASSEL_0; break;                          //外部输入(TACLK)
  51.                 case 'e':                          TA0CTL|=TASSEL_3; break;                           //外部输入(TACLK取反)
  52.                 default :  return(0);                                                                                                                  //设置参数有误,返回0
  53.   }
  54.   switch(Div)//为定时器TA选择分频系数
  55.   {
  56.         case 1:   TA0CTL|=ID_0; break;   //1
  57.         case 2:   TA0CTL|=ID_1; break;   //2
  58.         case 4:   TA0CTL|=ID_2; break;   //4
  59.         case 8:   TA0CTL|=ID_3; break;   //8
  60.         default :  return(0);                                                                                                                  //设置参数有误,返回0
  61.   }
  62.   switch(Mode1)        //设置PWM通道1的输出模式。
  63.   {
  64.                 case 'F':        case 'f':
  65.                           TA0CCTL1 = OUTMOD_7;
  66.                           TA01_SET;
  67.                           break;
  68.                 case 'B':        case 'b':
  69.                           TA0CCTL1 = OUTMOD_3;
  70.                           TA01_SET;
  71.                           break;
  72.                 case 'D': case'd':
  73.                           TA0CCTL1 = OUTMOD_6;
  74.                           TA01_SET;
  75.                           break;
  76.                 case '0':case 0:                                                                                                                           //如果设置为禁用
  77.                           TA01_OFF;                                                                                                                           //TA0.1恢复为普通IO口
  78.                           break;
  79.                 default :  return(0);                                                                                                                   //设置参数有误,返回0
  80.   }
  81.   switch(Mode2)//设置PWM通道2的输出模式。
  82.   {
  83.                 case 'F':         case 'f':
  84.                           TA0CCTL2 = OUTMOD_7;
  85.                           TA02_SET;
  86.                           break;
  87.                 case 'B':        case 'b':
  88.                           TA0CCTL2 = OUTMOD_3;
  89.                           TA02_SET;
  90.                           break;
  91.                 case 'D': case 'd':
  92.                           TA0CCTL2 = OUTMOD_2;
  93.                           TA02_SET;
  94.                           break;
  95.                 case '0':case 0:                                                                                                   //如果设置为禁用
  96.                           TA02_OFF;                                                                                                            //TA0.1恢复为普通IO口
  97.                           break;
  98.                 default :  return(0);                                                                                                 //设置参数有误,返回0
  99.     }
  100.   return(1);
  101. }
  102. /******************************************************************************************************
  103. * 名       称:TA0_PWM_SetPeriod()
  104. * 功       能:设置PWM发生器的周期
  105. * 入口参数:Channel: TA0=0, TA1=1
  106. *                     Period:周期(0~65535) 时钟个数
  107. * 出口参数:1:设置成功     0:设置失败
  108. * 说       明 : 普通PWM与带死区PWM周期相差一倍
  109. * 范       例 : TA0_PWM_SetPeriod(500)设置PWM方波周期为500或1000个时钟周期
  110. ******************************************************************************************************/
  111. char TA0_PWM_SetPeriod(unsigned int Period)
  112. {
  113.         if (Period>65535)        return(0);
  114.         TA0CCR0 = Period;
  115.         return(1);
  116. }

  117. /******************************************************************************************************
  118. * 名    称:TA0_PWM_SetPermill()
  119. * 功    能:设置PWM输出的占空比(千分比)
  120. * 入口参数:Channel: 当前设置的通道号  1/2
  121.             Duty: PWM高电平有效时间的千分比 (0~1000),
  122. * 出口参数:1设置成功,0设置失败
  123. * 说    明: 1000=100.0%  500=50.0% ,依次类推。死区模式时,两channel同时设定。
  124. * 范    例: TA0_PWM_SetPermill(1,300)设置PWM通道1方波的占空比为30.0%
  125.             TA0_PWM_SetPermill(2,825)设置PWM通道2方波的占空比为82.5%
  126. ******************************************************************************************************/
  127. char TA0_PWM_SetPermill(char Channel,unsigned int Duty)
  128. {
  129.         unsigned char Mod = 0;
  130.         unsigned long int Percent=0;                                                        //防止乘法运算时溢出
  131.         Percent=Duty;
  132.         switch (Channel)                                                                                                //先判断出通道的工作模式
  133.         {
  134.                 case 1:
  135.                         Mod = (TA0CCTL1& 0x00e0)>>5;                break;        //读取输出模式,OUTMOD0位于5-7位
  136.                 case 2:
  137.                         Mod = (TA0CCTL2 & 0x00e0)>>5;        break;        //读取输出模式,OUTMOD1位于5-7位
  138.                 default:        return(0);
  139.         }
  140.         switch(Mod)                                                                                                                //根据模式设定TACCRx
  141.         {
  142.                 case 2: case 6:                        /**死区模式2,6时,需要判断修正死区时间,且同时设定TA0CCR1/2 的值*/
  143.                 {
  144.                         if((1000-2*Percent)<=DEADTIME)                        //预留死区时间
  145.                                 Percent=(1000-DEADTIME)/2;
  146.                         TA0CCR1=Percent*TA0CCR0/1000;
  147.                         TA0CCR2= TA0CCR0-TA0CCR1;
  148.                         break;
  149.                 }
  150.                 case 7:
  151.                 {
  152.                         if(Percent>1000)        Percent=1000;
  153.                         if(Channel==1) TA0CCR1=Percent* TA0CCR0/1000;
  154.                         if(Channel==2) TA0CCR2=Percent* TA0CCR0/1000;
  155.                         break;
  156.                 }
  157.                 case 3:                //占空比一律为正脉宽,所以需要 TA0CCR0减去占空比
  158.                 {
  159.                         if(Percent>1000)        Percent=1000;
  160.                         if(Channel==1) TA0CCR1= TA0CCR0-Percent*TA0CCR0/1000;
  161.                         if(Channel==2) TA0CCR2= TA0CCR0-Percent*TA0CCR0/1000;
  162.                         break;
  163.                 }
  164.                 default: return(0);
  165.         }
  166.         return (1);
  167. }
  168. #endif /* TA0_PWM_H_ */
复制代码
今年准备电赛时候自己写的SPWM的代码
  1. const uint16_t SPWM_Table[] = {500,586,671,750,821, 883,969,992,1000,992, 969,883,821,750,671,
  2.                                                                 586,500,413,327,250, 179,117,67,30,8       ,0,8,30,67,117,179,250,327,413};
复制代码




看门狗定时器WDT
  1. /*
  2. * WDT.h
  3. *
  4. *  Created on: 2015年7月23日
  5. *      Author: Clover
  6. */

  7. #ifndef WDT_H_
  8. #define WDT_H_
  9. #include <msp430.h>
  10. void WDT_init()
  11. {        
  12.         WDTCTL=WDT_ADLY_250;        //-----设定WDT为250ms中断-----        
  13.         SFRIE1 |= WDTIE;                //-----WDT中断使能-----
  14.          
  15.         //中断初始化程序
  16. }

  17. // Watchdog Timer interrupt service routine
  18. #pragma vector=WDT_VECTOR
  19. __interrupt void WDT_ISR(void)
  20. {
  21.         //中断事件
  22. }

  23. #endif /* WDT_H_ */
复制代码
上代码。。。。

[url=]电设之F5529(4)定时器.ra ...[/url] 电设之F5529(4)定时器.rar (3.37 KB, 下载次数: 14, 售价: 1 分芯积分)

最新回复

谢谢分享   详情 回复 发表于 2017-7-21 21:53
 
点赞 关注

回复
举报

1291

帖子

0

TA的资源

纯净的硅(中级)

沙发
 
代码注释还不错
 
 

回复

33

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
先看看。不知道哪里有5529的中文手册,现在对有哪些寄存器都不清楚
 
 
 

回复

39

帖子

0

TA的资源

一粒金砂(中级)

4
 
。。。。。。。。。。。。。。。。。。。。。。。。。
 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(初级)

5
 
谢谢楼主!!!
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

6
 
谢谢楼主!!!
 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(初级)

7
 
谢谢分享
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表