2148|3

30

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

pwm的三路输出 [复制链接]

/****************************************************************************
名称:3路输出的pwm波
参数:
端口:
说明:三路输出.选择p4.1-TB1,P4.2-TB2,P4.3-TB3
****************************************************************************/
#include

void clk_init(void)
{
  volatile unsigned int i;
  BCSCTL1 |= XTS;                           // ACLK = LFXT1 = HF XTAL打开XT振荡器      (XTS:选择LFXT1工作在低频晶体模式(XTS=0)还是高频晶体模式(XTS=1))
  BCSCTL2 |= SELM_2+SELS;                   // SELM_2:选MCLK的时钟源选择为XT2,SELS:选SMCLK为XT2;8m
  do
  {
  IFG1 &= ~OFIFG;                           // Clear OSCFault flag:清除振荡错误标志
  for (i = 0xFF; i > 0; i--);               // Time for flag to set
  }
  while ((IFG1 & OFIFG));                   // OSCFault flag still set?:如果标志为1,则继续循环等待
  IFG1&=~OFIFG;
}

void pwm_init(void)
{
  P4DIR |= 0x0e;                           // P4.1 and P4.2 and P4.3 output
  P4SEL |= 0x0e;                           // P4.2 and P4.2 TB1/2 otions
  TBCCR0 = 800;                            //PWM信号频率10KHZ
  TBCCTL1 = OUTMOD_7;                                     // CCR1 reset/set
  TBCCR1 = 400;                            // 占空比为50%
  TBCCTL2 = OUTMOD_7;                                     // CCR2 reset/set
  TBCCR2 = 400;                            // 占空比为50%
  TBCCTL3 = OUTMOD_7;                                     // CCR3 reset/set
  TBCCR3 = 400;                            // 占空比为50%
  TBCTL = TBSSEL_1 + MC_1;                 // ACLK, up mode // 时钟源:ACLK// up mode:定时器重复从0计数到TAxCCR0
  _BIS_SR(CPUOFF);                          // Enter LPM0
}

int main(void)
{
         WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
         clk_init();
         pwm_init();
         while(1);

}
/*************************************************************************************************/
这是我写的msp430f149三路输出,用的time—b。编译通过了,但是不知道对不对,大神可以帮我看一下吗。
还有“TBCTL = TBSSEL_1 + MC_1;”选择aclk和选择mclk有什么区别吗?之前时钟源都选的XT2。有点混乱啊  

最新回复

#include "msp430.h" typedef unsigned char uchar; typedef unsigned int  uint; uchar flag; uchar table[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,\ 21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,\ 44,45,46,47,48,49,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,\ 33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,\ 10,9,8,7,6,5,4,3,2,1,0};//呼吸的效果 void main(void) {   uchar i;   WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT      BCSCTL1 &= ~XT2OFF;                       //打开xt2晶振   do   {    IFG1 &= ~OFIFG;    for(i = 0xff; i > 0; i--);   }   while((IFG1 & OFIFG));                    //等待起振,消除晶体失败标志      BCSCTL2 |= SELM_2 + SELS;                 //mclk.smclk选择高频晶振   TACTL |= TASSEL_2 + ID_3 + MC_1;          //计数时钟选测smclk,8分频,增计数模式 1mhz //TBCTL |= TBSSEL_2 + ID_3+ MC_1 ;   TBCTL|= TBSSEL_2 + TBCLGRP_0 + ID_3 + MC_1 ;      P4SEL|=BIT2;   P4DIR|=BIT2;       TBCCR0 = 50;                             // 50us de 周期   TBCCTL1 = OUTMOD_3+CLLD_0; //  TBCCTL1 &= ~CAP;   TACCR0 =5000;   TACCTL0 = CCIE;                         // 开中断使能       _EINT();                                 // Enter LPM0 w/ interrupt //  LPM0;                                    //低功耗    while(1);                                 //应该不会进入此句 } #pragma  vector  = TIMERA0_VECTOR __interrupt void timeA() { static uchar  i = 0; flag++;   P2DIR = 0XFF;   P2OUT = 0XFF; if(flag == 4)                             //大概20 ms时 较为理想 {       flag = 0;    TBCCR1 = table[i++];    if(i > 100)    { i = 0;         P2DIR = 0XFF;      P2OUT = 0X00;    }     } }你看看我写的, 不过不行啊, 而且哦找不到问题  详情 回复 发表于 2015-3-28 13:11
 
点赞 关注

回复
举报

928

帖子

0

TA的资源

纯净的硅(中级)

沙发
 
对不对要下载到板子上验证一下呀,上半段的缩进格式不好,看得有点累。
 
 

回复

14

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
你这个有用吗
 
 
 

回复

14

帖子

0

TA的资源

一粒金砂(中级)

4
 

#include "msp430.h"
typedef unsigned char uchar;
typedef unsigned int  uint;
uchar flag;
uchar table[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,\
21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,\
44,45,46,47,48,49,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,\
33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,\
10,9,8,7,6,5,4,3,2,1,0};//呼吸的效果
void main(void)
{
  uchar i;
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  
  BCSCTL1 &= ~XT2OFF;                       //打开xt2晶振
  do
  {
   IFG1 &= ~OFIFG;
   for(i = 0xff; i > 0; i--);
  }
  while((IFG1 & OFIFG));                    //等待起振,消除晶体失败标志
  
  BCSCTL2 |= SELM_2 + SELS;                 //mclk.smclk选择高频晶振
  TACTL |= TASSEL_2 + ID_3 + MC_1;          //计数时钟选测smclk,8分频,增计数模式 1mhz
//TBCTL |= TBSSEL_2 + ID_3+ MC_1 ;
  TBCTL|= TBSSEL_2 + TBCLGRP_0 + ID_3 + MC_1 ;
  

  P4SEL|=BIT2;
  P4DIR|=BIT2;
   
  TBCCR0 = 50;                             // 50us de 周期

  TBCCTL1 = OUTMOD_3+CLLD_0;
//  TBCCTL1 &= ~CAP;
  TACCR0 =5000;
  TACCTL0 = CCIE;                         // 开中断使能

   
  _EINT();                                 // Enter LPM0 w/ interrupt
//  LPM0;                                    //低功耗
  
while(1);                                 //应该不会进入此句
}
#pragma  vector  = TIMERA0_VECTOR
__interrupt void timeA()
{
static uchar  i = 0;
flag++;
  P2DIR = 0XFF;
  P2OUT = 0XFF;
if(flag == 4)                             //大概20 ms时 较为理想
{   
   flag = 0;
   TBCCR1 = table[i++];
   if(i > 100)
   { i = 0;   
     P2DIR = 0XFF;
     P2OUT = 0X00;
   }

   
}
}你看看我写的, 不过不行啊, 而且哦找不到问题
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
Microchip 直播|利用motorBench开发套件高效开发电机磁场定向控制方案 报名中!
直播主题:利用motorBench开发套件高效开发电机磁场定向控制方案
直播时间:2025年3月25日(星期二)上午10:30-11:30
快来报名!

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表