试了一下STM32的ADC1和ADC2,调试时出现的问题让我不解:
(1)只使用STM32的ADC1采集信号,PA.0为其模拟输入通道;
将ADC1配置成独立模式、单通道单次转换、软件触发,
采集到的数据是正确的;
(2)只使用ADC2采集信号,与(1)中ADC1的设置完全相同,即
PA.0为其模拟输入通道;
将ADC2配置成横独立模式、单通道单次转换、软件触发,
却采集不到数据;
所以,想请教一个问题:
STM32的ADC2采集相较ADC1采集时,对ADC2的配置有什么特殊要求吗?
或者其ADC2只能在双AD模式中才能使用?
此帖出自
小平头技术问答
刚才,那个我没看仔细,你多半是,ADC2的RCC_APBXXXX这个函数里面没有对ADC2设置好
您具体指的是这个函数吗?
ADC2是APB2总线上的外设,ADC2的时钟使能应该是没有问题的。
针对ADC1:
- //ADC1的模拟输入端PA.5
复制代码针对ADC2:- <font color="#0000ff">//ADC2的模拟输入端PA.5</font>
复制代码针对ADC1:- void Adc_Init(void)
- {
- ADC_InitTypeDef ADC_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 , ENABLE );
- RCC_ADCCLKConfig(RCC_PCLK2_Div6); //72M/6=12,ADC最大时间不能超过14M
-
- ADC_DeInit(ADC1);
- ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //独立模式
- ADC_InitStructure.ADC_ScanConvMode = DISABLE; //单通道
- ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //单次转换
- ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
- ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
- ADC_InitStructure.ADC_NbrOfChannel = 1;
- ADC_Init(ADC1, &ADC_InitStructure);
- ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 1, ADC_SampleTime_71Cycles5 );
- ADC_Cmd(ADC1, ENABLE);
- ADC_ResetCalibration(ADC1);
- while(ADC_GetResetCalibrationStatus(ADC1));
- ADC_StartCalibration(ADC1);
- while(ADC_GetCalibrationStatus(ADC1));
- }
复制代码针对ADC2:- <font color="#0000ff">void Adc_Init(void)
- {
- ADC_InitTypeDef ADC_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2 , ENABLE );
- RCC_ADCCLKConfig(RCC_PCLK2_Div6); //72M/6=12,ADC最大时间不能超过14M
-
- ADC_DeInit(ADC2);
- ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //独立模式
- ADC_InitStructure.ADC_ScanConvMode = DISABLE; //单通道
- ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //单次转换
- ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None ;
- ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
- ADC_InitStructure.ADC_NbrOfChannel = 1;
- ADC_Init(ADC2, &ADC_InitStructure);
- ADC_RegularChannelConfig(ADC2, ADC_Channel_5, 1, ADC_SampleTime_71Cycles5 );
- ADC_Cmd(ADC2, ENABLE);
- ADC_ResetCalibration(ADC2);
- while(ADC_GetResetCalibrationStatus(ADC2));
- ADC_StartCalibration(ADC2);
- while(ADC_GetCalibrationStatus(ADC2));
- } </font>
复制代码针对ADC1:- int main(void)
- {
- SystemInit(); //系统时钟初始化:72M
- Gpio_Init();
- Adc_Init();
- while(1)
- {
- ADC_SoftwareStartConvCmd(ADC1, ENABLE );
- }
复制代码针对ADC2:
- <font color="#0000ff">int main(void)
- {
- SystemInit(); //系统时钟初始化
- Gpio_Init();
- Adc_Init();
- while(1)
- {
- ADC_SoftwareStartConvCmd(ADC2, ENABLE );
- }</font>
复制代码很谢谢您的热心帮忙,其实我的程序就是您这样的。
奇了怪了
一周热门 更多>