本人在学习原子战舰stm32开发板实验--内部温度传感器实验时,有以下疑惑,还望各位可以给予帮助,谢谢。
(1)ADC初始化部分代码
[mw_shl_code=c,true]//初始化ADC
//这里我们仅以规则通道为例
//我们默认将开启通道0~3
void T_Adc_Init(void) //ADC通道初始化
{
//变量定义
ADC_InitTypeDef ADC_InitStructure; //用于ADC初始化
//使能GPIOA时钟和ADC1时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1,ENABLE ); //使能GPIOA,ADC1通道时钟
//复位ADC1 同时设置ADC1分频因子 设置分频因子为6 72MHz/6=12MHZ
ADC_DeInit(ADC1); //复位
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //ADC最大时间不能超过14MHZ,否则会转换不准确
//初始化ADC1参数 设置ADC1的工作模式以及规则序列的相关信息
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC1(和ADC2)工作在独立模式
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通道1 顺序进行规则转换的ADC通道数目是通道1
ADC_Init(ADC1,&ADC_InitStructure); //根据ADC_InitStrcuture中指定的参数初始化外设ADCx的寄存器
//开启内部温度传感器
ADC_TempSensorVrefintCmd(ENABLE);
//使能ADC 并校准
ADC_Cmd(ADC1,ENABLE); //使能
ADC_ResetCalibration(ADC1); //复位校准
while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准结束
ADC_StartCalibration(ADC1); // ADC转换校准
while(ADC_GetCalibrationStatus(ADC1)); //等待AD校准结束
}[/mw_shl_code]
(2)疑惑
a. 内部温度传感器连接的是ADCx_IN16,即和通道16相连,那么在ADC初始化函数中
[mw_shl_code=c,true]ADC_InitStructure.ADC_NbrOfChannel = 1; //选择通道 ADC通道1 顺序进行规则转换的ADC通道数目是通道1[/mw_shl_code]
这句话就应该配置为16,而不是1啊。原例程是不是错了?
b. 内部温度传感器并没有占用GPIOA啊,为什么依旧要开启GPIOA的时钟?
[mw_shl_code=c,true]//使能GPIOA时钟和ADC1时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1,ENABLE ); //使能GPIOA,ADC1通道时钟[/mw_shl_code]
c. 查阅一些别的资料,有的说要选中ADC1的通道16作为输入,设置采样时间17.1us ( Ncycle × tADC = 17.1靤 )。而原例程中没有这句话,是否是漏掉了?
[mw_shl_code=c,true]// ADC1 regular channel16 Temp Sensor configuration
ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 1, ADC_SampleTime_55Cycles5);[/mw_shl_code]
感谢各位给予解答,谢谢!
|