3301|1

12

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

F281XADC04B.C [复制链接]

#include "IQmathLib.h"
#include "DSP281x_Device.h"
#include "f281xadc04b.h"
#define CPU_CLOCK_SPEED      6.6667L   // for a 150MHz CPU clock speed
#define ADC_usDELAY 5000L
#define DELAY_US(A)  DSP28x_usDelay(((((long double) A * 1000.0L) / (long double)CPU_CLOCK_SPEED) - 9.0L) / 5.0L)
extern void DSP28x_usDelay(unsigned long Count);
extern Uint16 Iuflag;
extern Uint16 Ivflag;
void F281X_adc04b_drv_init(ADCVALSB *p)
{
    DELAY_US(ADC_usDELAY);
  
    AdcRegs.ADCTRL1.all = ADC_RESET_FLAG;   // Reset the ADC Module 第14位总复位位写1后自动清零.
asm(" NOP ");//ADC的复位需要3个时钟周期,这期间ADC的控制寄存器不能被修改。
asm(" NOP ");   
    AdcRegs.ADCTRL3.bit.ADCBGRFDN = 0x3;  // Power up bandgap/reference circuitry   Delay time for band gap reference to be stable
DELAY_US(ADC_usDELAY);         // Delay before powering up rest of ADC   7--10ms
                        //调用延时1us函数,此处延时5000us
    AdcRegs.ADCTRL3.bit.ADCPWDN = 1;      // Power up rest of ADC
    AdcRegs.ADCTRL3.bit.ADCCLKPS = 6;       // Set up ADCTRL3 register
                            //  ADCLK=HSPCLK/[12*(ADCTRL1[7]+1)]=12.5MHz
DELAY_US(ADC_usDELAY); //调用延时1us函数,此处延时5000us
    AdcRegs.ADCTRL1.all = ADCTRL1_INIT_STATE_BIPOLAR; // Set up ADCTRL1 register
                         // 采样脉冲宽度(SOC)=1+1个ADCLK,不分频,级联模式,排序器的启动停止模式(转换完第一个序列就等待下一个触发信号)。
    AdcRegs.ADCTRL2.all = ADCTRL2_INIT_STATE_BIPOLAR;  // Set up ADCTRL2 register
                        //允许事件管理器A触发启动SEQ1
AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 14;               // Specify four conversions  
    AdcRegs.ADCCHSELSEQ1.all = 0x4343;           // Configure channel selection
                                             //  0x9810
    AdcRegs.ADCCHSELSEQ2.all = 0x6543;
    AdcRegs.ADCCHSELSEQ3.all = 0x6565;
    AdcRegs.ADCCHSELSEQ4.all = 0x2222;
EvaRegs.GPTCONA.bit.T1TOADC = 1;                // Set up EV Trigger with Timer1 UF
                                                    //设置下溢中断启动ADC
}  
void F281X_adc04b_drv_read(ADCVALSB *p)
{
       int16 DatQ15;
       long Tmp;
     //  double temp;
        // Wait until ADC conversion is completed
        while (AdcRegs.ADCST.bit.SEQ1_BSY == 1)
        {};
       if(AdcRegs.ADCRESULT0>=AdcRegs.ADCRESULT2&&AdcRegs.ADCRESULT0<=AdcRegs.ADCRESULT4||AdcRegs.ADCRESULT0>=AdcRegs.ADCRESULT4&&AdcRegs.ADCRESULT0<=AdcRegs.ADCRESULT2)
       DatQ15 = AdcRegs.ADCRESULT0-0x7FF0;
       else if(AdcRegs.ADCRESULT2>=AdcRegs.ADCRESULT0&&AdcRegs.ADCRESULT2<=AdcRegs.ADCRESULT4||AdcRegs.ADCRESULT2>=AdcRegs.ADCRESULT4&&AdcRegs.ADCRESULT2<=AdcRegs.ADCRESULT0)
       DatQ15 = AdcRegs.ADCRESULT2-0x7FF0;
        else if(AdcRegs.ADCRESULT4>=AdcRegs.ADCRESULT0&&AdcRegs.ADCRESULT4<=AdcRegs.ADCRESULT2||AdcRegs.ADCRESULT4>=AdcRegs.ADCRESULT2&&AdcRegs.ADCRESULT4<=AdcRegs.ADCRESULT0)
       DatQ15 = AdcRegs.ADCRESULT4-0x7FF0;
     //     DatQ15 = AdcRegs.ADCRESULT0-0x7FF0;  //^0x8000;   // Convert raw result to Q15 (bipolar signal)
        Tmp = (int32)p->Ch1Gain*(int32)DatQ15;  // Tmp = gain*dat => Q28 = Q13*Q15
        p->Ch1Out = (int16)(Tmp>>13);           // Convert Q28 to Q15
     //   p->Ch1Out -= p->Ch1Offset;              // Add offset
      
        if(AdcRegs.ADCRESULT1>=AdcRegs.ADCRESULT3&&AdcRegs.ADCRESULT1<=AdcRegs.ADCRESULT5||AdcRegs.ADCRESULT1>=AdcRegs.ADCRESULT5&&AdcRegs.ADCRESULT1<=AdcRegs.ADCRESULT3)
       DatQ15 = AdcRegs.ADCRESULT1-0x7FF0;
       else if(AdcRegs.ADCRESULT3>=AdcRegs.ADCRESULT1&&AdcRegs.ADCRESULT3<=AdcRegs.ADCRESULT5||AdcRegs.ADCRESULT3>=AdcRegs.ADCRESULT5&&AdcRegs.ADCRESULT3<=AdcRegs.ADCRESULT1)
       DatQ15 = AdcRegs.ADCRESULT3-0x7FF0;
        else if(AdcRegs.ADCRESULT5>=AdcRegs.ADCRESULT1&&AdcRegs.ADCRESULT5<=AdcRegs.ADCRESULT3||AdcRegs.ADCRESULT5>=AdcRegs.ADCRESULT3&&AdcRegs.ADCRESULT5<=AdcRegs.ADCRESULT1)
       DatQ15 = AdcRegs.ADCRESULT5-0x7FF0;
   //     DatQ15 = AdcRegs.ADCRESULT1-0x7FF0;  //^0x8000;   // Convert raw result to Q15 (bipolar signal)
        Tmp = (int32)p->Ch2Gain*(int32)DatQ15;  // Tmp = gain*dat => Q28 = Q13*Q15
        p->Ch2Out = (int16)(Tmp>>13);           // Convert Q28 to Q15
     //   p->Ch2Out -= p->Ch2Offset;              // Add offset
      
        
       if(AdcRegs.ADCRESULT6>=AdcRegs.ADCRESULT8&&AdcRegs.ADCRESULT6<=AdcRegs.ADCRESULT10||AdcRegs.ADCRESULT6>=AdcRegs.ADCRESULT10&&AdcRegs.ADCRESULT6<=AdcRegs.ADCRESULT8)
       DatQ15 = AdcRegs.ADCRESULT6;
       else if(AdcRegs.ADCRESULT8>=AdcRegs.ADCRESULT6&&AdcRegs.ADCRESULT8<=AdcRegs.ADCRESULT10||AdcRegs.ADCRESULT8>=AdcRegs.ADCRESULT10&&AdcRegs.ADCRESULT8<=AdcRegs.ADCRESULT6)
       DatQ15 = AdcRegs.ADCRESULT8;
        else if(AdcRegs.ADCRESULT10>=AdcRegs.ADCRESULT6&&AdcRegs.ADCRESULT10<=AdcRegs.ADCRESULT8||AdcRegs.ADCRESULT10>=AdcRegs.ADCRESULT8&&AdcRegs.ADCRESULT10<=AdcRegs.ADCRESULT6)
       DatQ15 = AdcRegs.ADCRESULT10;   
     //   DatQ15 = AdcRegs.ADCRESULT2^0x8000;   // Convert raw result to Q15 (bipolar signal)
      
       DatQ15 = DatQ15 - p->Ch3Offset;              // Add offset //电路决定的抬高电压的偏压值-_IQ15(1.291930541)
     
    // if(DatQ15<_IQ15(0))
   //    Iuflag=1;
      Tmp = (int32)p->Ch3Gain*(int32)DatQ15;
      p->Ch3Out = (int32)(Tmp>>13);           // Convert Q28 to Q15
         
// p->Ch3Out=_IQmpyIQX(p->Ch3Gain,13,DatQ15,15);
      
      
       if(AdcRegs.ADCRESULT7>=AdcRegs.ADCRESULT9&&AdcRegs.ADCRESULT7<=AdcRegs.ADCRESULT11||AdcRegs.ADCRESULT7>=AdcRegs.ADCRESULT11&&AdcRegs.ADCRESULT7<=AdcRegs.ADCRESULT9)
       DatQ15 = AdcRegs.ADCRESULT7;
       else if(AdcRegs.ADCRESULT9>=AdcRegs.ADCRESULT7&&AdcRegs.ADCRESULT9<=AdcRegs.ADCRESULT11||AdcRegs.ADCRESULT9>=AdcRegs.ADCRESULT11&&AdcRegs.ADCRESULT9<=AdcRegs.ADCRESULT7)
       DatQ15 = AdcRegs.ADCRESULT9;
        else if(AdcRegs.ADCRESULT11>=AdcRegs.ADCRESULT7&&AdcRegs.ADCRESULT11<=AdcRegs.ADCRESULT9||AdcRegs.ADCRESULT11>=AdcRegs.ADCRESULT9&&AdcRegs.ADCRESULT11<=AdcRegs.ADCRESULT7)
       DatQ15 = AdcRegs.ADCRESULT11;
     //     DatQ15 = AdcRegs.ADCRESULT3^0x8000;   // Convert raw result to Q15 (bipolar signal)
        DatQ15 = DatQ15 - p->Ch4Offset;              // Add offset
           Tmp = (int32)p->Ch4Gain*(int32)DatQ15;  // Tmp = gain*dat => Q28 = Q13*Q15
      
            p->Ch4Out = (int32)(Tmp>>13);           // Convert Q28 to Q15
  
  //  p->Ch4Out =_IQmpyIQX(p->Ch4Gain,13,DatQ15,15);
      
        
      
       if(AdcRegs.ADCRESULT12>=AdcRegs.ADCRESULT13&&AdcRegs.ADCRESULT12<=AdcRegs.ADCRESULT14||AdcRegs.ADCRESULT12>=AdcRegs.ADCRESULT14&&AdcRegs.ADCRESULT12<=AdcRegs.ADCRESULT13)
       DatQ15 = AdcRegs.ADCRESULT12;
       else if(AdcRegs.ADCRESULT13>=AdcRegs.ADCRESULT12&&AdcRegs.ADCRESULT13<=AdcRegs.ADCRESULT14||AdcRegs.ADCRESULT13>=AdcRegs.ADCRESULT14&&AdcRegs.ADCRESULT13<=AdcRegs.ADCRESULT12)
       DatQ15 = AdcRegs.ADCRESULT13;
        else if(AdcRegs.ADCRESULT14>=AdcRegs.ADCRESULT12&&AdcRegs.ADCRESULT14<=AdcRegs.ADCRESULT13||AdcRegs.ADCRESULT14>=AdcRegs.ADCRESULT13&&AdcRegs.ADCRESULT14<=AdcRegs.ADCRESULT12)
       DatQ15 = AdcRegs.ADCRESULT14;
     //     DatQ15 = AdcRegs.ADCRESULT3^0x8000;   // Convert raw result to Q15 (bipolar signal)
        Tmp = (int32)p->Ch5Gain*(int32)DatQ15;  // Tmp = gain*dat => Q28 = Q13*Q15
        p->Ch5Out = (int32)(Tmp>>13);           // Convert Q28 to Q15
       // p->Ch5Out += p->Ch5Offset;              // Add offset
        
        AdcRegs.ADCTRL2.all |= 0x4040;          // Reset the sequence
}            
         
