主题中讨论的其他器件:controlSUITE、 REF3120、 OPA320、 OPA350
F28335 ADC 不工作。 我检查引脚。 我更改输入电压、然后将电压值更改为 ADC 引脚、但 adcresult 寄存器值不会更改 adcresult6 adcresult7寄存器值始终会更改输入 GND 其他 adcresult 寄存器常量值、但当我更改输入电压 adcresultregister 时、不会产生任何影响。 这些 adcresult6-7变化的来源是什么。
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.
F28335 ADC 不工作。 我检查引脚。 我更改输入电压、然后将电压值更改为 ADC 引脚、但 adcresult 寄存器值不会更改 adcresult6 adcresult7寄存器值始终会更改输入 GND 其他 adcresult 寄存器常量值、但当我更改输入电压 adcresultregister 时、不会产生任何影响。 这些 adcresult6-7变化的来源是什么。
您好、Ricard、
我使用自己的电路板我会将 ADC 的一部分电路板原理图发送给您照片。 有奇怪的事件。 当我使用 ADC 引脚 adcin0-5 adcresult 值常量、但不要读取任何随机值、而是当我使用引脚 adcin6和 adcin7时、正如我在 adcresult 值更改 alwalys 之前所展示的那样。 此外、我还想将不同的通道更改为 adcin 引脚、但没有任何变化。毕竟、我在任何情况下都无法使用 ADC。 我最后使用 XCLKIN 30MHz。 这可能是个问题吗?
感谢你的帮助
我希望我们能够找到解决这个问题的办法
此致、
哈坎
#include "DSP28x_Project.h"
_interrupt void ADC_ISR (void);
uint16环计数;
UINT16转换计数;
uint16 Voltage1[10];
uint16 Voltage2[10];
MAIN ()
{
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;
EALLOW;
SysCtrlRegs.HISPCP。all = ADC_MODCLK;
EDIS;
Dint;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
EALLOW; //这是写入 EALLOW 受保护寄存器所必需的
PieVectTable.ADCINT =&ADC_ISR;
EDIS; //这是禁止写入 EALLOW 受保护寄存器所必需的
InitAdc (); //对于此示例,初始化 ADC
//在 PIE 中启用 ADCINT
PieCtrlRegs.PIEIER1.bit.INTx6=1;
IER |= M_INT1;//启用 CPU 中断1
EINT; //启用全局中断 INTM
ERTM; //启用全局实时中断 DBGM
LoopCount = 0;
ConversionCount = 0;
//配置 ADC
AdcRegs.ADCMAXCONV.ALL = 0x0003; //在 SEQ1上设置2 conv
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x6;//将 ADCINA3设置为第1个 SEQ1转换器
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x7;//将 ADCINA2设置为第2个 SEQ1转换器
AdcRegs.ADCTRL2.bit.ePWM_SOCA_SEQ1 = 1;//从 ePWM 启用 SOCA 以启动 SEQ1
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1; //启用 SEQ1中断(每个 EOS)
//假设 ePWM1时钟已在 InitSysCtrl()中启用;
EPwm1Regs.ETSEL.bit.SOCAEN = 1; //启用组上的 SOC
EPwm1Regs.ETSEL.bit.SOCASEL = 4; //从 CPMA 中选择 SOC、以进行递增计数
EPwm1Regs.ETPS.bit.SOCAPRD = 1; //在发生第一个事件时生成脉冲
EPwm1Regs.CMPA.half.CMPA = 0x0080; //设置比较值
EPwm1Regs.TBPRD = 0xFFFF; //为 ePWM1设置周期
EPwm1Regs.TBCTL.bit.CTRMODE = 0; //向上计数并启动
//等待 ADC 中断
for (;;)
{
LoopCount++;
}
}
_interrupt void ADC_ISR (void)
{
Voltage1[ConversionCount]= AdcRegs.ADCRESULT0 >> 4;
Voltage2[ConversionCount]= AdcRegs.ADCRESULT1 >>4;
//如果记录了40次转换,则重新开始
if (ConversionCount = 9)
{
ConversionCount = 0;
}
其他
{
ConversionCount++;
}
//为下一个 ADC 序列重新初始化
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; //重置 SEQ1
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1; //清除 INT SEQ1位
PieCtrlRegs.PIEACX.ALL = PIEACK_Group1; //确认 PIE 中断
返回;
}
您好、Hakan、
驱动 ADC 基准电压的4.7K 欧姆电阻器之后是否有缓冲器? ADC 基准需要一个极低阻抗和高带宽驱动器。
您可以尝试将其替换为0欧姆电阻、并向 VSSA 添加与 REF3120输出驱动一样大的电容器...可能是2.2 uF 的好起点。 如果这还不够、您应该尝试使用运算放大器进行缓冲。 我们建议将 OPA320或 OPA350用于某些较新的器件、但这些器件也应在此处工作。