TMS320F28335学习笔记——ADC详解

TMS320F28335内部包含12位AD转换器,其功能有:
具有内置(采样保持)S/H的12位ADC内核
模拟输入:0.0V至3.0V(高于3.0V的电压产生满刻度转换结果)。
快速转换率:在25MHzADC时钟12.5MSPS上时高达80ns
16个专用ADC通道。
每次采样/保持都有复用的8通道
自动定序功能在单次会话中可提供多达16次“自动转换”。可将每次转换编程为选择16个输入信道中的任何一个。
序列发生器可运行为2个独立的8态序列发生器,或作为1个较大的16态序列发生器(即2个级联的8态序列发生器)。
用于存储转换值的16个结果寄存器(可分别寻址)
– 输入模拟电压的数值源自:
当input<0时:digital value =0;
当0<input<3.0时:digital value =4096*(input analog voltage-ADCLO)/3;
当input>3.0时:digital value =4095;


作为转换开始(SOC)序列源的多个触发器
– S/W-软件立即启动
– ePWMM转换开始
– XINT2ADC转换开始
灵活的中断控制允许每个序列结束(EOS) 或每个其它EOS上的中断请求。
序列发生器可运行于“启/停”模式,从而实现多个“时序触发器”同步转换。
SOCA和SOCB触发器可独立运行在双序列发生器模式中。
采样保持(S/H)采集时间窗口具有独立的预分频控制。

要获得指定的ADC精度,正确的电路板布局非常关键。为尽可能达到最佳效果,引入ADCIN引脚的走线不应太靠近数字信号通道。这是为了最大程度地减少数字线路上因ADC输入耦合而产生的开关噪声。而且,适当的隔离技术必须被用来将数字电源从ADC模块电源引脚(VDD1A18,VDD2A18,VDDA2,VDDAIO)上隔离。

ADC未被使用,ADC连接
建议保持针对模拟电源引脚的连接,即便在ADC未被使用时也是如此。下面总结了如果ADC未在应用中使用,应该如何连接ADC引脚:
? VDD1A18/VDD2A18-连接至VDD
? VDDA2,VDDAIO-连接至VDDIO
? VSS1AGND/VSS2AGND,VSSA2,VSSAIO-连接至VSS
? ADCLO-连接至VSS
? ADCREFIN-连接至VSS
? ADCREFP/ADCREFM-连接一个100nF电容器至VSS
? ADCRESEXT-连接一个20k?电阻器(非常松散的耐受)至VSS。
? ADCINAn,ADCINBn-连接至VSS
当ADC未被使用时,为了达到节能的目的,请确保到ADC模块的时钟未被打开。
当在一个应用中使用ADC模块时,未使用的ADC输入引脚应被连接至模拟接地(VSS1AGND/VSS2AGND)

ADC头文件与寄存器对应解读:


struct ADCTRL1_BITS {      // bits  description
    Uint16  rsvd1:4;               // 3:0   reserved
    Uint16  SEQ_CASC:1;      // 4     Cascaded sequencer mode 级联序列模式
    Uint16  SEQ_OVRD:1;     // 5     Sequencer override  序列发生器覆盖
    Uint16  CONT_RUN:1;    // 6     Continuous run 连续运行模式
    Uint16  CPS:1;                // 7     ADC core clock pre-scalar ADC核心时钟分频
    Uint16  ACQ_PS:4;         // 11:8  Acquisition window size采集窗口大小
    Uint16  SUSMOD:2;       // 13:12 Emulation suspend mode仿真挂起模式
    Uint16  RESET:1;          // 14    ADC reset ADC复位
    Uint16  rsvd2:1;            // 15    reserved 保留
};
下面的联合体主要是为了解决对这个寄存器的控制,可以是整体赋值液可以是一位一位的赋值。
union ADCTRL1_REG {
   Uint16                all;
   struct ADCTRL1_BITS   bit;
};


