STM32中AD转换的校准问题

来源:互联网 发布:淘宝开店要求品牌注册 编辑:程序博客网 时间:2024/05/19 13:22

        今天学习STM32的AD转换,在数据手册中看到这样一句话“启动校准前,ADC必须处于关电状态(ADON=’0’)超过至少两个ADC时钟周期。”,英文原句是这样的“Before starting a calibration, the ADC must have been in power-off state(ADON bit = '0') for at least two ADC clock cycles.”。然而,STM32固件库中给出的例程代码如下所示。

  /* Enable ADC1 */  ADC_Cmd(ADC1, ENABLE);  /* Enable ADC1 reset calibration register */     ADC_ResetCalibration(ADC1);  /* Check the end of ADC1 reset calibration register */  while(ADC_GetResetCalibrationStatus(ADC1));  /* Start ADC1 calibration */  ADC_StartCalibration(ADC1);  /* Check the end of ADC1 calibration */  while(ADC_GetCalibrationStatus(ADC1));       /* Start ADC1 Software Conversion */   ADC_SoftwareStartConvCmd(ADC1, ENABLE);
        程序中使用ADC_Cmd(ADC1, ENABLE);使能了ADC1,即将ADON位设置为了1,然后复位并启动了校准,这样看来是与手册上相违背的,于是我把上面代码的第一条语句放到了最后一条语句之前,结果运行后程序停在了while(ADC_GetResetCalibrationStatus(ADC1));这条语句不往下执行。折腾了半天,发现我看的数据手册上是错的,官网在2017年9月发布的版本上是这样写的“Before starting a calibration, the ADC must have been in power-on state(ADON='1') for at least two ADC clock cycles.”,即在启动校准之前,ADON必须置位至少两个ADC时钟周期,所以说例程中的写法是正确的。

        上面的问题解决了,那么程序是怎么实现ADON='1'两个ADC时钟周期后启动校准的?通过仿真发现,程序从执行完ADC_Cmd(ADC1, ENABLE);到即将执行ADC_StartCalibra tion(ADC1);中间的时间为5us(芯片为stm32f103,系统时钟为72MHz),若设置ADC时钟为9MHz时,两个ADC时钟周期为2/9us,所以说到启动校准的时候,时间已经远远过了两个ADC时钟周期,所以这个问题的解答也算是隐藏在了程序本身之中了。

原创粉丝点击