想着把原子哥的ADC获取外部电压和测试内部温度简单的结合到一块,但是遇到了俩问题
1:当红色背景语句不注释掉时,函数只能运行到main函数的while(1)之后就不在往下运行
2:当注释掉红色背景语句时,函数正常运行,但是得到电压的值是0,而且内部温度得到的值也不准确
//主函数
int main(void)
{
u16 data;
float temp;
SystemInit();
delay_init(72); //延时初始化
NVIC_Configuration();
uart_init(9600);
LED_Init();
KEY_Init();
LCD_Init();
adc_init();
POINT_COLOR=RED; //字体颜色为红色
LCD_ShowString(30,50,"Mis Duan ^_^");
LCD_ShowString(30,70,"HE NAN Colleage");
LCD_ShowString(30,90,"@Mi Zhang");
LCD_ShowString(30,110,"2013/08/17");
LCD_ShowString(30,130,"ADC_CH12_VAL:");
LCD_ShowString(30,150,"ADC_CH12_VOL:0.000V");
LCD_ShowString(30,170,"ADC_TEMPER:00.000");
while(1)
{
POINT_COLOR=BLUE;
data=adc_getvalue();
LCD_ShowNum(134,130,data,4,16);
temp=(float)data*(3.3/4096);
data=temp;
LCD_ShowNum(134,150,data,1,16);
temp-=data;
temp*=1000;
LCD_ShowNum(150,150,temp,3,16);
temp=tempr_getvalue();
data=temp;
LCD_ShowNum(118,170,data,2,16);
temp=temp-data;
temp*=1000;
LCD_ShowNum(142,170,temp,3,16);
LED1=!LED1;
delay_ms(250);
}
}
//adc初始化函数
void adc_init(void)
{
ADC_InitTypeDef ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
ADC_DeInit(ADC1);
ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode=ENABLE;
ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;
ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;
ADC_Init(ADC1,&ADC_InitStructure);
ADC_InjectedSequencerLengthConfig(ADC1,2);
ADC_InjectedChannelConfig(ADC1,ADC_Channel_12,1,ADC_SampleTime_1Cycles5);
ADC_InjectedChannelConfig(ADC1,ADC_Channel_16,2,ADC_SampleTime_41Cycles5);
ADC_TempSensorVrefintCmd(ENABLE);
ADC_Cmd(ADC1,ENABLE);
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));
}
//获取外部电压函数
u16 adc_getvalue(void)
{
u16 datavalue;
ADC_SoftwareStartInjectedConvCmd(ADC1,ENABLE);
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_JEOC));
datavalue=ADC_GetInjectedConversionValue(ADC1,ADC_InjectedChannel_1);
return datavalue;
}
//获取内部温度函数
float temper_getvalue(void)
{
u16 datavalue;
float v25=1.43;
float avg=0.0043;
float value,temper;
ADC_SoftwareStartInjectedConvCmd(ADC1,ENABLE);
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_JEOC));
datavalue=ADC_GetInjectedConversionValue(ADC1,ADC_InjectedChannel_2);
value=datavalue*(3.3/4096);
temper=(v25-value)/avg+25;
return temper;
}
|