struct ADCTRL2_BITS {                     // bits  description
    Uint16  EPWM_SOCB_SEQ2:1;        // 0     EPWM compare B SOC mask for SEQ2  增强PWM比较器B作为SEQ2的启动转换标志
    Uint16  rsvd1:1;                               // 1     reserved
    Uint16  INT_MOD_SEQ2:1;             // 2     SEQ2 Interrupt mode  SEQ2终端模式                 
    Uint16  INT_ENA_SEQ2:1;               // 3     SEQ2 Interrupt enable  SEQ2中断使能
    Uint16  rsvd2:1;                               // 4     reserved
    Uint16  SOC_SEQ2:1;                      // 5     Start of conversion for SEQ2 启动SEQ2转换
    Uint16  RST_SEQ2:1;                      // 6     Reset SEQ2     SEQ2复位
    Uint16  EXT_SOC_SEQ1:1;             // 7     External start of conversion for SEQ1        序列1的外部转换启动
    Uint16  EPWM_SOCA_SEQ1:1;       // 8     EPWM compare B SOC mask for SEQ1
    Uint16  rsvd3:1;                              // 9     reserved
    Uint16  INT_MOD_SEQ1:1;            // 10    SEQ1 Interrupt mode
    Uint16  INT_ENA_SEQ1:1;             // 11    SEQ1 Interrupt enable
    Uint16  rsvd4:1;                             // 12    reserved
    Uint16  SOC_SEQ1:1;                    // 13    Start of conversion trigger for SEQ1
    Uint16  RST_SEQ1:1;                    // 14    Restart sequencer 1   
    Uint16  EPWM_SOCB_SEQ:1;       // 15    EPWM compare B SOC enable
};



struct ADCASEQSR_BITS {       // bits   description
    Uint16  SEQ1_STATE:4;     // 3:0    SEQ1 state   序列1的状态
    Uint16  SEQ2_STATE:3;     // 6:4    SEQ2 state   序列2的状态
    Uint16  rsvd1:1;          // 7      reserved
    Uint16  SEQ_CNTR:4;       // 11:8   Sequencing counter status   序列计数器状态
    Uint16  rsvd2:4;          // 15:12  reserved  
};



ADC最大转换信道数寄存器
struct ADCMAXCONV_BITS {      // bits  description
    Uint16  MAX_CONV1:4;      // 3:0   Max number of conversions   序列1最大转换通道数
    Uint16  MAX_CONV2:3;      // 6:4   Max number of conversions    序列2最大转换通道数
    Uint16  rsvd1:9;          // 15:7  reserved 
};


ADC信道选择排序控制寄存器
SEQ1只能使用ADCCHSELSEQ1和ADCCHSELSEQ2;AEQ2只能使用ADCCHSELSEQ3和ADCCHSELSEQ4
struct ADCCHSELSEQ1_BITS {    // bits   description
    Uint16  CONV00:4;         // 3:0    Conversion selection 00
    Uint16  CONV01:4;         // 7:4    Conversion selection 01
    Uint16  CONV02:4;         // 11:8   Conversion selection 02
    Uint16  CONV03:4;         // 15:12  Conversion selection 03
};
struct ADCCHSELSEQ2_BITS {    // bits   description
    Uint16  CONV04:4;         // 3:0    Conversion selection 04
    Uint16  CONV05:4;         // 7:4    Conversion selection 05
    Uint16  CONV06:4;         // 11:8   Conversion selection 06
    Uint16  CONV07:4;         // 15:12  Conversion selection 07
};
struct ADCCHSELSEQ3_BITS {    // bits   description
    Uint16  CONV08:4;         // 3:0    Conversion selection 08
    Uint16  CONV09:4;         // 7:4    Conversion selection 09
    Uint16  CONV10:4;         // 11:8   Conversion selection 10
    Uint16  CONV11:4;         // 15:12  Conversion selection 11
};
struct ADCCHSELSEQ4_BITS {    // bits   description
    Uint16  CONV12:4;         // 3:0    Conversion selection 12
    Uint16  CONV13:4;         // 7:4    Conversion selection 13
    Uint16  CONV14:4;         // 11:8   Conversion selection 14
    Uint16  CONV15:4;         // 15:12  Conversion selection 15
};


控制寄存器3
struct ADCTRL3_BITS {         // bits   description
    Uint16   SMODE_SEL:1;     // 0      Sampling mode select  采样模式选择
    Uint16   ADCCLKPS:4;      // 4:1    ADC core clock divider  ADC时钟分频器
    Uint16   ADCPWDN:1;       // 5      ADC powerdown    ADC断电???
    Uint16   ADCBGRFDN:2;     // 7:6    ADC bandgap/ref power down  ADC参考/带隙断电  ???
    Uint16   rsvd1:8;         // 15:8   reserved
};


