MSP430F5529通过定时器A产生两个反相频率占空比可调PWM波

本文介绍了如何使用MSP430F5529单片机通过定时器A产生两个反相、频率和占空比可调的PWM波。实验中,频率范围从50Hz到1KHz,占空比从10%到90%,并能通过按键S1和S2进行设置。同时,利用单片机的捕获/比较器功能,测量PWM波的频率和占空比并在OLED12864显示屏上显示。连接图和部分代码示例也进行了展示。
摘要由CSDN通过智能技术生成

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口
连接图如下:
在这里插入图片描述A
上代码

定时器设置:

/************************************************************
  文件名称:                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 
PWM调光,脉宽与光的亮度成正比 /*----------------------------------------------- 名称:PWM 调光 日期:2009.5 修改:无 内容:1、学习目的:利用定时器产生PWM,了解原理和使用方法 2、硬件要求:LED灯 定时器 3、试验现象:LED灯由亮到灭,由灭到亮逐步变化,也就是调光现象 ------------------------------------------------*/ #include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义 sbit LED = P1^2; sbit LED2 = P1^1; //定义LED灯,通过LED显示调光效果 unsigned char CYCLE; //定义周期 该数字X基准定时时间 如果是10 则周期是10 x 0.1ms unsigned char PWM_ON, PWM_ON2;//定义高电平时间 /******************************************************************/ /* 延时函数 */ /******************************************************************/ void delay(unsigned int cnt) { while(--cnt); } void Init0() {TMOD |=0x01; //定时器设置 0.1ms in 12M crystal 16位工作模式 TH0=(65536-100)/256; TL0=(65536-100)%256; IE= 0x82; //打开中断 TR0=1;} void Init1() {TMOD |=0x10; //定时器设置 0.1ms in 12M crystal 16位工作模式 TH1=(65536-100)/256; TL1=(65536-100)%256; IE= 0x82; ET1=1; } /******************************************************************/ /* 主函数 */ /******************************************************************/ main() { bit Flag; Init0(); Init1(); if((TH0=(65536-6)/256 )&&(TL0=(65536-6)%256))//与定时器1初值相差100,则相位改变1/10T,相差500,相位改变1/2T TR1=1;//打开中断 CYCLE =10; // 时间可以调整 这个是10调整 8位PWM就是256步 pwm周期=CYCLE*定时时间 while(!Flag) { delay(20000); //延时时间,从一个亮度到下一个亮度的间隔时间,速度快就能看到连续效果 PWM_ON=6; PWM_ON2=6; //这个使用较长延时,以便能看清楚变化过程 控制占空比q=(CYCLE-PWM_ON-1)/CYCLE if(PWM_ON ==PWM_ON2== CYCLE) { //这个里可以添加其他程序 如到最亮时候控制设备 Flag=1; } } while(Flag) //亮度递减 同上,是个相反的过程 { delay(20000); PWM_ON--; PWM_ON2--; if(PWM_ON == 0||PWM_ON2==0) { Flag=0; } } } /******************************************************************/ /* 定时器中断函数
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值