ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //独立模式
ADC_InitStructure.ADC_ScanConvMode = ENABLE; //连续多通道模式
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //连续转换
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //转换不受外界决定
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //右对齐
ADC_InitStructure.ADC_NbrOfChannel = 2; //扫描通道数
ADC_Init(ADC1, &ADC_InitStructure);
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_55Cycles5); //通道X,采用时间为55.5周期,1代表规则通道第1个
ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 2, ADC_SampleTime_55Cycles5);
ADC_Cmd (ADC1, DISABLE);
for(jzz=0;jzz<30000;jzz++);
ADC1->CR2|=0x08;
while(ADC1->CR2&0x08!=0x08);
ADC1->CR2|=0x04;
while(ADC1->CR2&0x04!=0x04);
ADC_Cmd (ADC1, ENABLE); /* Enable ADC1 */
ADC_SoftwareStartConvCmd(ADC1,ENABLE);/* Start ADC1 Software Conversion */ //使能转换开始
这是我借用我师傅的代码改的,他原先是单通道的。
问题1:我现在的的adc配置对吗?还有设置指定ADC的规则组通道放现在这个位置合适吗,还是得像原子个的adc实验代码那样放在u16 Get_Adc(u8 ch) 这个函数里面。
问题2:上面的代码在校准adc前把它关掉了,校准完成后才开启的。而原子哥的程序是先开启的adc。下面是原子哥的代码
ADC_Cmd(ADC1, ENABLE); //使能指定的ADC1
ADC_ResetCalibration(ADC1); //使能复位校准
while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准结束
ADC_StartCalibration(ADC1); //开启AD校准
while(ADC_GetCalibrationStatus(ADC1)); //等待校准结束
// ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC1的软件转换启动功能
}
//获得ADC值
//ch:通道值 0~3
u16 Get_Adc(u8 ch)
{
//设置指定ADC的规则组通道,一个序列,采样时间
ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 ); //ADC1,ADC通道,采样时间为239.5周期
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC1的软件转换启动功能
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束
return ADC_GetConversionValue(ADC1); //返回最近一次ADC1规则组的转换结果
}
|