状态寄存器
struct ADCST_BITS {           // bits   description
    Uint16   INT_SEQ1:1;      // 0      SEQ1 Interrupt flag   序列1中断标志
    Uint16   INT_SEQ2:1;      // 1      SEQ2 Interrupt flag   序列2中断标志
    Uint16   SEQ1_BSY:1;      // 2      SEQ1 busy status      序列1忙标志
    Uint16   SEQ2_BSY:1;      // 3      SEQ2 busy status     序列2忙标志
    Uint16   INT_SEQ1_CLR:1;  // 4      SEQ1 Interrupt clear  清除序列1中断标志
    Uint16   INT_SEQ2_CLR:1;  // 5      SEQ2 Interrupt clear  清除序列2中断标志
    Uint16   EOS_BUF1:1;      // 6      End of sequence buffer1   序列缓冲器1结束
    Uint16   EOS_BUF2:1;      // 7      End of sequence buffer2
    Uint16   rsvd1:8;         // 15:8   reserved
};



struct ADCREFSEL_BITS {       // bits   description
Uint16   rsvd1:14;        // 13:0   reserved  
Uint16   REF_SEL:2;       // 15:14  Reference select   参考选择???
};


struct ADCOFFTRIM_BITS{       // bits   description
int16 OFFSET_TRIM:9;    // 8:0    Offset Trim   偏移微调???
Uint16 rsvd1:7;          // 15:9   reserved
};


ADC寄存器
struct ADC_REGS {
    union  ADCTRL1_REG       ADCTRL1;                   // ADC Control 1
    union  ADCTRL2_REG       ADCTRL2;                   // ADC Control 2
    union  ADCMAXCONV_REG    ADCMAXCONV;    // Max conversions
    union  ADCCHSELSEQ1_REG  ADCCHSELSEQ1;  // Channel select sequencing control 1
    union  ADCCHSELSEQ2_REG  ADCCHSELSEQ2;  // Channel select sequencing control 2
    union  ADCCHSELSEQ3_REG  ADCCHSELSEQ3;  // Channel select sequencing control 3
    union  ADCCHSELSEQ4_REG  ADCCHSELSEQ4;  // Channel select sequencing control 4
    union  ADCASEQSR_REG       ADCASEQSR;        // Autosequence status register
    Uint16                 ADCRESULT0;    // Conversion Result Buffer 0
    Uint16                 ADCRESULT1;    // Conversion Result Buffer 1
    Uint16                 ADCRESULT2;    // Conversion Result Buffer 2
    Uint16                 ADCRESULT3;    // Conversion Result Buffer 3
    Uint16                 ADCRESULT4;    // Conversion Result Buffer 4
    Uint16                 ADCRESULT5;    // Conversion Result Buffer 5
    Uint16                 ADCRESULT6;    // Conversion Result Buffer 6
    Uint16                 ADCRESULT7;    // Conversion Result Buffer 7
    Uint16                 ADCRESULT8;    // Conversion Result Buffer 8
    Uint16                 ADCRESULT9;    // Conversion Result Buffer 9
    Uint16                 ADCRESULT10;   // Conversion Result Buffer 10
    Uint16                 ADCRESULT11;   // Conversion Result Buffer 11
    Uint16                 ADCRESULT12;   // Conversion Result Buffer 12
    Uint16                 ADCRESULT13;   // Conversion Result Buffer 13
    Uint16                 ADCRESULT14;   // Conversion Result Buffer 14
    Uint16                 ADCRESULT15;   // Conversion Result Buffer 15
    union  ADCTRL3_REG      ADCTRL3;       // ADC Control 3  
    union  ADCST_REG          ADCST;         // ADC Status Register
    Uint16                 rsvd1;
    Uint16                 rsvd2;
    union  ADCREFSEL_REG      ADCREFSEL;      // Reference Select Register
    union  ADCOFFTRIM_REG   ADCOFFTRIM;    // Offset Trim Register
};
struct ADC_RESULT_MIRROR_REGS
{
    Uint16                 ADCRESULT0;    // Conversion Result Buffer 0
    Uint16                 ADCRESULT1;    // Conversion Result Buffer 1
    Uint16                 ADCRESULT2;    // Conversion Result Buffer 2
    Uint16                 ADCRESULT3;    // Conversion Result Buffer 3
    Uint16                 ADCRESULT4;    // Conversion Result Buffer 4
    Uint16                 ADCRESULT5;    // Conversion Result Buffer 5
    Uint16                 ADCRESULT6;    // Conversion Result Buffer 6
    Uint16                 ADCRESULT7;    // Conversion Result Buffer 7
    Uint16                 ADCRESULT8;    // Conversion Result Buffer 8
    Uint16                 ADCRESULT9;    // Conversion Result Buffer 9
    Uint16                 ADCRESULT10;   // Conversion Result Buffer 10
    Uint16                 ADCRESULT11;   // Conversion Result Buffer 11
    Uint16                 ADCRESULT12;   // Conversion Result Buffer 12
    Uint16                 ADCRESULT13;   // Conversion Result Buffer 13
    Uint16                 ADCRESULT14;   // Conversion Result Buffer 14
    Uint16                 ADCRESULT15;   // Conversion Result Buffer 15
};



