打印

产生方波问题

[复制链接]
2414|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
someonewho|  楼主 | 2012-9-22 19:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
someonewho|  楼主 | 2012-9-22 19:55 | 只看该作者
因为300k频率大,怎么才能产生一个精确的方波?

使用特权

评论回复
板凳
justbybing| | 2012-9-22 20:31 | 只看该作者
#include "msp430g2553"void main(void)
{
  
WDTCTL = WDTPW + WDTHOLD;                  // Stop WDT
  
    BCSCTL2 = SELM_0 + DIVM_0 + DIVS_1; //2

    if (CALBC1_16MHZ != 0xFF)
    {
        DCOCTL = 0x00;
        BCSCTL1 = CALBC1_16MHZ;      /* Set DCO to 16MHz */
        DCOCTL = CALDCO_16MHZ;
    }
    BCSCTL1 |= XT2OFF + DIVA_0;
    BCSCTL3 = XT2S_0 + LFXT1S_2 + XCAP_1;
   
  P2SEL |= BIT0+BIT1;                        // P2.0 - P2.1 option select
  P2DIR |= BIT0+BIT1;                        // PP.0 - P2.1 outputs
  TA1CCTL0 = OUTMOD_4+ CCIE;                // TA1CCR0 toggle, interrupt enabled
  TA1CCTL1 = OUTMOD_4+ CCIE;              // TA1CCR1 toggle, interrupt enabled

  TA1CTL = TASSEL_2 +  MC_2;          // SMCLK, Contmode, int enabled
  
  _BIS_SR(LPM0_bits + GIE);                 // Enter LPM0 w/ interrupt
}

// Timer A0 interrupt service routine
#pragma vector=TIMER1_A0_VECTOR
__interrupt void Timer_A0 (void)
{
  TA1CCR0 += 664;                              // Add Offset to CCR0 1.4k*4
}

// TimerA1 Interrupt Vector (TA1IV) handler
#pragma vector=TIMER1_A1_VECTOR
__interrupt void Timer_A1(void)
{
  switch( TA1IV )
  {
  case  2: TA1CCR1 += 13;                    // Add Offset to CCR1   300k
           break;
}
}

使用特权

评论回复
地板
specialfrin| | 2012-9-22 20:44 | 只看该作者
这个程序可以产生任意频率任意占空比的波形

#include  <msp430g2553.h>
#define pwm_sf 200    //在这里可以任意调节频率,S是舵机的意思,
#define pwm_vf 1000   //v是指电机的意思 (可以在这里随意设定舵机跟电机的频率)

void pwm_sinit(unsigned char pwmvalue1) //pwmvlue是占空比,50是代表百分之50,从1到100变化
{
  TACTL = TASSEL_2 + MC_1;
  CCR0 = 1002000/pwm_sf;   //通过示波器观察此时SMLK=1002000
  CCTL1 = OUTMOD_7;         
  CCR1 = (1002000*pwmvalue1)/(100*pwm_sf);
  P1DIR |= 0x15;
  P1SEL |= 0x15;//通过特殊功能口输出
  
}
/*
void pwm_vinit(unsigned char pwmvalue2)
{
// TACTL = TASSEL_2 + MC_1;
  CCR0 = 100200/pwm_vf;
  CCTL2 = OUTMOD_7;
  CCR2 = 1002000*pwmvalue2/100;
  P2DIR |= 0x10;
  P2SEL |= 0x10;
}
*/

void main(void)
{
  WDTCTL = WDTPW +WDTHOLD;                   // Stop Watchdog Timer
  DCOCTL=CALDCO_1MHZ;
  BCSCTL1=CALBC1_1MHZ;
  pwm_sinit(50);    //50是指百分之50的占空比,可以任意改变这个参数()
  //pwm_vinit(50);
  
  BCSCTL3 = XCAP_2;


  while(1)
  {;}

}
/*这里是一个频率跟占空比都能随意改变的函数,但是系统给出来的1MHZ是不稳定的,所以这个频率太大或太小的话,要进行矫正 *

使用特权

评论回复
5
wjzx111056| | 2012-9-22 21:30 | 只看该作者
嗯,高手啊!借机好好学习了一下!呵呵~~~~~~不错不错

使用特权

评论回复
6
springspring| | 2012-9-24 23:10 | 只看该作者
要精度有多高啊。楼上上的程序就可以借鉴借鉴

使用特权

评论回复
7
firstblood| | 2012-9-28 14:35 | 只看该作者
三楼死楼给出的程序都很不错的,我参考了,谢谢

使用特权

评论回复
8
chen0204| | 2012-9-28 14:44 | 只看该作者
自己参考着更改,应该可以得到想要的

使用特权

评论回复
9
jojojoy| | 2012-9-28 15:30 | 只看该作者
嗯,看下呵

使用特权

评论回复
10
ledaa| | 2012-9-28 16:43 | 只看该作者
三楼死楼给出的程序都很不错的,我参考了,谢谢
firstblood 发表于 2012-9-28 14:35
。。。哈哈。错别字可不好哦

使用特权

评论回复
11
dayu1111| | 2012-9-28 17:48 | 只看该作者
来二姨家学经验

使用特权

评论回复
12
wjzx111056| | 2012-9-28 20:07 | 只看该作者
高手真多啊!好好学习~~~学430还不久,还需再深入学习学习啊!

使用特权

评论回复
13
hawksabre| | 2012-10-1 16:19 | 只看该作者
大家都将程序贴出来了   那我就讲一点原理吧   算是给楼主的补充     430单片机端口可以输出高低电平   方波本质上就是不同时间段输出高低电平      那原理知道了   下一步就好做了    我们只需要设置中断和计时器  在不同时间段输出高低电平   那么方波就出来了

使用特权

评论回复
14
hawksabre| | 2012-10-1 16:21 | 只看该作者
下一个就涉及到精确度问题    个人认为主要考虑的方向为   第一是频率精确     第二是时间精确    第三外部电阻精确   这三个方面做好了   基本上就能保证输出频率精确

使用特权

评论回复
15
hawksabre| | 2012-10-1 16:21 | 只看该作者
这是我个人的一点看法   希望能够帮到楼主   呵呵

使用特权

评论回复
16
happy啦啦啦| | 2012-10-10 20:57 | 只看该作者
就是 全是高手,学习学习

使用特权

评论回复
17
lyy3324| | 2012-10-15 13:17 | 只看该作者
四楼的简单易明

使用特权

评论回复
18
shenmu2012| | 2012-10-15 17:31 | 只看该作者
楼上几位都是高手的,我跟着学习啦,方波的产生其实也没那么难的,只是精度要求上会有些难度的啊

使用特权

评论回复
19
Redstar2012| | 2012-10-16 21:47 | 只看该作者
使用定时器,改变引脚的电平,应该可以产生方波

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

97

主题

1150

帖子

1

粉丝