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.
尊敬的团队:
我设计了使用 F280025C 微控制器定制板。
我的问题:
我使用了 ADC 示例代码- SoC 继续模式(来自 F28002x 代码- C2000)
但调试代码时,我看不到 ADC 变量的任何变化(在监视表达式中-设置连续刷新模式)
它始终保持不变-对所有已用 ADC 引脚应用电位计,但结果相同!
请指导我错过了哪些步骤?
我还想知道,
-如何为特定 ADC 引脚选择 SOC 和中断(1,2,3,4)
——如何在对话完成时触发 ADC——自动触发
此致,
Shivam
Shivam 您好,
ADC SOC 连续示例将在单个通道或单个 ADC 上进行转换,因此您需要确保将其配置为使用应用了刺激的通道。
否则,请在您的定制板上检查以下事项:
您还可以尝试一个更简单的示例,如软件强制 ADC 转换。
这是在多个主板上发生的,还是只在一个主板上发生的?
您好,Devine,
感谢您的回复!
我使用 了 ADC_EX1_SOC_SOFTWARE.c 示例代码,我使用了 F280025C 的模拟 A3引脚,并对 A3引脚应用了3.3VDC。
正如我在监视表达式中看到的那样,我只获得 myADC1Result0和 myADC1Result1中的值[ ADC 值波动很大 ,即2000到4095]。
myADC0Result0 和 myADC0Result1中的数据不可用,原因是什么?
如何在 myADC1Result0 和 myADC1Result1中获得稳定值 ADC 值?
为什么 myADC0Result0 和 myADC0Result1 显示为零?
请注意:
我已经从 LDO 获得了3.3VDC 电压, 在示波器中测得的电压非常稳定。
此致,
Shivam
Shivam 您好,
是为 VDDA,VREFHI 提供3.3V 电源,还是两者都提供? 您使用的是内部还是外部参考模式?
ADC_ex1是将其设为 SW 断点(ESTOP0),还是卡在代码的其中一个循环中?
您能否直接在“表达式”窗口中查看 ADC 结果寄存器? 这些有价值吗? 例如,AdcaResultRegs.ADCRESULT0
ADC-A 上的 SOC0和 SOC1是否都指向 A3 (这在 sysconfig 中配置)? 这些值对应于 ADC0 - Result0和 ADC0 - Result1。 (ADC1 - Result0和 ADC1 - Result1来自 ADC-C)
德文:
以下是我的代码 [ADC_EX13_SOC_oversampling] ADC 值波动,请告诉我 [我已为 VDDA 引脚提供了3.3VDC ]
//########################################################
//
//文件:ADC_EX13_SOC_oversampling.c.
//
//标题:使用多个 SOC 的 ADC 逆向采样
//
//! \addtogroup driver_example_list
//! H1>ADC SOC 反采样</H1>
//!
//! 此示例设置了 ePWM1以定期触发一组转换
//! ADCA 包括多个 SOC,所有 SOC 都转换 A2以实现超采样
//! 解答2.
//!
//! ADCA 中断 ISR 用于读取 ADCA 的结果。
//!
//! b 外部连接\n
//! - A0,A1,A2应连接到要转换的信号。
//!
//! b 监视变量\n
//! -\b\f4 adcAResult0 -针脚 A0上电压的数字表示
//! -\b\f4 adcAResult1 -引脚 A1上电压的数字表示
//! -/b adcAResult2 -针脚 A2上电压的数字表示
//!
//
//########################################################
//
//
//$版权:
//版权所有(C) 2021 Texas Instruments Incorporated - http://www.ti.com/
//
//以源代码和二进制格式重新分发和使用,无论是否
//修改,只要符合以下条件即可
//符合:
//
//重新分发源代码必须保留上述版权
//通知,此条件列表和以下免责声明。
//
//二进制形式的再发行必须复制上述版权
//通知,此条件列表和中的以下免责声明
//随提供的文档和/或其他材料
//分布。
//
//德州仪器(TI)公司的名称和的名称都不相同
//其贡献者可用于背书或推广衍生产品
//未经事先书面许可,从该软件获得。
//
//本软件由版权所有者和贡献者提供
//“原样”和任何明示或暗示的担保,包括但不包括
//限于对适销性和适用性的暗示保证
//没有特定目的。 在任何情况下,版权均不受限制
//所有者或贡献者应对任何直接,间接,偶然,
//特殊,模范或后果性损害(包括但不包括)
//仅限于采购替代货物或服务;不使用,
//数据或利润;或业务中断)
//责任理论,无论是在合同中,严格责任还是侵权行为中
//(包括疏忽或其他)因使用而产生的任何形式
//,即使被告知可能会造成此类损坏,也是如此。
//$
//########################################################
//
//
//包含的文件
//
#include "driverlib.h"
#include "device.h"
#包括"board.h"
//
//全球
//
UINT16_t adcAResult0;
UINT16_t adcAResult1;
UINT16_t adcAResult2;
//
//函数原型
//
void initEPWM();
中断 void adcA1ISR (void);
//
//主页
//
void My_ADC_INIT();
主无效(无效)
{
//
//初始化设备时钟和外围设备
//
device_init();
//
//禁用引脚锁定并启用内部上拉。
//
device_initGPIO ();
//
//初始化饼图并清除饼图寄存器。 禁用 CPU 中断。
//
interrup_initModule();
//
//使用指向 shell Interrupt 的指针初始化 PIE 矢量表
//服务例程(ISR)。
//
interrup_initVectorTable();
//
//设置 ADC:
//信号模式:单端
//转换分辨率:12位;
//
//在循环模式下配置 SOC0-1以采样 A0和 A1通道
//和 SOC2-SOC5分别对 EPWM1SOCA 上的通道 A2进行采样
//触发器。
//
//注册并启用中断:
//在的每个 PWM 触发器后读取 SOC0和 SOC1结果
//通道0和1输出,而 SOC2-SOC5结果将为
//对通道 A2结果采样过大的结果进行平均
//
// Board_init();
my_ADC_INIT();
//
//初始化 PWM
//
initEPWM();
//
//启用全局中断(INTM)和实时中断(DBGM)
//
EINT;
ERTM;
//
//启动 ePWM1,启用 SOCA,并将计数器置于计数模式
//
ePWM_enableADCTrigger (EPWM1_BASE,ePWM_SOC_A);
ePWM_setTimeBaseCounterMode (EPWM1_BASE,ePWM_COUNT_MODE_UP);
//
//循环无限地进行转换
//
行动
{
//
//等待 ePWM 导致 ADC 转换。
// ADCA1 ISR 处理每一组新的转换。
//
}
While (1);
}
//
//配置 ePWM1以生成 SOC 的功能。
//
使 initEPWM(void)无效
{
//
//禁用 SOCA
//
ePWM_disableADCTrigger (EPWM1_BASE,ePWM_SOC_A);
//
//将 SOC 配置为在第一次计数事件上发生
//
ePWM_setADC触发 源(EPWM1_BASE,ePWM_SOC_A,ePWM_SOC_TBCTR_U_CMPA);
ePWM_setADCTriggerEventPrescale (EPWM1_BASE,ePWM_SOC_A,1);
//
//将比较值设置为1000,期间设置为1999
//假设 ePWM 时钟为100MHz,这将提供50kHz 采样
// 50MHz ePWM 时钟提供25kHz 采样等
//也可以通过更改 ePWM 周期来调制采样率
//直接(确保比较值小于期间)。
//
ePWM_setCounterCompareValue (EPWM1_BASE,ePWM_counter_compare_A,1000);
ePWM_setTimeBasePeriod (EPWM1_BASE,1999);
//
//将本地 ePWM 模块时钟分配器设置为/1
//
ePWM_setClockPrescaler (EPWM1_BASE,
ePWM_CLOCK_diver_1,
ePWM_HSCLOCK 分隔符_1);
//
//冻结计数器
//
ePWM_setTimeBaseCounterMode (EPWM1_BASE,ePWM_counter_mode_stop_freeze);
}
//
// adcA1ISR - ADC A Interrupt 1 ISR
//
_interrupt void adcA1ISR (void)
{
//
//存储 A0和 A1的结果
//
adcAResult0 = ADC_readResult (ADCARESULT_BASE,ADC_SOC_NUMBER0);
// adcAResult1 = ADC_readResult (ADCARESULT_BASE,ADC_SOC_NUMBER1);
//
/////
////将4个过度采样的 A2结果平均在一起
/////
// adcAResult2 =
//(ADC_readResult (ADCARESULT_BASE,ADC_SOC_NUMBER2)+
// ADC_readResult (ADCARESULT_BASE,ADC_SOC_Number3)+
// ADC_readResult (ADCARESULT_BASE,ADC_SOC_Number4)+
// ADC_readResult (ADCARESULT_BASE,ADC_SOC_Number5)>> 2;
//
//清除中断标志
//
ADC_ClearInterruptStatus (ADCA_BASE,ADC_INT_NUMBER1);
//
//检查是否发生溢出
//
IF (TRUE == ADC_getInterruptOverflowStatus (ADCA_BASE,ADC_INT_NUMBER1)))
{
ADC_ClearInterruptOverflowStatus (ADCA_BASE,ADC_INT_NUMBER1);
ADC_ClearInterruptStatus (ADCA_BASE,ADC_INT_NUMBER1);
}
//
//确认中断
//
interrup_clearACKGroup (interrup_ACK_GROUP1);
}
//
//文件结尾
//
使 My_ADC_INIT()失效
{
// A0/C15模拟比荷偶
GPIO 设置引脚配置(GPIO_231_GPIO231);
// AIO ->已选择模拟模式
GPIO 设置模拟模式(231,GPIO 模拟启用);
//myADC0初始化
// ADC 初始化:写入 ADC 配置并启动 ADC
//配置 ADC 模块的偏移调整
ADC_setOffsetTrimAll (ADC_reference_internal,ADC_reference_3_3V);
//配置模数转换器模块预校准器。
ADC_setPrescaler (myADC0_base,ADC_CLK_DIV_2_0);
//设置转换结束脉冲的时间
ADC_setInterruptPulseMode (myADC0_base,ADC_PULL_END_of_CONV);
//启动模数转换器内核。
ADC_enableConverter (myADC0_base);
//延迟1毫秒以允许 ADC 有时间通电
DEVICE_DELAY _US (5000);
// SOC 配置:设置 ADC ePWM 通道和触发器设置
//禁用 SOC 突发模式。
ADC_disableBurstMode (myADC0_BASE);
//设置 SOC 的优先级模式。
ADC_setSOCPriority (myADC0_BASE,ADC_PRI_All_ROUND);
//转换0配置的开始
//在 ADC 及其中断 SOC 触发器中配置转换开始(SOC)。
// SOC 编号:0
//触发器:ADC_TRIGID_EPWM1_SOCA
//通道:ADC_CH_ADCIN0
//示例窗口:8个 SYSCLK 周期
//中断触发器:ADC_INT_SOC_TRIG_NONE
ADC_setupSOC (myADC0_BASE,ADC_SOC_NUMBER0,ADC_TRIG_EPWM1_SOCA,ADC_CH_ADCIN0,8U);
ADC_setInterruptSOCTRIGN (myADC0_BASE,ADC_SOC_NUMBER0,ADC_INT_SOC_TRIG_NONE);
//转换1配置的开始
//在 ADC 及其中断 SOC 触发器中配置转换开始(SOC)。
// SOC 编号:1.
//触发器:ADC_TRIGID_EPWM1_SOCA
//通道:ADC_CH_ADCIN1.
//示例窗口:8个 SYSCLK 周期
//中断触发器:ADC_INT_SOC_TRIG_NONE
ADC_setupSOC (myADC0_BASE,ADC_SOC_NUMBER1,ADC_TRIG_EPWM1_SOCA,ADC_CH_ADCIN1,8U);
ADC_setInterruptSOCTRIGGER (myADC0_BASE,ADC_SOC_NUMBER1,ADC_INT_SOC_TRIG_NONE);
//转换2配置的开始
//在 ADC 及其中断 SOC 触发器中配置转换开始(SOC)。
// SOC 编号:2.
//触发器:ADC_TRIGID_EPWM1_SOCA
//通道:ADC_CH_ADCIN2
//示例窗口:8个 SYSCLK 周期
//中断触发器:ADC_INT_SOC_TRIG_NONE
ADC_setupSOC (myADC0_BASE,ADC_SOC_NUMBER2,ADC_TRIG_EPWM1_SOCA,ADC_CH_ADCIN2,8U);
ADC_setInterruptSOCTRIGGER (myADC0_BASE,ADC_SOC_NUMBER2,ADC_INT_SOC_TRIG_NONE);
//转换3配置的开始
//在 ADC 及其中断 SOC 触发器中配置转换开始(SOC)。
// SOC 编号:3.
//触发器:ADC_TRIGID_EPWM1_SOCA
//通道:ADC_CH_ADCIN2
//示例窗口:8个 SYSCLK 周期
//中断触发器:ADC_INT_SOC_TRIG_NONE
ADC_setupSOC (myADC0_BASE,ADC_SOC_Number3,ADC_TRIG_EPWM1_SOCA,ADC_CH_ADCIN2,8U);
ADC_setInterruptSOCTRIGGER (myADC0_BASE,ADC_SOC_Number3,ADC_INT_SOC_TRIG_NONE);
//转换4配置的开始
//在 ADC 及其中断 SOC 触发器中配置转换开始(SOC)。
// SOC 编号:4.
//触发器:ADC_TRIGID_EPWM1_SOCA
//通道:ADC_CH_ADCIN2
//示例窗口:8个 SYSCLK 周期
//中断触发器:ADC_INT_SOC_TRIG_NONE
ADC_setupSOC (myADC0_BASE,ADC_SOC_Number4,ADC_TRIG_EPWM1_SOCA,ADC_CH_ADCIN2,8U);
ADC_setInterruptSOCTRIGGER (myADC0_BASE,ADC_SOC_Number4,ADC_INT_SOC_TRIG_NONE);
//转换5配置的开始
//在 ADC 及其中断 SOC 触发器中配置转换开始(SOC)。
// SOC 编号:5.
//触发器:ADC_TRIGID_EPWM1_SOCA
//通道:ADC_CH_ADCIN2
//示例窗口:8个 SYSCLK 周期
//中断触发器:ADC_INT_SOC_TRIG_NONE
ADC_setupSOC (myADC0_BASE,ADC_SOC_Number5,ADC_TRIG_EPWM1_SOCA,ADC_CH_ADCIN2,8U);
ADC_setInterruptSOCTRIGGER (myADC0_BASE,ADC_SOC_Number5,ADC_INT_SOC_TRIG_NONE);
// ADC 中断1配置
// SOC/EOC 编号:5.
//中断源:已启用
//连续模式:已禁用
ADC_setInterruptSource (myADC0_base,ADC_INT_NUMBER1,ADC_SOC_Number5);
ADC_enableInterrupt (myADC0_base,ADC_INT_NUMBER1);
ADC_ClearInterruptStatus (myADC0_base,ADC_INT_NUMBER1);
ADC_disableContinuousMode (myADC0_base,ADC_INT_NUMBER1);
// asysctl 初始化
//禁用温度传感器到 ADC 的输出。
ASysctl_disableTemperatureSensor();
//将模拟电压参考选择设为内部。
ASysctl_setAnalogReferenceInternal( ASYSCTL_VREFHIA | ASYSCTL_VREFHIC );
//将内部模拟电压参考选择设置为1.65V。
ASysctl_setAnalogReference1P65( ASYSCTL_VREFHIA | ASYSCTL_VREFHIC );
// INT_myADC0_1的中断设置
中断寄存器(INT_myADC0_1,&ADcA1ISR);
Interrup_enable (INT_myADC0_1);
}
德文:
我解决了这个问题!
我使用过内部参考,内部 参考没有连接到任何位置[但根据我的经验,我们可以使用内部参考作为 ADC ,它应该起作用]
我已经为内部参考设置了以下值, 并且 ADC 输出中的值波动[我仍然很困惑为什么它不起作用!]
ASysctl_setAnalogReferenceInternal( ASYSCTL_VREFHIA | ASYSCTL_VREFHIC );
ASysctl_setAnalogReference1P65( ASYSCTL_VREFHIA | ASYSCTL_VREFHIC );
我的解决方案:
我已设置以下值,并对 VREFHI 和 VREFFLO 应用了3.3VDC 和 GND。
ASysctl_setAnalogReferenceExternal (ASYSCTL_VREFHIA | ASYSCTL_VREFHIC);
。
通过这样做,我成功获得了输出!
1)请解释为什么内部参考电压不工作?
2)请指导我如何使用 ePWMx 触发 ADC?
我 在 ADC_ex3_temp_sensor 中将 epwm1基本值更改为 epwm5 ,但它不起作用为什么?
此致,
Shivam
Shivam 您好,
您可以尝试 将 VREFFLO 连接到电路板的其余部分(H5引脚1接地),然后再次尝试内部参考? 我认为这应该与 ADC 输入使用的相同接地。
对于 ePWM 触发,您只需要两件事:
德文:
谢谢!
根据您的建议,我的问题得到了解决,我已将 ADC 初始化中的 PWM 触发源[ADC_TRIG_EPWM1_SOCA 和 EPWM1_BASE 设置为 epwm7]
此外,我已将 VREFFLO 连接到 GND,并获得了 ADC 结果[但数值波动-总体可接受的 ADC 值!]
此致,
Shivam
德文:
谢谢!
根据您的建议,我的问题得到了解决,我已将 ADC 初始化中的 PWM 触发源[ADC_TRIG_EPWM1_SOCA 和 EPWM1_BASE 设置为 epwm7]
此外,我已将 VREFFLO 连接到 GND,并获得了 ADC 结果[但数值波动-总体可接受的 ADC 值!]
此致,
Shivam