打印

输出PWM波的问题

[复制链接]
763|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
CaLipton|  楼主 | 2017-10-19 16:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
PWM波怎么输出不了 xianshi函数跟pwm函数冲突
#include  "msp430g2553.h"
  unsigned int admem[4];
  unsigned long n;
  unsigned int invot=0;
  unsigned int inan=0;
  unsigned int otan=0;
  unsigned int outvot=0;
void sys_Clock_Init() //时钟初始化为 1MHz;
{
BCSCTL1 = CALBC1_1MHZ; // Set range
DCOCTL = CALDCO_1MHZ; // Set DCO step + modulation */
}
void cai()//ad采样

{
  int*p=(int*)0x200;
  int i;
  P1DIR&=~BIT0+~BIT1+~BIT2+~BIT3;
  P1SEL|=BIT0+BIT1+BIT2+BIT3;
  WDTCTL = WDTPW + WDTHOLD;// Stop WDT
  ADC10CTL0 &= ~ENC;
  ADC10CTL1 = INCH_3 + CONSEQ_1+ADC10SSEL_2+SHS_0;            // A3/A2/A1/A0, single sequence序列 单次
  ADC10CTL0 = ADC10SHT_3 +MSC+ ADC10ON+SREF_0;
  ADC10DTC1 = 0x04;                         // 4 conversions
  ADC10AE0 |= BIT0+BIT1+BIT2+BIT3;                         // P1.3,2,1,0 ADC10 option select

    while (ADC10CTL1 & BUSY);               // Wait if ADC10 core is active
    ADC10SA = 0x200;  // Data buffer start
    ADC10CTL0 |= ENC+ADC10SC;  // Sampling and conversion start
    _delay_cycles(3000);

    for(i=0x00;i<4;i++)
    {
            admem[i]=*p;
            p++;
    }
    p=(int*)0x200;

    n=admem[0]*66;
       outvot=n/100;
    n=admem[1]*66;
       invot=n/102;
    n=admem[2]*30;
       inan=n/40;
    n=admem[3]*30;
       otan=n/40;

    return;
}

void xianshi ()//数码管按段显示  显示函数
{
    P2SEL=0X00;
    P2DIR=0XFF;
    unsigned int i;
    unsigned int j;
    unsigned int num;
    unsigned int x[3]={0x10,0x20,0x40};
    unsigned int wei;
    unsigned int seg[3];
    int yu=1;
//    int c;
    seg[0]=outvot/100;
    yu=outvot%100;
    seg[1]=yu/10;
    seg[2]=yu%10;
//for( c=0;c<100;c++)
//{
        for(j=0x00;j<3;j++)
   {
        num=seg[j];
    wei=x[j];
    switch(num)
        {case 0 :
                for(i=0x0;i<0x6;i++)
       {P2OUT=wei+i;
            _delay_cycles(1000); }  break;
        case 1:
                for(i=0x1;i<3;i++)
                    {
                            P2OUT=wei+i;
                            _delay_cycles(1000);} break;
        case 2:
                for(i=0x0;i<0x2;i++)
                       {P2OUT=wei+i;
                            _delay_cycles(1000); }
                for(i=0x3;i<5;i++)
                       {P2OUT=wei+i;
                            _delay_cycles(1000); }
                for(i=0x6;i<0x7;i++)
                       {P2OUT=wei+i;
                            _delay_cycles(1000); } break;
        case 3:
                for(i=0x0;i<0x4;i++)
                       {P2OUT=wei+i;
                            _delay_cycles(1000); }
                       i=6; P2OUT=wei+i;_delay_cycles(1000);
                       break;
        case 4:
                for(i=0x1;i<0x3;i++)
                       {P2OUT=wei+i;
                            _delay_cycles(1000); }
                for(i=0x5;i<0x7;i++)
                       {P2OUT=wei+i;
                            _delay_cycles(1000); } break;
        case 5:
                i=0;P2OUT=wei+i;_delay_cycles(1000);
                for(i=0x2;i<0x4;i++)
                       {P2OUT=wei+i;
                            _delay_cycles(1000); }
                for(i=0x5;i<0x7;i++)
                       {P2OUT=wei+i;
                            _delay_cycles(1000); }  break;
        case 6:
                i=0; P2OUT=wei+i;_delay_cycles(1000);
                for(i=0x2;i<0x7;i++)
                       {P2OUT=wei+i;
                            _delay_cycles(1000); }  break;
        case 7:
                for(i=0x0;i<0x3;i++)
                       {P2OUT=wei+i;
                            _delay_cycles(1000); }  break;

        case 8:
                for(i=0x0;i<0x7;i++)
                       {P2OUT=wei+i;
                            _delay_cycles(1000); }  break;
        case 9:
                for(i=0x0;i<0x4;i++)
                       {P2OUT=wei+i;
                            _delay_cycles(1000); }

                for(i=0x5;i<0x7;i++)
                       {P2OUT=wei+i;
                            _delay_cycles(1000); }  break;}
   }


       for(i=0x1;i<0x6;i++)
            {P2OUT=0x80+i;
        _delay_cycles(1000); }

        P2OUT=0X17;
        _delay_cycles(1000);
}

