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.
工具与软件:
你好。
我正在使用 TMS320F280025C 上的温度传感器。
我的理解是、以下程序在 while 语句中循环执行、直到 AD 转换完成、然后在转换完成时退出循环并开始计算。
但是、当我调试程序时、程序从不会退出 while 循环。
下面是使用温度传感器和 board.c 中 ADC 部分设置的函数
我忽视了什么吗?
提前感谢您的帮助。
函数↓
int getThermalE (SSCMGParametar* aPara){
易失性 uint16_t Tempe_ADCResult = 0;
ADC_forceMultipleSOC (ADC_2_base、ADC_FORCE_SOC0);
while (ADC_getInterruptStatus (ADC_2_base、ADC_INT_Number3)=false){
}
ADC_clearInterruptStatus (ADC_2_base、ADC_INT_Number3);
Tempe_ADCResult = ADC_readResult (ADC_2_Result_BASE、ADC_SOC_NUMBER0);
int16_t Tempe = ADC_getTemperatureC (Tempe_ADCResult、3.3f);
if (TRUE =ADC_getInterruptOverflowStatus (ADC_2_base、ADC_INT_Number3))
{
ADC_clearInterruptOverflowStatus (ADC_2_base、ADC_INT_Number3);
ADC_clearInterruptStatus (ADC_2_base、ADC_INT_Number3);
}
返回温度;
}
board.c↓
void adc_2_init (){
//
// ADC 初始化:写入 ADC 配置并为 ADC 加电
//
//设置模拟电压基准选择和 ADC 模块的失调电压修整。
//此功能将模拟电压基准设置为内部(基准电压为1.65V 或2.5V)或外部(对于 ADC)
//它与 ASysCtl API 相同。
//
ADC_setVREF (ADC_2_base、ADC_reference_internal、ADC_reference_3_3V);
//
//配置模数转换器模块预分频器。
//
ADC_setPrescaler (ADC_2_base、ADC_CLK_DIV_2_0);
//
//设置转换结束脉冲的时序
//
ADC_setInterruptPulseMode (ADC_2_base、ADC_PULSE_END_OF_CONV);
//
//为模数转换器内核加电。
//
ADC_enableConverter (ADC_2_BASE);
//
//延迟1ms 以允许 ADC 有时间上电
//
DEVICE_DELAY_US (5000);
//
// SOC 配置:设置 ADC ePWM 通道和触发设置
//
//禁用 SOC 突发模式。
//
ADC_disableBurstMode (ADC_2_base);
//
//设置 SOC 的优先级模式。
//
ADC_setSOCPriPriority (ADC_2_base、ADC_PRI_ALL_ROUND_Robin);
//
//开始转换0配置
//
//
//配置 ADC 中的转换启动(SOC)及其中断 SOC 触发器。
// SOC 编号:0
// Trigger:adc_trigger_sw_only
// Channel:ADC_CH_ADCIN12
//示例窗口:8个 SYSCLK 周期
// Interrupt Trigger:ADC_INT_SOC_TRIGGER_NONE
//
ADC_setupSOC (ADC_2_base、ADC_SOC_NUMBER0、ADC_TRIGGER_SW_ONLY、ADC_CH_ADCIN12、8u);
ADC_setInterruptSOCTrigger (ADC_2_base、ADC_SOC_NUMBER0、ADC_INT_SOC_TRIGGER_NONE);
//
//开始转换1配置
//
//
//配置 ADC 中的转换启动(SOC)及其中断 SOC 触发器。
// SOC 编号:1.
// Trigger:adc_trigger_sw_only
// Channel:ADC_CH_ADCIN2.
//示例窗口:8个 SYSCLK 周期
// Interrupt Trigger:ADC_INT_SOC_TRIGGER_NONE
//
ADC_setupSOC (ADC_2_base、ADC_SOC_number1、ADC_TRIGGER_SW_ONLY、ADC_CH_ADCIN2、8U);
ADC_setInterruptSOCTrigger (ADC_2_base、ADC_SOC_Number1、ADC_INT_SOC_TRIGGER_NONE);
//
//开始转换2配置
//
//
//配置 ADC 中的转换启动(SOC)及其中断 SOC 触发器。
// SOC 编号:2.
// Trigger:adc_trigger_sw_only
// Channel:ADC_CH_ADCIN4.
//示例窗口:8个 SYSCLK 周期
// Interrupt Trigger:ADC_INT_SOC_TRIGGER_NONE
//
ADC_setupSOC (ADC_2_base、ADC_SOC_number2、ADC_TRIGGER_SW_ONLY、ADC_CH_ADCIN4、8U);
ADC_setInterruptSOCTrigger (ADC_2_base、ADC_SOC_Number2、ADC_INT_SOC_TRIGGER_NONE);
//
//开始转换3配置
//
//
//配置 ADC 中的转换启动(SOC)及其中断 SOC 触发器。
// SOC 编号:3
// Trigger:adc_trigger_sw_only
// Channel:ADC_CH_ADCIN6
//示例窗口:8个 SYSCLK 周期
// Interrupt Trigger:ADC_INT_SOC_TRIGGER_NONE
//
ADC_setupSOC (ADC_2_base、ADC_SOC_Number3、ADC_TRIGGER_SW_ONLY、ADC_CH_ADCIN6、8U);
ADC_setInterruptSOCTrigger (ADC_2_base、ADC_SOC_Number3、ADC_INT_SOC_TRIGGER_NONE);
//
//开始转换4配置
//
//
//配置 ADC 中的转换启动(SOC)及其中断 SOC 触发器。
// SOC 编号:4
// Trigger:adc_trigger_sw_only
// Channel:ADC_CH_ADCIN7.
//示例窗口:8个 SYSCLK 周期
// Interrupt Trigger:ADC_INT_SOC_TRIGGER_NONE
//
ADC_setupSOC (ADC_2_base、ADC_SOC_Number4、ADC_TRIGGER_SW_ONLY、ADC_CH_ADCIN7、8U);
ADC_setInterruptSOCTrigger (ADC_2_base、ADC_SOC_Number4、ADC_INT_SOC_TRIGGER_NONE);
//
//开始转换5配置
//
//
//配置 ADC 中的转换启动(SOC)及其中断 SOC 触发器。
// SOC 编号:5.
// Trigger:adc_trigger_sw_only
// Channel:ADC_CH_ADCIN8
//示例窗口:8个 SYSCLK 周期
// Interrupt Trigger:ADC_INT_SOC_TRIGGER_NONE
//
ADC_setupSOC (ADC_2_base、ADC_SOC_Number5、ADC_TRIGGER_SW_ONLY、ADC_CH_ADCIN8、8U);
ADC_setInterruptSOCTrigger (ADC_2_base、ADC_SOC_Number5、ADC_INT_SOC_TRIGGER_NONE);
//
//开始转换6配置
//
//
//配置 ADC 中的转换启动(SOC)及其中断 SOC 触发器。
// SOC 编号:6
// Trigger:adc_trigger_sw_only
// Channel:ADC_CH_ADCIN14.
//示例窗口:8个 SYSCLK 周期
// Interrupt Trigger:ADC_INT_SOC_TRIGGER_NONE
//
ADC_setupSOC (ADC_2_base、ADC_SOC_NUMBER6、ADC_TRIGGER_SW_ONLY、ADC_CH_ADCIN14、8U);
ADC_setInterruptSOCTrigger (ADC_2_base、ADC_SOC_NUMBER6、ADC_INT_SOC_TRIGGER_NONE);
//
//开始转换7配置
//
//
//配置 ADC 中的转换启动(SOC)及其中断 SOC 触发器。
// SOC 编号: 7.
// Trigger:adc_trigger_sw_only
// Channel:ADC_CH_ADCIN15.
//示例窗口:8个 SYSCLK 周期
// Interrupt Trigger:ADC_INT_SOC_TRIGGER_NONE
//
ADC_setupSOC (ADC_2_base、ADC_SOC_NUMBER7、ADC_TRIGGER_SW_ONLY、ADC_CH_ADCIN15、8u);
ADC_setInterruptSOCTrigger (ADC_2_base、ADC_SOC_NUMBER7、ADC_INT_SOC_TRIGGER_NONE);
//
// ADC 中断1配置
// Source:adc_soc_NUMBER0
//中断源:已启用
//连续模式:禁用
//
//
ADC_setInterruptSource (ADC_2_base、ADC_INT_number1、ADC_SOC_NUMBER0);
ADC_clearInterruptStatus (ADC_2_base、ADC_INT_number1);
ADC_disableContinuousMode (ADC_2_base、ADC_INT_number1);
ADC_enableInterrupt (ADC_2_base、ADC_INT_number1);
}
我很抱歉。
正确的功能如下。
int getThermalE (SSCMGParametar* aPara){
易失性 uint16_t Tempe_ADCResult = 0;
ADC_forceMultipleSOC (ADC_2_base、ADC_FORCE_SOC0);
while (ADC_getInterruptStatus (ADC_2_base、ADC_INT_number1)= false){
}
ADC_clearInterruptStatus (ADC_2_base、ADC_INT_number1);
Tempe_ADCResult = ADC_readResult (ADC_2_Result_BASE、ADC_SOC_NUMBER0);
int16_t Tempe = ADC_getTemperatureC (Tempe_ADCResult、3.3f);
if (TRUE =ADC_getInterruptOverflowStatus (ADC_2_base、ADC_INT_number1))
{
ADC_clearInterruptOverflowStatus (ADC_2_base、ADC_INT_number1);
ADC_clearInterruptStatus (ADC_2_base、ADC_INT_number1);
}
返回温度;
}
INT 编号设置为1。
尊敬的 Hiroki:
C2000ware 中有一个读取温度的示例 ex3。 请参考它。
路径如下:
[安装路径]\C2000Ware_5_03_00_00\driverlib\f28002x\examples\adc\ex3
谢谢!
Susmitha
尊敬的 Susmitha:
我已经审查了提供的样本方案、并打算相应地设立这些方案。
我认为此示例的唯一区别是除了 ADCC 之外、使用 ADCA。
使用两个通道是否会产生任何可能的影响?
谢谢。
两个通道都在内部连接。 您可以使用其中任何一个。 您可以快速更改项目中 SysConfig 文件上的通道。
在表达式窗口中观察变量来读取温度吗?
您还可以检查 Launchpad 是否 在代码上对 ADC 使用相同的 Vref? 内部还是外部?
最后、最好在 Launchpad 上运行示例、查看它是否正常工作。
谢谢!
Susmitha