Thread 中讨论的其他器件:controlSUITE
Hiii、
我在 C28x F28335 Delphino 微控制器上工作、在这里、我想从 ADC 的所有16个通道读取 ADC 计数值(我不使用 PWM 触发寄存器)、并将这些值记录到 ADC ISR 中。
这里我使用的是25MHz ADC 时钟(SysCtrlRegs.HISPCP。all = 0x3)和 sysclock 150Mhz。在这里,我将读取一些值473作为 ADC 计数(在每个通道上,如果我使 AdcRegs.ADCMAXCONV.all = 0x000; ) 将寄存 器更改为 AdcRegs.ADCMAXCONV.ALL = 0x0FFF 未正确设置中断、即问题出在 ADC 初始化、下面是我附加的代码。
//######################################################################################################################
//
//文件:example_2833xAdc.c
//
//标题:DSP2833x ADC 示例程序。
//
//假设:
//
//此程序需要 DSP2833x 头文件。
//
//确保在中正确定义了 CPU 时钟速度
// DSP2833x_Examples.h 再编译此示例。
//
//连接要转换为 A2和 A3的信号。
//
//根据提供的信息,此项目配置为“引导至 SARAM”
//操作。 2833x 引导模式表如下所示。
//有关配置 eZdsp 引导模式的信息,
//请参阅 eZdsp 附带的文档,
//
//$Boot_Table:
//
// GPIO87 GPIO86 GPIO85 GPIO84
// XA15 XA14 XA13 XA12
// pu pu pu pu
//================================================================================
// 1 1 1 1跳转到闪存
// 1 1 0 SCI-A 引导
// 1 0 1 SPI-A 引导
// 1 0 0 I2C-A 引导
// 1 0 1 1 eCAN-A 引导
// 1 0 1 0 McBSP-A 引导
// 1 0 1跳转到 XINTF x16
// 1 0 0 0跳转到 XINTF x32
// 0 1 1 1跳转到 OTP
// 0 1 0并行 GPIO I/O 引导
// 0 1 0 1并行 XINTF 引导
// 0 1 0 0跳转至 SARAM <-"引导至 SARAM"
// 0 1 1分支检查引导模式
// 0 1 0引导至闪存,绕过 ADC 校准
// 0 0 0 1引导至 SARAM,旁路 ADC 校准
// 0 0 0 0 0引导至 SCI-A、旁路 ADC 校准
// Boot_Table_End$
//
//描述:
//
//此示例将 PLL 设置为 x10/2模式。
//
//对于150MHz 器件(默认)
//将 SYSCLKOUT 除以6以达到25.0Mhz HSPCLK
//(假设为30Mhz XCLKIN)。
//
//对于100MHz 器件:
//将 SYSCLKOUT 除以4以达到25.0Mhz HSPCLK
//(假设为20Mhz XCLKIN)。
//
//中断被启用并且 ePWM1被设置为生成一个周期
SEQ1上的// ADC SOC。 转换了 ADCINA3和 ADCINA2两个通道。
//
//监视变量:
//
// Voltage1[10]最后10个 ADCRESULT0值
// Voltage2[10]最后10个 ADCRESULT1值
//转换计数当前结果编号0-9
// LoopCount 空闲循环计数器
//
//
//######################################################################################################################
//
//原始作者:D.F.
//
//$TI 发行版:2833x/2823x 头文件和外设示例 V133 $
//$Release Date:2012年6月8日$
//######################################################################################################################
#include "DSP28x_Project.h"//器件头文件和示例 include 文件
//此文件中找到的函数的原型语句。
中断空 ADC_ISR (空);
//此示例中使用的全局变量:
uint16环计数;
UINT16转换计数;
uint16 Voltage1[10];
uint16 Voltage2[10];
uint16 Voltage3[10];
uint16 Voltage4[10];
uint16 Voltage5[10];
uint16 Voltage6[10];
uint16 Voltage7[10];
uint16 Voltage8[10];
uint16 Voltage9[10];
MAIN ()
{
//步骤1. 初始化系统控制:
// PLL、安全装置、启用外设时钟
//此示例函数位于 DSP2833x_SYSCTRL.c 文件中。
InitSysCtrl();
EALLOW;
#IF (CPU_FRQ_150MHz)//默认- 150MHz SYSCLKOUT
#define ADC_MODCLK 0x3 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 150/(2*3)= 25.0MHz
#endif
#IF (CPU_FRQ_100MHz)
#define ADC_MODCLK 0x2 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 100/(2*2)= 25.0MHz
#endif
EDIS;
//定义 ADCCLK 时钟频率(小于或等于25MHz)
//假设 InitSysCtrl()已将 SYSCLKOUT 设置为150MHz
EALLOW;
SysCtrlRegs.HISPCP。all = ADC_MODCLK;
EDIS;
//步骤2. 初始化 GPIO:
//此示例函数位于 DSP2833x_GPIO.c 文件和中
//说明了如何将 GPIO 设置为其默认状态。
// InitGpio();//针对此示例跳过
//步骤3. 清除所有中断并初始化 PIE 矢量表:
//禁用 CPU 中断
Dint;
//将 PIE 控制寄存器初始化为默认状态。
//默认状态为禁用所有 PIE 中断和标志
//被清除。
//此函数位于 DSP2833x_PIECTRL.c 文件中。
InitPieCtrl();
//禁用 CPU 中断并清除所有 CPU 中断标志:
IER = 0x0000;
IFR = 0x0000;
//使用指向 shell 中断的指针初始化 PIE 矢量表
//服务例程(ISR)。
//这将填充整个表,即使是中断也是如此
//在本例中未使用。 这对于调试很有用。
//可以在 DSP2833x_DefaultIsr.c 中找到 shell ISR 例程
//此函数可在 DSP2833x_PieVect.c 中找到
InitPieVectTable();
//此示例中使用的中断被重新映射到
//此文件中的 ISR 函数。
EALLOW;//这是写入 EALLOW 受保护寄存器所必需的
PieVectTable.ADCINT =&ADC_ISR;
EDIS;//这是禁止写入 EALLOW 受保护寄存器所必需的
//步骤4. 初始化所有器件外设:
//此函数位于 DSP2833x_InitPeripherals.c 中
// InitPeripherals ();//此示例不需要
InitAdc ();//对于此示例,初始化 ADC
//步骤5. 特定于用户的代码、启用中断:
//在 PIE 中启用 ADCINT
PieCtrlRegs.PIEIER1.bit.INTx6=1;
IER |= M_INT1;//启用 CPU 中断1
EINT;//启用全局中断 INTM
ERTM;//启用全局实时中断 DBGM
LoopCount = 0;
ConversionCount = 0;
//配置 ADC
AdcRegs.ADCMAXCONV.ALL = 0x0FFF;//在 SEQ1上设置全部16个转换// 0x000F - 0x00FF
// AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x7;
// AdcRegs.ADCMAXCONV.bit.MAX_CONV2= 0x7;
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0;//将 ADCINA0设置为第一个 SEQ1转换器
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x1;//将 ADCINA1设置为第2个 SEQ1转换器
AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x2;//将 ADCINA2设置为第3个 SEQ1转换器
AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 0x3;//将 ADCINA3设置为第4个 SEQ1转换器
AdcRegs.ADCCHSELSEQ2.bit.CONV04 = 0x4;//将 ADCINA4设置为第5个 SEQ2转换器
AdcRegs.ADCCHSELSEQ2.bit.CONV05 = 0x5;//将 ADCINA5设置为第6个 SEQ2转换器
AdcRegs.ADCCHSELSEQ2.bit.CONV06 = 0x6;//将 ADCINA6设置为第7个 SEQ2转换器
AdcRegs.ADCCHSELSEQ2.bit.CONV07 = 0x7;//将 ADCINA7设置为第8个 SEQ2转换器
AdcRegs.ADCCHSELSEQ3.bit.CONV08 = 0x8;//将 ADCINB0设置为第9个 SEQ3转换器
AdcRegs.ADCCHSELSEQ3.bit.CONV09 = 0x9;//将 ADCINB1设置为第10个 SEQ3转换
AdcRegs.ADCCHSELSEQ3.bit.CONV10 = 0xA;//将 ADCINB2设置为第11个 SEQ3转换
AdcRegs.ADCCHSELSEQ3.bit.CONV11 = 0xB;//将 ADCINB3设置为第12个 SEQ3转换
AdcRegs.ADCCHSELSEQ4.bit.CONV12 = 0xC;//将 ADCINB4设置为第13个 SEQ4转换
AdcRegs.ADCCHSELSEQ4.bit.CONV13 = 0xD;//将 ADCINB5设置为第14个 SEQ4转换
AdcRegs.ADCCHSELSEQ4.bit.CONV14 = 0xE;//将 ADCINB6设置为第15个 SEQ4转换
AdcRegs.ADCCHSELSEQ4.bit.CONV15 = 0xF;//将 ADCINB7设置为第16个 SEQ4转换
// AdcRegs.ADCTRL2.bit.ePWM_SOCA_SEQ1 = 1;//从 ePWM 启用 SOCA 以启动 SEQ1
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;//复位 SEQ1
AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 1;//为 SEQ1启用软件触发器(在单独的指令中)
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1;//启用 SEQ1中断(每个 EOS)
// AdcRegs.ADCTRL2.bit.ePWM_SOCB_SEQ2 = 1;//从 ePWM 启用 SOCB 以启动 SEQ2
AdcRegs.ADCTRL2.bit.RST_SEQ2 = 1;//复位 SEQ1
AdcRegs.ADCTRL2.bit.SOC_SEQ2 = 1;////启用 SEQ2的软件触发(在单独的指令中)
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ2 = 1;//启用 SEQ2中断(每个 EOS)
AdcRegs.ADCTRL1.bit.CONT_RUN = 1;
/*
//假设 ePWM1时钟已在 InitSysCtrl()中启用;
EPwm2Regs.ETSEL.bit.SOCAEN = 1;//在组上启用 SOC
EPwm2Regs.ETSEL.bit.SOCASEL = 1;//4;//从 CPMA 中选择 SOC (向上计数)
EPwm2Regs.ETPS.bit.SOCAPRD = 1;//在发生第一个事件时生成脉冲
//SOCB
EPwm2Regs.ETSEL.bit.SOCBEN = 1;//在 B 组上启用 SOC
EPwm2Regs.ETSEL.bit.SOCBSEL = 1;//4;//在向上计数时从 CPMB 中选择 SOC
EPwm2Regs.ETPS.bit.SOCBPRD = 1;//在发生第一个事件时生成脉冲
EPwm2Regs.CMPA.half.CMPA = 0x0080;//设置比较值
EPwm2Regs.TBPRD = 0xFFFF;//为 ePWM1设置周期
EPwm2Regs.TBCTL.bit.CTRMODE = 0;//向上计数并启动
*
//等待 ADC 中断
for (;;)
{
LoopCount++;
}
}
中断空 ADC_ISR (空)
{
Voltage1[ConversionCount]= AdcRegs.ADCRESULT0 >> 4;
Voltage2[ConversionCount]= AdcRegs.ADCRESULT1 >>4;
Voltage3[ConversionCount]= AdcRegs.ADCRESULT2 >>4;
Voltage4[ConversionCount]= AdcRegs.ADCRESULT3 >>4;
Voltage5[ConversionCount]= AdcRegs.ADCRESULT4 >>4;
Voltage6[ConversionCount]= AdcRegs.ADCRESULT5 >> 4;
Voltage7[ConversionCount]= AdcRegs.ADCRESULT6 >> 4;
Voltage8[ConversionCount]= AdcRegs.ADCRESULT7>>4;
Voltage9[ConversionCount]= AdcRegs.ADCRESULT8 >> 4;
//如果记录了40次转换,则重新开始
if (ConversionCount = 9)
{
ConversionCount = 0;
}
else ConversionCount++;
//为下一个 ADC 序列重新初始化
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;//复位 SEQ1
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;//清除 INT SEQ1位
AdcRegs.ADCTRL2.bit.RST_SEQ2 = 1;//复位 SEQ1
AdcRegs.ADCST.bit.INT_SEQ2_CLR = 1;//清除 INT SEQ1位
PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;//确认 PIE 中断
返回;
}
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
空 InitAdc (空)
{
extern void DSP28x_usDelay (uint32计数);
EALLOW;
SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;
adc_cal();
EDIS;
AdcRegs.ADCTRL3.ALL = 0x00E0;//加电带隙/参考/ADC 电路
DELAY_US (ADC_USDELAY);//转换 ADC 通道之前的延迟
}
----------------------------------------------------------------------
以上是我对 ADC 的初始化。 请帮我解决这个问题。
提前感谢。