void main()
{
        sys_Clock_Init();
        WDTCTL = WDTPW + WDTHOLD;
        //BCSCTL1 = CALBC1_1MHZ; // Set range
        //DCOCTL = CALDCO_1MHZ; // Set DCO step + modulation */
        P1DIR |= BIT6;             //  p1.6 口
        P1SEL |= BIT6;
        TA0CTL |= TASSEL_1+MC_3;
        TA0CCTL1 |= OUTMOD_7; //选择高电平模式的 PWM 输出
        TA0CCR0=60;//TA1CCR0 写入 2000( 1MHZ/2000) 输出达到了 500HZ
        TA0CCR1=50;

   for(;;)
         {
         WDTCTL = WDTPW + WDTHOLD;
     cai();
         xianshi ();   //如果注释掉显示函数pwm口会正常工作
         if(outvot>310)//outvot 采样电压电压为3.1
         {
                 TA0CCR1++;
         }
         if(outvot<310)
         {
                 TA0CCR1--;
         }

         }
}

相关帖子

沙发
Rospiers| | 2017-10-19 16:37 | 只看该作者
xianshi ();   //如果注释掉显示函数pwm口会正常工作,显示函数占用了pwm的资源???

使用特权

评论回复
板凳
Lewisnx| | 2017-10-19 16:51 | 只看该作者
这个真心没遇到过,你可以尝试一下换其他的端口写数码管,按道理 定时器和其他的不会有冲突

使用特权

评论回复
地板
CCompton| | 2017-10-19 17:03 | 只看该作者
建议先把不必要的delay语句先注释掉,再看看是否正常输出PWM。

使用特权

评论回复
5
Richardd| | 2017-10-19 17:28 | 只看该作者
感觉你修改CCR0和CCR1太频繁了,还有就是建议调试的时候在初始化的地方打上断点,便于检查MCU是否复位过

使用特权

评论回复
6
usysm| | 2017-10-20 16:34 | 只看该作者
显示使用的是什么?

使用特权

评论回复
7
typeof| | 2017-10-20 16:35 | 只看该作者
每次执行采样会影响显示的函数。

使用特权

评论回复
8
yujielun| | 2017-10-20 16:36 | 只看该作者
pwm使用的定时器?

使用特权

评论回复
9
usysm| | 2017-10-20 16:45 | 只看该作者
数码管显示确实占用资源。

使用特权

评论回复
10
typeof| | 2017-10-20 16:45 | 只看该作者
可以放在中断里面执行的。

使用特权

评论回复
11
yujielun| | 2017-10-20 16:45 | 只看该作者
不要放在一个函数里面,可以把显示放在定时器中断执行。

使用特权

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

本版积分规则

126

主题

369

帖子

0

粉丝