ADC_Cal()常规步骤:
第一步:这个是TI公司提供的文件
.def _ADC_cal                                                      ;定义代码段名称
.asg "0x711C", ADCREFSEL_LOC                         ;ADCREFSEL_LOC 是 ADC Reference Select Register, 地址0x711C 
.sect".adc_cal"
_ADC_cal
MOVW DP, #ADCREFSEL_LOC >> 6        ;此时 DP = 0x7100 
MOV @28, #0xAAAA                                ;地址 : 0x7100 + 28
MOV @29, #0xBBBB                                 ;地址 : 0x7100 + 29
LRETR
第二步:为 ADC_Cal() 添加命令文件 
MEMORY
{
PAGE 0 :
...
ADC_CAL : origin = 0x380080, length = 0x000009
...
}
SECTIONS
{
...
.adc_cal : load = ADC_CAL, PAGE = 0, TYPE = NOLOAD
...
}
第三步:在使用ADC前要声明ADC_Cal(),并且在使用ADC_Cal()之前要使能ADC高速时钟。
extern void ADC_cal(void);

EALLOW;                                                      //允许对受保护的寄存器进行操作
SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;  //使能时钟
ADC_cal();                                                    
SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 0;  //关闭时钟
EDIS;                                                            //禁止对受保护的寄存器进行操作


ADC转换软件步骤:
初始化DSP系统;  
设置PIE 中断矢量表, 
初始化ADC模块; 
将ADC中断的入口地址装入PIE 中断矢量表中,开中断; 
软件启动ADC转换; 
等待ADC中断; 
在ADC中断中读取ADC转换结果,软件启动下一次ADC中断。

  • 3
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
28335 adc例程是指在Texas Instruments(TI)的28335数字信号处理器(DSP)上进行模拟到数字转换(ADC)的示例代码。 28335是一种基于固定点DSP架构的高性能处理器,广泛用于工业自动化、电力电子、医疗仪器和环境监测等领域。ADC是将连续的模拟信号转换为数字信号的关键组件之一,可用于数据采集和信号处理。 在28335 ADC例程中,通常会包含以下内容: 1. 初始化和配置ADC模块:包括设置采样率、精度、参考电压等参数。这些参数根据具体应用需求进行调整。 2. 设置IO口和引脚复用功能:将ADC输入引脚与外部信号连接,确保信号正常传输。 3. 中断处理和数据缓存:当ADC完成一次转换后,会触发中断,将转换结果存储到数据缓存中。通过中断处理程序,可以实现对转换结果的处理和分析。 4. 数据处理和转换:根据需求对ADC输出的数字信号进行处理,例如滤波、放大、数字调制等。 5. 数据传输和存储:将ADC转换结果传输到内存或外设,通常通过DMA(直接内存访问)实现高速数据传输和存储。 通过28335 ADC例程,用户可以了解和学习如何在DSP上进行ADC的初始化、配置和数据处理等操作。同时,用户可以根据自己的应用需求进行适当的修改和扩展。 总之,28335 ADC例程是帮助用户实现ADC功能的一个代码框架,通过理解和学习该例程,用户可以快速上手并定制适合自己应用的ADC模块。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值