This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/TMS320F28069:ADC 问题

Guru**** 2342960 points
Other Parts Discussed in Thread: CONTROLSUITE
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/590843/ccs-tms320f28069-adc-issues

器件型号:TMS320F28069
Thread 中讨论的其他器件:controlSUITE

工具/软件:Code Composer Studio

我正在尝试了解如何在 F28069中配置 ADC。 我在 controlSUITE 中使用了示例 ADC 程序(按原样)、并将电源连接到 ADCINA2引脚。 但是、当我读取结果时、我得到的是3.3V 时的1480、而应该是4095。 是否有人可以解释可能是什么问题? 下面是我使用的程序。

//######################################################################################################################
//描述:
//! addtogroup f2806x_example_list
//!

ADC 转换开始(ADC_SoC)


//!
//! 此 ADC 示例使用 ePWM1来生成周期性 ADC SOC - ADCINT1。
//! 两个通道被转换、ADCINA4和 ADCINA2。
//!
//! b 监视\b 变量\n
//! - Voltage1[10]   -最后10个 ADCRESULT0值
//! - Voltage2[10]   -最后10个 ADCRESULT1值
//! -转换计数-当前结果编号0-9
//! -循环计数      -空闲循环计数器
//
//
//######################################################################################################################
//$TI 版本:F2806x C/C++头文件和外设示例 V151 $
//$Release Date: 2016年2月2日$
//版权所有:版权所有(C) 2011-2016德州仪器(TI)公司-
//            http://www.ti.com/ 保留所有权利$
//######################################################################################################################

#include "DSP28x_Project.h"    //器件头文件和示例 include 文件

//此文件中找到的函数的原型语句。
_interrupt void ADC_ISR (void);
void ADC_Config (void);


//此示例中使用的全局变量:
uint16环计数;
UINT16转换计数;
uint16 Voltage1[10];
uint16 Voltage2[10];


MAIN ()

//步骤1. 初始化系统控制:
// PLL、安全装置、启用外设时钟
//此示例函数位于 F2806x_SYSCTRL.c 文件中。
  InitSysCtrl();


//步骤2. 初始化 GPIO:
//此示例函数位于 F2806x_GPIO.c 文件和中
//说明了如何将 GPIO 设置为其默认状态。
// InitGpio(); //针对此示例跳过

//步骤3. 清除所有中断并初始化 PIE 矢量表:
//禁用 CPU 中断
  Dint;

//将 PIE 控制寄存器初始化为默认状态。
//默认状态为禁用所有 PIE 中断和标志
//被清除。
//此函数位于 F2806x_PIECTRL.c 文件中。
  InitPieCtrl();

//禁用 CPU 中断并清除所有 CPU 中断标志:
  IER = 0x0000;
  IFR = 0x0000;

//使用指向 shell 中断的指针初始化 PIE 矢量表
//服务例程(ISR)。
//这将填充整个表,即使是中断也是如此
//在本例中未使用。  这对于调试很有用。
//可以在 F2806x_DefaultIsr.c 中找到 shell ISR 例程
//此函数可在 F2806x_PieVect.c 中找到
  InitPieVectTable();

//此示例中使用的中断被重新映射到
//此文件中的 ISR 函数。
  EALLOW; //这是写入 EALLOW 受保护寄存器所必需的
  PieVectTable.ADCINT1 =&ADC_ISR;
  EDIS;   //这是禁止写入 EALLOW 受保护寄存器所必需的

//步骤4. 初始化所有器件外设:
//此函数可在 F2806x_InitPeripherals.c 中找到
// InitPeripherals ();//此示例不需要
  InitAdc (); //对于此示例,初始化 ADC
  AdcOffsetSelfCal();

//步骤5. 特定于用户的代码、启用中断:

//在 PIE 中启用 ADCINT1
  PieCtrlRegs.PIEIER1.bit.INTx1 = 1; //在 PIE 中启用 INT 1.1
  IER |= M_INT1;      //启用 CPU 中断1
  EINT;               //启用全局中断 INTM
  ERTM;               //启用全局实时中断 DBGM

  LoopCount = 0;
  ConversionCount = 0;

//配置 ADC
 EALLOW;
   AdcRegs.ADCCTL2.bit.ADCNONOVERLAP = 1; //启用非重叠模式
 AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1; // ADCINT1在 AdcResults 锁存后跳闸
 AdcRegs.INTSEL1N2.bit.INT1E    = 1; //启用 ADCINT1
 AdcRegs.INTSEL1N2.bit.INT1CONT = 0; //禁用 ADCINT1连续模式
   AdcRegs.INTSEL1N2.bit.INT1SEL = 1;   //设置 EOC1以触发 ADCINT1触发
   AdcRegs.ADCSOC0CTL.bit.CHSEL = 4;   //将 SOC0通道选择设置为 ADCINA4
   AdcRegs.ADCSOC1CTL.bit.CHSEL = 2;   //将 SOC1通道选择设置为 ADCINA2
   AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 5;   //设置 SOC0在 EPWM1A 上启动触发器,因为轮询 SOC0先转换,然后 SOC1
   AdcRegs.ADCSOC1CTL.bit.TRIGSEL = 5;   //设置 EPWM1A 上的 SOC1启动触发器,因为 SOC0先转换,然后 SOC1
 AdcRegs.ADCSOC0CTL.bit.ACQPS = 6; //将 SOC0 S/H 窗口设置为7个 ADC 时钟周期(6个 ACQPS 加1)
 AdcRegs.ADCSOC1CTL.bit.ACQPS = 6; //将 SOC1 S/H 窗口设置为7个 ADC 时钟周期(6个 ACQPS 加1)
 EDIS;

//假设 ePWM1时钟已在 InitSysCtrl()中启用;
  EPwm1Regs.ETSEL.bit.SOCAEN = 1;  //启用组上的 SOC
  EPwm1Regs.ETSEL.bit.SOCASEL = 4;  //在递增计数时从 CMPA 中选择 SOC
  EPwm1Regs.ETPS.bit.SOCAPRD = 1;  //在发生第一个事件时生成脉冲
  EPwm1Regs.CMPA.half.CMPA = 0x0080; //设置比较值
  EPwm1Regs.TBPRD    = 800; //为 ePWM1设置周期
  EPwm1Regs.TBCTL.bit.CTRMODE = 0;  //向上计数并启动

//等待 ADC 中断
  for (;;)
  {
     LoopCount++;
  }


_interrupt void ADC_ISR (void)

 Voltage1[ConversionCount]= AdcResult.ADCRESULT0;
 Voltage2[ConversionCount]= AdcResult.ADCRESULT1;

 //如果记录了20次转换,则重新开始
 if (ConversionCount = 9)
 {
    ConversionCount = 0;
 }
 else ConversionCount++;

 AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;  //清除 ADCINT1标志为下一个 SOC 重新初始化
 PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;  //确认 PIE 中断

 返回;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Ponnarasi、

    您是否为此使用了 TI 控制卡或 LaunchPad?

    您何时阅读结果? 您是否在某个位置设置了断点? 是否启用了连续刷新?

    Tommy