搜索
bottom↓
回复: 19

关于MSP430F5438 AD12用于工频电压电流采集的问题

[复制链接]

出0入0汤圆

发表于 2012-5-2 09:33:16 | 显示全部楼层 |阅读模式
本帖最后由 melody520 于 2012-5-2 10:40 编辑

题外话:   
      知道阿莫论坛是在参加全国电子设计大赛时一个朋友说的,在这里找到了很多宝贵的质料,尤其是大神很多……
     了解阿莫论坛是在之后的一段时间,如同阿莫倡导的“友好交流气氛,乐于开源共享”,我想说“神马都是浮云,共享才是王道”……让俺们在这里建立知识的世外桃源……
      对于阿莫,我有一个小小的建议……我是很烦那些不经过思考就转载别人的论文或者观点(简称为观点吧),网上一搜一大把都是一样的,对的一样错的也一样,那么有用的东西就变得很少了……把正确的东西拿来传承,dust丢掉,让经典延续,像教科书一样……有问题找阿莫,不说一定解决您的问题,但总能给您一些启发……来了就不白来
     对于相同帖子经行关联,这样时间久了就不怕乱,让后人找起来也方便……

言归正传:
    问题:将采集的模拟量(工频,许继测试系统提供)经AD12变换后,通过FFT变换的到50Hz工频电压,但电压很不稳定,一直怀疑是不是AD12初始化设置有问题,请大神们指点。(前提:硬件没有问题,FFT程序没有问题)
   
    先简单理一下思路:
          XT2外接晶振20M,进行32点FFT变换,5路AD12 顺序采样,TA0用于启动AD12;以下是各部分的程序:

void UCS_Init(void)
{
        P5SEL |= 0x0C;                                   //  XT2= 20M
        UCSCTL6 &= ~ XT2OFF;                       // Set XT2 On
        UCSCTL3 |= SELREF_2;                        // FLLref = REFO,DCODIV=1.045MHz,DCO 参考频率  
        UCSCTL4 |= SELA_2;                           // ACLK=REFO=32768Hz,SMCLK=DCO,MCLK=DCO
        do
        {
                UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG);                                                                                    
                SFRIFG1 &= ~OFIFG;                     
        }while (SFRIFG1&OFIFG);                 

        UCSCTL6 |= XT2DRIVE_2 ;                                                          // Decrease XT2 Drive according to                                               
        UCSCTL4 |= SELS_5 + SELM_5;                                                    // MCLK=SMCLK=DCO=XT2
        UCSCTL5 |= DIVS_1 + DIVM_1;                                                    // ACLK=32.768 ,SMCLK=MCLK=XT2/2
}


void ADC12_Init(void)
{      
        P6SEL |= 0x03;                                                                          // Enable A/D channel inputs
        ADC12CTL0 &=~ ADC12ENC;               
        ADC12CTL0 |= ADC12ON+ADC12MSC+ADC12SHT0_8;                    // Turn on ADC12, extend sampling time
                                                                                                       // to avoid overflow of results
        ADC12CTL1 |= ADC12SHP+ADC12CONSEQ_1;                               // Use sampling timer, repeated sequence
        ADC12CTL2 |= ADC12RES_2;
       
        ADC12MCTL0 |= ADC12INCH_0 + ADC12SREF_2;                           // ref+=VeREF+, channel = A0
        ADC12MCTL1 |= ADC12INCH_1 + ADC12SREF_2;                           // ref+=VeREF+, channel = A1
        ADC12MCTL2 |= ADC12INCH_2 + ADC12SREF_2;                           // ref+=VeREF+, channel = A2
        ADC12MCTL3 |= ADC12INCH_3 + ADC12SREF_2;                           // ref+=VeREF+, channel = A3         
        ADC12MCTL4 |= ADC12INCH_4 + ADC12SREF_2 + ADC12EOS;        // ref+=VeREF+, channel = A4, end seq.
        ADC12IE |= 0x10;                                                                      // Enable ADC12IFG.4

        ADC12CTL0 |= ADC12ENC;                                                          // Enable conversions       
}

void Time0_A0_Init(void)
{
        TA0CCTL0 |= CCIE;                                                                   // TACCR0 interrupt enabled
        TA0CCR0 = 625;                                                                       //800Hz
        TA0EX0 |= TAIDEX_4;                                                               //T/5
        TA0CTL |= TASSEL_2 + TACLR + MC_1 + ID_2;                           //SCLK/2,upmode, clear TAR, TA enable interrupt
}

     以上为初始化程序:频谱分辨率F=50/2=800/32;  进行32点FFT,采样频率Fs=800Hz;

     以下为中断程序:

//每800Hz进行一次采样
#pragma vector=TIMER0_A0_VECTOR
__interrupt void TIMER0_A0_ISR(void)           //ADC12
{      
        ADC12CTL0 |= ADC12SC;                     // Start convn - software trigger  
}

