MSP430在功率电子方面的一个应用,由MSP430产生SPWM波的主程序,由于程序较多所以完整的程序在附件里。这个程序是原来做比赛的时候用的,单片机出来的波形经过整形再经过光耦以及其他变换后用来驱动后级的全桥用的。不过用MSP430来做这个感觉有点吃力,MSP430F1611的主频只有8M,细化占空比时微调不好弄。编程也有点复杂。如果你有更好的解决方案或者思路希望能一起探讨。互相交流,共同进步~
/*
函数名: SPWM
函数功能: TA定时产生高低电平,改变定时时间即改变占空比
*/
#include
#include "math.h"
#include "lcdcaidan.h"
#include "lcd.h"
#include "SHUZHI.h"
/******************************函数声明*****************************************/
void Clock_Init();
void time_js();
void TA_init();
void TB_init();
void io_init();
/*******************************宏定义******************************************/
#define uchar unsigned char
#define uint unsigned int
#define keyin (P2IN&0x1f) //注P2.0~P2.4为输入
#define PI 3.1415926
#define shuzhi 50.0
/***************************变量定义*******************************************/
static float Um=1.0;
uchar doit=0;
unsigned int i,j,TA_flag=1;
unsigned int k=0;
static float f=400.0;
float time1[50],time3[50];
int time2[50],time4[50];
int time[51][3];
/*======================主函数=====================*/
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; //关看门狗
Clock_Init();
io_init();
time_js();
TA_init();
_EINT();
while(1);
}
/*================ 初始化IO===========================
函数名称:
函数功能:
函数参数:
================================================*/
void io_init()
{
P1DIR |= BIT2; // P1.2 output
}
/*===================数据处理=========================
函数名称: 计算SPWM的占空比值,即是定时器A产生PWM的占空比值
函数功能:
函数参数:t=(Um/W)*(cos (k-1/N )*pi - cos (k/N)*pi )
=================================================*/
void time_js()
{
for(k=1;k<=shuzhi;k++)
{
time1[k]=((Um/(2*PI*f))*(cos((k-1)*PI/shuzhi)-cos(k*PI/shuzhi))*8000000)*0.6;
}
for(k=1;k<=shuzhi;k++)
{
time3[k]=(((8000000.0/f/shuzhi/2.0)-time1[k])*0.5);
}
for(k=1;k<=shuzhi;k++)
{
time2[k]=(int)time1[k];
}
for(k=1;k<=shuzhi;k++)
{
time4[k]=(int)time3[k];
}
for(k=1;k<=shuzhi;k++)
{
time[k][0]=time4[k];//低电平
time[k][1]=time2[k];//高电平
time[k][2]=time4[k];
}
}
/*===============TA的初始化设置=========================
函数名称: void TA_dingshi()
函数功能:定时器A捕获设置,用于捕获上升沿
函数参数:
===========================================*/
void TA_init()
{
TACCR0 = 5;
TACTL = TASSEL_2 + MC_1;
TACCTL0 = CCIE;
}
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
if(TA_flag==150)
{
TA_flag=1;
}
i=TA_flag/3;
j=TA_flag%3;
if(i<50)
{
i++;
}
else if(i>50)
{
i--;
}
TACCR0 = time[j];
if(j==1)
{
//P1OUT |= BIT2;
P1OUT &= ~BIT2;
}
else
{
//P1OUT &= ~BIT2;
P1OUT |= BIT2;
}
TA_flag++;
}
/******************************时钟模块*****************************************
函数功能:初始化XT2时钟函数
*******************************************************************************/
void Clock_Init()
{
uint iq0;
BCSCTL1 &= ~XT2OFF; //打开XT2振荡器
do
{
IFG1 &= ~OFIFG; //清除振荡器失效标志
for (iq0 = 0xFF; iq0 > 0; iq0--); //延时,等待XT2起振
}
while ((IFG1 & OFIFG) != 0); //判断XT2是否起振
BCSCTL2 = SELM_2 + SELS; //选择MCLK、SMCLK为XT2
//为高速时钟 不分频,均为8M
}
sunce_464022046 2015-4-13 20:56
用户1758662 2015-4-13 09:00
用户434164 2013-9-8 16:22
用户441936 2013-8-28 23:26
用户443537 2013-8-27 11:22
用户1674512 2013-8-23 20:43
用户441719 2013-8-19 10:58
用户447381 2013-8-8 17:14
用户445337 2013-8-6 19:55
用户444066 2013-7-5 16:25