电设之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定时部分
- /*
- * TA0.h
- *
- * Created on: 2015年7月24日
- * Author: Clover
- */
-
- #ifndef TA0_H_
- #define TA0_H_
- #include <msp430.h>
-
- void TA0_Init()
- {
- TA0CCTL0 = CCIE; // CCR0 interrupt enabled
- TA0CCR0 = 10;
- // TA0CTL = TASSEL_1 + MC_1 + TACLR; // ACLK, upmode, clear TAR
- TA0CTL = TASSEL_2 + MC_1 + TACLR; // SMCLK, upmode, clear TAR
- }
- #endif /* TA0_H_ */
先上TA0_PWM
- /*
- * TA0_PWM.h
- *
- * Created on: 2015年8月2日
- * Author: Clover
- */
-
- #ifndef TA0_PWM_H_
- #define TA0_PWM_H_
-
- #define DEADTIME 20 //预设死区时间,以TA的clk为单位
- /*******设定TA输出IO,目前设定为MSP430F5529 Time A0********/
- #define TA01_SET P1SEL |= BIT2; P1DIR |= BIT2 //P1.2
- #define TA02_SET P1SEL |= BIT3; P1DIR |= BIT3 //P1.3
- #define TA03_SET P1SEL |= BIT4; P1DIR |= BIT4 //P1.4
- #define TA04_SET P1SEL |= BIT5; P1DIR |= BIT5 //P1.5
-
- #define TA01_OFF P1SEL &= ~BIT2; //P1.2
- #define TA02_OFF P1SEL &= ~BIT3; //P1.3
- #define TA03_OFF P1SEL &= ~BIT4; //P1.4
- #define TA04_OFF P1SEL &= ~BIT5; //P1.5
- /******************************************************************************************************
- * 名 称:TA0_PWM_Init()
- * 功 能:TA0定时器作为PWM发生器的初始化设置函数
- * 入口参数:Clk:时钟源 'S'=SMCLK; 'A'=ACLK ; 'E'=TACLK(外部输入); 'e'= TACLK(TACLK取反)
- Div:时钟分频系数: 1/2/4/8
- Mode1:通道1的输出模式 'F'设为超前PWM(模式7),'B'滞后PWM(模式3),'D'带死区增PWM(模式6),0=禁用
- Mode2:通道2的输出模式 'F'设为超前PWM(模式7),'B'滞后PWM(模式3),'D'带死区减PWM(模式2),0=禁用
- 设置输出带死区控制的PWM时,两通道均需使用,且均为死区模式。
- * 出口参数:1表示设置成功,0表示参数错误,设置失败。
- * 说 明 : 在调用PWM相关函数之前,需要调用该函数设置TA的模式和时钟源。
- * 范 例 : TA0_PWM_Init('A',1,'F','F')TA时钟设为ACLK,通道1和通道2均为超前PWM输出
- TA0_PWM_Init('S',4,'D','D')TA时钟设为SMCLK/4, 通道1为死区增PWM、通道2为死区减PWM
- TA0_PWM_Init('A',1,'F',0)TA时钟设为ACLK,通道1超前PWM输出,通道2不作TA用。
- ******************************************************************************************************/
- char TA0_PWM_Init(char Clk,char Div,char Mode1,char Mode2)
- {
- TA0CTL =0; // 清除以前设置
-
- switch(Mode1)//为定时器选择计数模式
- {
- case 'F': case 'f': //普通PWM
- TA0CTL |=MC_1; break; //单调增模式 定时器循环地从0增到TACCR0的值
- case 'B':case 'b':
- TA0CTL |=MC_1; break; //连续模式 定时器循环地从0连续增加到0FFFFH
- case 'D': case 'd': //死区PWM
- TA0CTL |=MC_3; break; //主定时器为增减计数模式 定时器循环地从0增到TACCR0的值再连续减至0
- default : return(0); //其他情况都是设置参数有误,返回0
- }
- switch(Clk)//为定时器TA选择时钟源
- {
- case 'A': case 'a': TA0CTL|=TASSEL_1; break; //ACLK
- case 'S': case 's': TA0CTL|=TASSEL_2; break; //SMCLK
- case 'E': TA0CTL|=TASSEL_0; break; //外部输入(TACLK)
- case 'e': TA0CTL|=TASSEL_3; break; //外部输入(TACLK取反)
- default : return(0); //设置参数有误,返回0
- }
- switch(Div)//为定时器TA选择分频系数
- {
- case 1: TA0CTL|=ID_0; break; //1
- case 2: TA0CTL|=ID_1; break; //2
- case 4: TA0CTL|=ID_2; break; //4
- case 8: TA0CTL|=ID_3; break; //8
- default : return(0); //设置参数有误,返回0
- }
- switch(Mode1) //设置PWM通道1的输出模式。
- {
- case 'F': case 'f':
- TA0CCTL1 = OUTMOD_7;
- TA01_SET;
- break;
- case 'B': case 'b':
- TA0CCTL1 = OUTMOD_3;
- TA01_SET;
- break;
- case 'D': case'd':
- TA0CCTL1 = OUTMOD_6;
- TA01_SET;
- break;
- case '0':case 0: //如果设置为禁用
- TA01_OFF; //TA0.1恢复为普通IO口
- break;
- default : return(0); //设置参数有误,返回0
- }
- switch(Mode2)//设置PWM通道2的输出模式。
- {
- case 'F': case 'f':
- TA0CCTL2 = OUTMOD_7;
- TA02_SET;
- break;
- case 'B': case 'b':
- TA0CCTL2 = OUTMOD_3;
- TA02_SET;
- break;
- case 'D': case 'd':
- TA0CCTL2 = OUTMOD_2;
- TA02_SET;
- break;
- case '0':case 0: //如果设置为禁用
- TA02_OFF; //TA0.1恢复为普通IO口
- break;
- default : return(0); //设置参数有误,返回0
- }
- return(1);
- }
- /******************************************************************************************************
- * 名 称:TA0_PWM_SetPeriod()
- * 功 能:设置PWM发生器的周期
- * 入口参数:Channel: TA0=0, TA1=1
- * Period:周期(0~65535) 时钟个数
- * 出口参数:1:设置成功 0:设置失败
- * 说 明 : 普通PWM与带死区PWM周期相差一倍
- * 范 例 : TA0_PWM_SetPeriod(500)设置PWM方波周期为500或1000个时钟周期
- ******************************************************************************************************/
- char TA0_PWM_SetPeriod(unsigned int Period)
- {
- if (Period>65535) return(0);
- TA0CCR0 = Period;
- return(1);
- }
-
- /******************************************************************************************************
- * 名 称:TA0_PWM_SetPermill()
- * 功 能:设置PWM输出的占空比(千分比)
- * 入口参数:Channel: 当前设置的通道号 1/2
- Duty: PWM高电平有效时间的千分比 (0~1000),
- * 出口参数:1设置成功,0设置失败
- * 说 明: 1000=100.0% 500=50.0% ,依次类推。死区模式时,两channel同时设定。
- * 范 例: TA0_PWM_SetPermill(1,300)设置PWM通道1方波的占空比为30.0%
- TA0_PWM_SetPermill(2,825)设置PWM通道2方波的占空比为82.5%
- ******************************************************************************************************/
- char TA0_PWM_SetPermill(char Channel,unsigned int Duty)
- {
- unsigned char Mod = 0;
- unsigned long int Percent=0; //防止乘法运算时溢出
- Percent=Duty;
- switch (Channel) //先判断出通道的工作模式
- {
- case 1:
- Mod = (TA0CCTL1& 0x00e0)>>5; break; //读取输出模式,OUTMOD0位于5-7位
- case 2:
- Mod = (TA0CCTL2 & 0x00e0)>>5; break; //读取输出模式,OUTMOD1位于5-7位
- default: return(0);
- }
- switch(Mod) //根据模式设定TACCRx
- {
- case 2: case 6: /**死区模式2,6时,需要判断修正死区时间,且同时设定TA0CCR1/2 的值*/
- {
- if((1000-2*Percent)<=DEADTIME) //预留死区时间
- Percent=(1000-DEADTIME)/2;
- TA0CCR1=Percent*TA0CCR0/1000;
- TA0CCR2= TA0CCR0-TA0CCR1;
- break;
- }
- case 7:
- {
- if(Percent>1000) Percent=1000;
- if(Channel==1) TA0CCR1=Percent* TA0CCR0/1000;
- if(Channel==2) TA0CCR2=Percent* TA0CCR0/1000;
- break;
- }
- case 3: //占空比一律为正脉宽,所以需要 TA0CCR0减去占空比
- {
- if(Percent>1000) Percent=1000;
- if(Channel==1) TA0CCR1= TA0CCR0-Percent*TA0CCR0/1000;
- if(Channel==2) TA0CCR2= TA0CCR0-Percent*TA0CCR0/1000;
- break;
- }
- default: return(0);
- }
- return (1);
- }
- #endif /* TA0_PWM_H_ */
今年准备电赛时候自己写的SPWM的代码
- const uint16_t SPWM_Table[] = {500,586,671,750,821, 883,969,992,1000,992, 969,883,821,750,671,
- 586,500,413,327,250, 179,117,67,30,8 ,0,8,30,67,117,179,250,327,413};
看门狗定时器WDT
- /*
- * WDT.h
- *
- * Created on: 2015年7月23日
- * Author: Clover
- */
-
- #ifndef WDT_H_
- #define WDT_H_
- #include <msp430.h>
- void WDT_init()
- {
- WDTCTL=WDT_ADLY_250; //-----设定WDT为250ms中断-----
- SFRIE1 |= WDTIE; //-----WDT中断使能-----
-
- //中断初始化程序
- }
-
- // Watchdog Timer interrupt service routine
- #pragma vector=WDT_VECTOR
- __interrupt void WDT_ISR(void)
- {
- //中断事件
- }
-
- #endif /* WDT_H_ */
上代码。。。。
[url=]电设之F5529(4)定时器.ra ...[/url]
本帖最后由 sunduoze 于 2015-8-28 17:01 编辑