#pragma vector=ADC12_VECTOR
__interrupt void ADC12ISR (void)
{
      static unsigned int FFT_Cnt;
     
                  if (FFT_Flag == 0)
                  {
                          Samples[0][FFT_Cnt] = ADC12MEM0;           // Move A0 results, IFG is cleared
                          Samples[1][FFT_Cnt] = ADC12MEM1;           // Move A1 results, IFG is cleared
                          Samples[2][FFT_Cnt] = ADC12MEM2;           // Move A2 results, IFG is cleared
                          Samples[3][FFT_Cnt] = ADC12MEM3;           // Move A3 results, IFG is cleared
                          Samples[4][FFT_Cnt] = ADC12MEM4;           // Move A4 results, IFG is cleared
                          FFT_Cnt++;                                    
                          
                          if(FFT_Cnt == (FFT_N-1))
                          {
                                  TA0CCR0 = 0;                                  //关闭TA0定时中断
                          }
                        
                          if (FFT_Cnt >= FFT_N)                              //完成32点采样后停止采样,进行FFT计算
                          {
                                  FFT_Cnt = 0;
                                  FFT_Flag = 1;
                          }
               }
}


      FFT运算在main中完成,之后重新开启定时,采样。之前用PIC做的设备挺好……但在MSP430F5438中就有问题了,看了几遍Datasheet,和官方Demo也没发现问题在哪,折磨了我一个星期,用仿真器仿真看得到的采样值也符合规律,就是FFT后的结果不是一个定值……让人很是不解,我怀疑AD12中是不是有啥鲜为人知的地方没注意……没办法,求援助啊……































阿莫论坛20周年了!感谢大家的支持与爱护!!

该献的血还是要献的。你不献他不献。难道让我去献? --- 出自坛友:lovejp1981

出0入0汤圆

 楼主| 发表于 2012-5-3 08:25:42 | 显示全部楼层
大神们……抽点时间看看吧……

出0入0汤圆

 楼主| 发表于 2012-5-3 15:50:46 | 显示全部楼层
依然如此……

出0入0汤圆

发表于 2012-5-3 16:02:39 | 显示全部楼层
msp430F5438的晶振不是18M么?5438a的晶振才是25m。

出0入0汤圆

 楼主| 发表于 2012-5-4 08:25:50 | 显示全部楼层
wozai2513 发表于 2012-5-3 16:02
msp430F5438的晶振不是18M么?5438a的晶振才是25m。

谢谢你的关注……High-Frequency Crystals up to 32 MHz(官方datasheet SLAS612C)
头像被屏蔽

出0入0汤圆

发表于 2012-5-4 08:35:46 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

发表于 2012-5-4 09:09:06 | 显示全部楼层
看看你的采样周期呢,

出0入0汤圆

发表于 2012-5-4 09:44:10 | 显示全部楼层
1、内部基准是不准的,这样你要考虑。
2、采样是有延时的,ADC的电压不是一开始就建立起来的,需要根据IC内部的电阻和电容等待。

希望你自己看下datasheet,user guide和例程。

出0入0汤圆

 楼主| 发表于 2012-5-4 11:14:15 | 显示全部楼层
USACH 发表于 2012-5-4 09:44
1、内部基准是不准的,这样你要考虑。
2、采样是有延时的,ADC的电压不是一开始就建立起来的,需要根据IC内 ...

谢谢……我没用内部基准……用的是VeREF

出0入0汤圆

 楼主| 发表于 2012-5-4 12:13:11 | 显示全部楼层
xiatianzhang 发表于 2012-5-4 08:35
你FFT后 有没有在插值一下。还有 有没有判断干扰的问题。

谢谢……加了窗后……精度 <3%,请问您一般判断干扰用的什么方法啊?我想把精度提高到1%
头像被屏蔽

出0入0汤圆

发表于 2012-5-4 12:37:59 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

 楼主| 发表于 2012-5-4 15:51:38 | 显示全部楼层
xiatianzhang 发表于 2012-5-4 12:37
我是采样三个这个周期的 判断两个对应的周期 对应的位置上连续五次是不是插值很小的。 ...

那在对时间(实时性)要就高的话就有点问题了……谢了
头像被屏蔽

出0入0汤圆

发表于 2012-5-4 17:02:04 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

 楼主| 发表于 2012-5-4 22:13:19 | 显示全部楼层
xiatianzhang 发表于 2012-5-4 17:02
速度要快。我是1.111MS采样一次。

那是相当的……

出0入0汤圆

发表于 2012-5-20 09:59:02 | 显示全部楼层
谁用过5438A的内部参考2.5V啊
  我的AD转换结果始终是0x0FFF
     什么原因啊

出0入0汤圆

 楼主| 发表于 2012-5-21 08:40:42 | 显示全部楼层
642142533 发表于 2012-5-20 09:59
谁用过5438A的内部参考2.5V啊
  我的AD转换结果始终是0x0FFF
     什么原因啊

从结果看……我估计的原因有:
    1.参考电压2.5v的程序没设置对
    2.输入到AD管脚的电压大于2.5V,即饱和了
    3.片子的外围电路有问题

请仔细查找,先确定硬件没问题,在看软件设置

出0入0汤圆

发表于 2012-5-21 10:14:51 | 显示全部楼层
已经搞定了

出0入0汤圆

 楼主| 发表于 2012-5-21 16:32:23 | 显示全部楼层
642142533 发表于 2012-5-21 10:14
已经搞定了

能分享一下原因不?

出0入0汤圆

发表于 2012-5-21 18:23:21 | 显示全部楼层
melody520 发表于 2012-5-21 16:32
能分享一下原因不?

我的是参考电压没设置好
   你可以看看REF模块部分

出0入0汤圆

 楼主| 发表于 2012-7-30 17:39:07 | 显示全部楼层
642142533 发表于 2012-5-21 18:23
我的是参考电压没设置好
   你可以看看REF模块部分

呵呵……
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-9-2 15:35

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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