社区导航

 

搜索
查看: 1380|回复: 3

[求助] MSP430F5438A单片机对PWM方波采样,串口发送结果出不来波形

[复制链接]

21

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2016-12-21 13:08 | 显示全部楼层 |阅读模式
最近在做一个关于测量脉搏波的实验。软件的第一步就是要用片内的12位AD进行采样。1)我参照数据手册上的值对时钟、AD进行了设定,24MHZ主时钟、单通道连续采样,AD采用主时钟,
2)采用两个定时器TA0\TA1进行方波PWM输出,一路1KHZ,一路2KHZ。两路方波均已在示波器上成功显示(这样的话时钟配置就没有问题吧)

3)关于采样,使用脉冲模式,SHP=1,MSC=1,采样保持时间设为32个AD时钟周期,可是针对单片机方波输出口进行采样的时候,串口发送的数据完全看不用出方波的样子(串口波特率为256000,能够显示数据),我一个2KHz方波的高低电平采16个点。
4)AD采样在TB定时器中断内部重新开启ENC使能和SC,TBCCR0周期是产生2KHz周期方波的定时器的值一半,采用加法计数。
5)在AD中断内设置计数变量,判断一个周期内电平采满之后,关闭ADC使能,
6)主函数循环内进行数据处理(利用AD采完以后,下一个定时器B中断来之前处理并发送,现在只有一句发送语句)
上述操作后依然看不出任何方波的波形,想请教一下原因。。。纠结了两个星期了····orz
此帖出自单片机论坛

回复

使用道具 举报

21

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2016-12-21 13:17 | 显示全部楼层
#pragma vector = ADC12_VECTOR
__interrupt void ADC12_shuru(void)
{  
      ADCMix1[i]=ADC12MEM0;      //想法是采样后的结果依次存入数组中
      i++;
      if(i >= ADlength)//一个电平的所有点进行处理,下抽样成为一个点
     {  
          i=0;
       ADCMix_Ave[ADC_Ave_Count] =0;
     for(time=0;time       ADCMix_Ave[ADC_Ave_Count]+=ADCMix1[time];
      ADCMix_Ave[ADC_Ave_Count] =  ADCMix_Ave[ADC_Ave_Count]/(ADlength);
        Trans_flag = 1; ADC12CTL0 &=~ADC12ENC;  
     }                        
}

void ADC12Init()   //ADC设置,采样率为266KHz ,每个电平可采样77个点,下抽样成一个点,提高1位精度
{
  ADC12CTL0 &= ~ADC12ENC; //转换器不使能才能设置
  ADC12CTL0 = ADC12SHT0_3 + ADC12SHT1_3 + ADC12ON + ADC12MSC;  // 设置采样保持时间,所有寄存器均设置时间为64/24MHz = 2.6μs以达到高采样速度
// ADC12CTL2 |= ADC12TCOFF ; // 关闭内部内部温度检测以降低功耗,注意或操作否则修改转换精度
  ADC12CTL1 |= ADC12SHP + ADC12SSEL_2 + ADC12CONSEQ_2;   //采样来自时钟定时器,时钟源为主时钟MCLK=24MHZ;重复单通道转换
  ADC12MCTL0 = ADC12SREF_0+ ADC12INCH_0;    //选择参考电压为AVcc与AVss,采样通道为外部通道A0,
  ADC12IE |= ADC12IE0;   //中断请求打开
  ADC12CTL2 |= ADC12SR;
    P6SEL |= BIT0;    //设置采样通道A0,对应AD存储结果MEM0;
    __delay_cycles(75);     //??
   ADC12CTL0 |= ADC12ENC;   //转换器使能  
}

****************************************************上面是我的ADC初始化模块和ADC中断代码

#pragma vector = TIMERB0_VECTOR
__interrupt void TB_Transform(void)
{   
    ADC12CTL0 |=ADC12ENC;
    ADC12CTL0 |= ADC12SC;
    // Delay_us(5);
}
********************************************************************这个是定时器B中断

回复

使用道具 举报

21

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2016-12-21 13:18 | 显示全部楼层
void TimeAInit()                                //用两组定时器产生PWM方波
{   
   TA1CTL |= TAIE ;                           //中断使能,使0.25ms内采集的数据(对应于调制波形的四个电平周期中的一个电平的时间)进行输出
   P2DIR |=BIT1  ;                            // P2.2口为定时器方波输出口
   P1DIR |=BIT1+ BIT2   ;                            //P1.1口为定时器方波输出口
   P1SEL |=BIT1+ BIT2  ;
   P2SEL |=BIT1  ;                            // 切换为第二功能
   TA0CCR1 = 750-1;
   TA0CCR0 = 750-1;                            //    1KHz方波    3MHZ/(1500 *2) = 1kHz
   TA1CCR0 = 1500-1;                            // PWM 周期 2KHZ方波  3MHZ/(750 *2) = 2kHz
   TBCTL |=  TBSSEL_2 + MC_1;
   TBCCTL0 |= CCIE;
   TBCCR0 |= 375-1;
   TA0CCTL0 = OUTMOD_4;
   // 电平反转模式
  TA1CCTL0 = OUTMOD_4;
   TA1CTL = TASSEL_2 + MC_1 ;         //SMCLK,加法计数模式  TACLR为计数器清零
   TA0CTL = TASSEL_2 + MC_1 ;
     
}
**********************************************这个是定时器初始化部分

回复

使用道具 举报

21

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2016-12-21 13:20 | 显示全部楼层
想法是能够对两路方波得每个高低电平进行有顺序的采样,也就是一个电平能够采取固定长度的点存入数组中,实在不知道有何问题。。。

回复

使用道具 举报

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

关闭

站长推荐上一条 /4 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-2-26 08:38 , Processed in 0.172737 second(s), 18 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表