// ADC1转换的电压值通过MDA方式传到SRAM
extern __IO uint16_t ADC_ConvertedValue;
// 局部变量,用于保存转换计算后的电压值
float ADC_ConvertedValueLocal;
//static void Delay(__IO u32 nCount); int a;
int a = 2000;
int main(void)
{
/*初始化USART1*/
Debug_USART_Config();
/* 初始化滑动变阻器用到的DAC,ADC数据采集完成后直接由DMA运输数据到ADC_ConvertedValue变量
DMA直接改变ADC_ConvertedValue的值*/
Rheostat_Init();
printf("\r\n ----这是一个光敏电阻电压采集实验(DMA传输)----\r\n");
while(1)
{
ADC_ConvertedValueLocal =(float) ADC_ConvertedValue/4096*(float)3.3; // 读取转换的AD值
printf("\r\n The current AD value = 0x%04X \r\n", ADC_ConvertedValue);
printf("\r\n The current AD value = %f V \r\n",ADC_ConvertedValueLocal);
if (ADC_ConvertedValueLocal > a)
{
LED1( OFF ); // 灭
}
else
{
LED1( ON ); // 亮
}
}
}
跑起来什么现象?
问题出在这一步:
ADC_ConvertedValueLocal =(float) ADC_ConvertedValue/4096*(float)3.3; // 读取转换的AD值。
根据代码注释做出以下两种猜测,提供问题分析思路:
猜测一:
如代码注释中所说,若ADC_ConvertedValueLocal用于保存转换计算后的电压值,那么ADC_ConvertedValue应当是ADC1采样后的转化值,从程序计算可知所使用的ADC1应该为12位的,这个值应当是处于0 ~ 4096之间,那么计算出的ADC_ConvertedValueLocal 值应当是在0 ~ 3.3V之间,永远小于a(2000);
猜测二:
如代码注释所说,若ADC_ConvertedValue保存的是ADC1转换的电压值,那么ADC_ConvertedValueLocal应当是ADC1采样电压对应的量化值,计算方式应为:ADC_ConvertedValueLocal = (float) ADC_ConvertedValue / 3.3 * 4096;这样计算出的ADC_ConvertedValueLocal的值才有可能大于a(2000),或者小于等于a(2000)。