请问这段程序中并没有设置顺序采样,我能默认他为顺序采样吗,另外为什么转换结果要和其他两个结果比较,如:AdcRegs.ADCRESULT14>=AdcRegs.ADCRESULT12&&AdcRegs.ADCRESULT14<=AdcRegs.ADCRESULT13||AdcRegs.ADCRESULT14>=AdcRegs.ADCRESULT13&&AdcRegs.ADCRESULT14<=AdcRegs.ADCRESULT12)
       前两个采样结果p->Ch1Out,  p->Ch2Out是采样电机的两相电流信号的sin 和cos信号从而计算出电角度,后面两个结果p->Ch3Out,  p->Ch4Out是用于电机clark变换的(电机是永磁同步电机),p->Ch5Out这个结果是母线电流值。
 
点赞 关注

回复
举报

12

帖子

0

TA的资源

一粒金砂(中级)

沙发
 

另外还有

另外我这是采样电机的电流值用于电机的svpwm控制,程序中设置
AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 14;               // Specify four conversions  
    AdcRegs.ADCCHSELSEQ1.all = 0x4343;           // Configure channel selection
                                             //  0x9810
    AdcRegs.ADCCHSELSEQ2.all = 0x6543;
    AdcRegs.ADCCHSELSEQ3.all = 0x6565;
    AdcRegs.ADCCHSELSEQ4.all = 0x2222;
是怎么样的一种采样过程呢,跪求指导
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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