MSP430F5529通过定时器A产生两个反相频率占空比可调PWM波
MSP430F5529的定时器还是挺好用的,具有定时计数和捕获的功能,具有高达7个捕获比较寄存器,支持多路捕获/比较。这里我用到了两个定时器产生两个反相的PWM波并通过一个捕获比较器捕获其中一个PWM波,显示在OLED12864显示屏上(本实验使用的是MSP-EXP430F5529LP开发板,使用的软件是IAR)。
实现的功能为:
1、利用MSP430内部PWM波发生器产生两路反相频率为 50Hz到1KHz,占空比为10%到90%的PWM波。
2、要求频率和占空比通过按键S1和S2分别设置。频率按50Hz步进,占空比按10%步进。
3、利用MSP430单片机的捕获/比较器测量该PWM波 的频率和占空比,且显示于oled屏幕上。
(这里使用的显示屏是四针的oled12864)
连接方式为SDA口连接P6.5
SCL口连接P6.0
同时使用的VCC是3V
P1.2口和P1.4口输出反相的可调频率和周期的PWM波
P2.0为捕获输入,所以需要连接P1.2口和P2.0口
连接图如下:
上代码
定时器设置:
/************************************************************
文件名称: timer.c
文件概述: 对TA0输出PWM波 TA1进行输入捕获的配置工作
包含的头文件及概述: timer.h :函数声明及部分宏定义
引脚声明:
TA0 PWM波输出口 :P1.2 P1.4
TA1 输入捕获输入口:P2.0
*************************************************************/
#include "msp430f5529.h"
#include "timer.h"
char flag=0; //用于标记当前捕获状态 0:就绪 1:捕获到一个上升沿 2:捕获到一个下降沿
unsigned int pos_time=0; //用于记录正脉宽
unsigned int period =0; //用于记录周期
unsigned int start =0; //开始测量上升沿
unsigned int pause =0;
unsigned int num[3];
unsigned int T,TP,D;
/******************
PWM波初始化
输出两种反相的PWM波
********************/
void PWM_Init( void )
{
P1DIR |= BIT2; //配置P1.2复用为定时器TA0.1
P1SEL |= BIT2; //配置P1.2为输出
P1DIR |= BIT4; //配置P1.4复用为定时器TA0.3
P1SEL |= BIT4; //配置P1.4为输出
TA0CTL = TASSEL_2 + MC_1 + TACLR + ID_3;//使用SMCLK为时钟源 增计数模式 8分频
TA0CCTL1 = OUTMOD_7 ; //TA0输出模式7
TA0CCTL3 = OUTMOD_3 ; //TA3输出模式3
TA0CCR0 = 10000 ; //初始化频率50赫兹
TA0CCR1 = 1000 ; //初始化占空比为10%
}
/******************
捕捉器初始化
Capture 函数
********************/
void Capture_Init(void)
{
P2DIR &= ~BIT0 ; //配置P2.0复用为定时器TA1.1
P2SEL |= BIT0 ; //配置P2.0为输入
TA1CTL