原创 【TI博客大赛】430也疯狂--MSP430单片机产生SPWM波

2012-11-27 09:51 6544 11 38 分类: MCU/ 嵌入式

MSP430在功率电子方面的一个应用,由MSP430产生SPWM波的主程序,由于程序较多所以完整的程序在附件里。这个程序是原来做比赛的时候用的,单片机出来的波形经过整形再经过光耦以及其他变换后用来驱动后级的全桥用的。不过用MSP430来做这个感觉有点吃力,MSP430F1611的主频只有8M,细化占空比时微调不好弄。编程也有点复杂。如果你有更好的解决方案或者思路希望能一起探讨。互相交流,共同进步~8637594576_time_1273025795618.jpg

/*
函数名:  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
}
 
                rd_or_f073a17bf0d61a90df627a3fe3de0bec.jpg105855z7s4bvz44dxfix4w.jpg
 
 
 

文章评论27条评论)

登录后参与讨论

sunce_464022046 2015-4-13 20:56

hao

用户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

正在做,谢楼主!
相关推荐阅读
用户380727 2013-03-07 12:08
闭关学习
又是一个转折点,压力很大,需要很多准备,多学习。...
用户380727 2012-12-30 23:57
值得一读的高精度 TI 正峰值检测英文原版文档
  这个是英文原版的正峰值检测文档,非常值得大家细细的品味,我按照文档中的电路验证过精度非常高,误差只有20mv.虽然是英文的但是还是能读懂的,还是可以好好阅读一下,对电路的原理的理解有一定帮...
用户380727 2012-12-29 12:42
DIY style- U盘MP3制作
《好声音》--STM32 U盘MP3 有想法就大胆的去实现吧! 大三的时候做的一个小制作,实验室手工打造,主控芯片采用 STM32,在一块开发板上做了转接板 引出来外扩的,解码芯片是采用V...
用户380727 2012-12-28 12:32
即将过去的2012
玛雅人没有预言到2012世界末日,生活依旧,即将过去的2012,几多欢喜,回顾过往的日子,几许唏嘘,向前看,还有几天时间,合理安排,希望2013的第一件大事是过去的这半年应该得到的结果!加油!...
用户380727 2012-12-01 19:09
加油!
12月新的征程!新的开始!不要迟疑!不要等待! 坚持你的梦想走下去!加油!...
我要评论
27
11
关闭 站长推荐上一条 /2 下一条