我花了很多时间来调试这个问题。 让我快速解释一下、发布源代码并等待进一步的帮助:
我让 ADC0和 ADC1分别从引脚 PE0和 PB5读取样本。 当我单步执行环路时、您将在下面找到 ADC0 (PE0)结果、这正是我所期望的结果、 但是、在第一次通过循环期间、我观察到4位"下溢"标志被置位(ADC0 - USTAT)、并且所有后续调用返回一个大约0x1FF 过高的结果。 这不是预期结果的两倍、而是其他结果。
下图显示了我期望0x234作为十六进制(int((((VOUT/3/3)*4096))=0x234的结果。 通常、第一次通过循环时、我得到0x22D - 0x236。 后续结果介于0x41D 和0x429之间(不是预期结果的两倍)。 PE0上出现的电压经 o 示波器验证、符合预期(~0.456V)-其中预期结果为 VOUT = VIN*(R2/(R1+R2))= 0x4545V。
下面是进入 PE0的电阻分压器的简单示意图:
---输入电压(来自 USB 的5.0V)---
R1 = 10K
-------------- (VOUT) PE0
R2 = 1K
------ GND--------
/******** //*
任务 */
******** /
空 BatteryMonitor (UArg arg0、UArg arg1)
{
uint32_t u32电压;
uint32_t u32Light;
ERROR_Block ebBatMonAccess;
int32_t 调试;
//任务 Hello
debugPrint ("BatteryMonitor Task started\n");
/*构造要用作资源锁定的信标对象,初始计数1 */
/*获取实例句柄*/
error_init (&ebBatMonAccess);
semBatMonAccess = semaphore_create (1、NULL、&ebBatMonAccess);
if (semBatMonAccess =NULL){
system_abort ("错误:BatteryMonitor:信标创建失败");
}
InitMonitorChannel();
debugPrint ("BatteryMonitor 任务初始化完成\n");
//任务循环
while (true){
//
//触发 ADC 转换。
//
ADCProcessorTrigger (ADC0_BASE、3);//电压
//
//等待采样序列完成
//
while (!ADCIntStatus (ADC0_BASE、3、false){}
//
//读取 ADC 值。
//
调试= ADCSequenceDataGet (ADC0_BASE、3、&u32Voltage);
//来自 ADC.c - ADCIntClear ()说明
//! \note 由于 Cortex-M 处理器中有一个写入缓冲区、它可能会
//! 在实际清除中断源之前需要几个时钟周期。
ADCIntClear (ADC0_BASE、3);
debugPrint ("INFO:BatteryMonitor:ADCSequenceDataGet ()=%d、u32Voltage = 0x%x\n"、debug、u32Voltage);
//类似互斥的等待。 如果其他人正在访问、请勿访问
Semaphore_pend (semBatMonAccess、BIOS_wait_forever);
adcVoltage =(uint16_t)(u32Voltage & 0xFFFF);
Semaphore_post (semBatMonAccess);
//
//触发 ADC 转换。
//
ADCProcessorTrigger (ADC1_base、0);// Current
//
//等待采样序列完成
//
while (!ADCIntStatus (ADC1_base、0、false)){}
//
//读取 ADC 值。
//
ADCSequenceDataGet (ADC1_base、0、&u32Light);
//来自 ADC.c - ADCIntClear ()说明
//! \note 由于 Cortex-M 处理器中有一个写入缓冲区、它可能会
//! 在实际清除中断源之前需要几个时钟周期。
ADCIntClear (ADC1_BASE、0);
debugPrint ("INFO:BatteryMonitor:u32Light = 0x%x\n"、u32Light);
//类似互斥的等待。 如果其他人正在访问、请勿访问
Semaphore_pend (semBatMonAccess、BIOS_wait_forever);
adcLight =(uint16_t)(u32Light & 0xFFFF);
Semaphore_post (semBatMonAccess);
Task_sleep (ADC_sleep);
}
}/*void
ADC0_ISR (void)
{
ADC0_ISC_R |= 0x01;//写入一个以清除中断
}
void ADC1_ISR (void)
{
ADC1_ISC_R |= 0x01;//写入一个以清除中断
}*/
******** //*
帮助程序功能 */
******** /
static void InitMonitorChannel (void)
{
uint32_t 调试;
SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);//这用于电池监控
while (!SysCtlPeripheralReady (SYSCTL_Periph_ADC0)){}
ADCClockConfigSet (ADC0_BASE、ADC_CLOCK_SRC_PIOSC | ADC_CLOCK_RATE_FULL、1);
GPIOPinTypeGPIOInput (GPIO_Porte _BASE、GPIO_PIN_0);
GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_0);//电池电压监控
ADCReferenceSet (ADC0_BASE、ADC_REF_INT);
ADCSequenceDisable (ADC0_BASE、3);//电压监视器
ADCSequenceConfigure (ADC0_BASE、3、ADC_TRIGGER_PROCESSOR、0);//序列3上的电压监视器
ADCSequenceStepConfigure (ADC0_BASE、3、0、ADC_CTL_IE | ADC_CTL_END | ADC_CTL_CH3);//电压监视器
ADCSequenceEnable (ADC0_BASE、3);//电压监视器
SysCtlPeripheralEnable (SYSCTL_Periph_ADC1);
while (!SysCtlPeripheralReady (SYSCTL_Periph_ADC1)){}
ADCClockConfigSet (ADC1_base、ADC_CClock_SRC_PIOSC | ADC_CClock_RATE_FULL、1);
GPIOPinTypeGPIOInput (GPIO_PORTB_BASE、GPIO_PIN_5);
GPIOPinTypeADC (GPIO_PORTB_BASE、GPIO_PIN_5);//电流监控
ADCReferenceSet (ADC1_base、ADC_REF_INT);
ADCSequenceDisable (ADC1_base、0);//电压监视器
ADCSequenceConfigure (ADC1_base、0、ADC_TRIGGER_PROCESSOR, 0);//序列4上的电流监视器
ADCSequenceStepConfigure (ADC1_base、0、0、ADC_CTL_IE | ADC_CTL_END | ADC_CTL_CH11);//电流监视器
ADCSequenceEnable (ADC1_base、0);//电流监视器
//调试:
调试= ADCReferenceGet (ADC0_BASE);
开关(调试){
ADC_REF_INT 案例:
debugPrint ("debug:BatteryMonitor:ADCReferenceGet (ADC0_BASE)= ADC_REF_INT\n"\});
中断;
ADC_REF_EXT_3V 案例:
debugPrint ("debug:BatteryMonitor:ADCReferenceGet (ADC0_BASE)= ADC_REF_EXT_3V\n");
中断;
ADC_REF_EXT_1V 案例:
debugPrint ("debug:BatteryMonitor:ADCReferenceGet (ADC0_BASE)= ADC_REF_EXT_1V\n");
中断;
默认值:
debugPrint ("Debug:BatteryMonitor: ADCReferenceGet (ADC0_BASE)=超级四分制\n");
中断;
}
调试= ADCReferenceGet (ADC1_BASE);
开关(调试){
ADC_REF_INT 案例:
debugPrint ("Debug:BatteryMonitor: ADCReferenceGet (ADC1_base)= ADC_REF_INT\n");
中断;
ADC_REF_EXT_3V 案例:
debugPrint ("debug:BatteryMonitor:ADCReferenceGet (ADC1_base)= ADC_REF_EXT_3V\n");
中断;
ADC_REF_EXT_1V 案例:
debugPrint ("debug:BatteryMonitor:ADCReferenceGet (ADC1_base)= ADC_REF_EXT_1V\n");
中断;
默认值:
debugPrint ("Debug:BatteryMonitor: ADCReferenceGet (ADC1_base)=超级四分制\n");
中断;
}
}
