博客首页 | 排行榜 |

不死鸟的BLOG

养成良好的习惯比什么都重要!差距是由长时间的习惯拉开的…………

个人档案
博文分类
ADC(3)  2009-02-15 12:12

/myspace/album/image.php?uid=105196&aid=807&pic=a77951a7&ext=png&screen=show

 

如果被ADC转换的模拟电压低于低阀值或高于高阀值,AWD模拟看门狗状态位被设置。这些阀值位于在ADC_HTR和ADC_LTR寄存器的最低12个有效位中。通过设置ADC_CR1寄存器的AWDIE位以允许产生相应中断。

阀值独立于由ADC_CR2寄存器上的ALIGN位选择的数据对齐模式。比较是在对齐之前完成的(见10.5节)。

通过配置ADC_CR1寄存器,模拟看门狗可以作用于1个或多个通道。

 

/myspace/album/image.php?uid=105196&aid=807&pic=42942b98&ext=png&screen=show
/myspace/album/image.php?uid=105196&aid=807&pic=6ecc85a2&ext=png&screen=show
/myspace/album/image.php?uid=105196&aid=807&pic=38f41ade&ext=png&screen=show

 

 

ADC有一个内置自校准模式。校准可大幅减小因内部电容器组的变化而造成的准精度误差。在校准期间,每个电容器上都会计算出一个误差修正码(数字值),这个码用于消除在随后的转换中每个电容器上产生的误差。

 

 

 

本例展示了如何使用ADC模拟看门狗来持续监视一个ADC通道。

设置ADC持续对通道10的模拟输入进行转换。设置模拟看门狗监视一个单独的规则通道。

一旦通道10上的输入超过模拟看门狗上限(0x0B00)或者低于下限(0x0300),就产生一个AWD中断,翻转PC.06的状态,点亮与之相连的LED。通道上的输入不回复到正常范围,这个LED就不会熄灭。

 

 

/* Includes ------------------------------------------------------------------*/

#include "stm32f10x_lib.h"

 

/* Private typedef -----------------------------------------------------------*/

/* Private define ------------------------------------------------------------*/

/* Private macro -------------------------------------------------------------*/

/* Private variables ---------------------------------------------------------*/

ADC_InitTypeDef  ADC_InitStructure;

ErrorStatus HSEStartUpStatus;

   

/* Private function prototypes -----------------------------------------------*/

void RCC_Configuration(void);

void GPIO_Configuration(void);

void NVIC_Configuration(void);

 

/* Private functions ---------------------------------------------------------*/

 

/*******************************************************************************

* Function Name  : main

* Description    : Main program

* Input          : None

* Output         : None

* Return         : None

*******************************************************************************/

int main(void)

{

#ifdef DEBUG

  debug();

#endif

 

  /* System clocks configuration ---------------------------------------------*/

  RCC_Configuration();

 

  /* NVIC configuration ------------------------------------------------------*/

  NVIC_Configuration();

 

  /* GPIO configuration ------------------------------------------------------*/

  GPIO_Configuration();

 

  /* ADC1 Configuration ------------------------------------------------------*/

  ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;

  ADC_InitStructure.ADC_ScanConvMode = DISABLE;

  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;

  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;

  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;

  ADC_InitStructure.ADC_NbrOfChannel = 1;

  ADC_Init(ADC1, &ADC_InitStructure);

 

  /* ADC1 regular channel10 configuration */

  ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_13Cycles5);

 

  /* Configure high and low analog watchdog thresholds */

  ADC_AnalogWatchdogThresholdsConfig(ADC1, 0x0B00, 0x0300);

//设置看门狗的上下限

 

  /* Configure channel10 as the single analog watchdog guarded channel */

  ADC_AnalogWatchdogSingleChannelConfig(ADC1, ADC_Channel_10);

//对ADC通道10设置模拟看门狗

 

  /* Enable analog watchdog on one regular channel */

  ADC_AnalogWatchdogCmd(ADC1, ADC_AnalogWatchdog_SingleRegEnable);

使能channel10规则组通道上的模拟看门狗

 

  /* Enable AWD interupt */

  ADC_ITConfig(ADC1, ADC_IT_AWD, ENABLE);

//使能AWDOG中断屏蔽

 

  /* Enable ADC1 */

  ADC_Cmd(ADC1, ENABLE);

 

  /* Enable ADC1 reset calibaration register */   //校准

  ADC_ResetCalibration(ADC1);

  /* Check the end of ADC1 reset calibration register */

  while(ADC_GetResetCalibrationStatus(ADC1));

 

  /* Start ADC1 calibaration */

  ADC_StartCalibration(ADC1);

  /* Check the end of ADC1 calibration */

  while(ADC_GetCalibrationStatus(ADC1));

 

  /* Start ADC1 Software Conversion */

  ADC_SoftwareStartConvCmd(ADC1, ENABLE);

 

  while(1)

  {

  }

}

 

/*******************************************************************************

* Function Name  : RCC_Configuration

* Description    : Configures the different system clocks.

* Input          : None

* Output         : None

* Return         : None

*******************************************************************************/

void RCC_Configuration(void)

{

  /* RCC system reset(for debug purpose) */

  RCC_DeInit();

 

  /* Enable HSE */

  RCC_HSEConfig(RCC_HSE_ON);

 

  /* Wait till HSE is ready */

  HSEStartUpStatus = RCC_WaitForHSEStartUp();

 

  if(HSEStartUpStatus == SUCCESS)

  {

    /* HCLK = SYSCLK */

    RCC_HCLKConfig(RCC_SYSCLK_Div1);

 

    /* PCLK2 = HCLK */

    RCC_PCLK2Config(RCC_HCLK_Div1);

 

    /* PCLK1 = HCLK/2 */

    RCC_PCLK1Config(RCC_HCLK_Div2);

 

    /* ADCCLK = PCLK2/4 */

    RCC_ADCCLKConfig(RCC_PCLK2_Div4);

 

    /* Flash 2 wait state */

    FLASH_SetLatency(FLASH_Latency_2);

    /* Enable Prefetch Buffer */

    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

 

    /* PLLCLK = 8MHz * 7 = 56 MHz */

    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_7);

 

    /* Enable PLL */

    RCC_PLLCmd(ENABLE);

 

    /* Wait till PLL is ready */

    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)

    {

    }

 

    /* Select PLL as system clock source */

    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

 

    /* Wait till PLL is used as system clock source */

    while(RCC_GetSYSCLKSource() != 0x08)

    {

    }

  }

 

/* Enable peripheral clocks --------------------------------------------------*/

  /* Enable ADC1 and GPIOC clock */

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOC, ENABLE);

}

 

/*******************************************************************************

* Function Name  : GPIO_Configuration

* Description    : Configures the different GPIO ports.

* Input          : None

* Output         : None

* Return         : None

*******************************************************************************/

void GPIO_Configuration(void)

{

  GPIO_InitTypeDef GPIO_InitStructure;

 

  /* Configure PC.06 as output push-pull -------------------------------------*/

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

  GPIO_Init(GPIOC, &GPIO_InitStructure);

 

  /* Configure PC.00 (ADC Channel10) as analog input -------------------------*/

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;

  GPIO_Init(GPIOC, &GPIO_InitStructure);

}

 

/*******************************************************************************

* Function Name  : NVIC_Configuration

* Description    : Configures NVIC and Vector Table base location.

* Input          : None

* Output         : None

* Return         : None

*******************************************************************************/

void NVIC_Configuration(void)

{

  NVIC_InitTypeDef NVIC_InitStructure;

 

#ifdef  VECT_TAB_RAM 

  /* Set the Vector Table base location at 0x20000000 */

  NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);

#else  /* VECT_TAB_FLASH  */

  /* Set the Vector Table base location at 0x08000000 */

  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);  

#endif

 

  /* Configure and enable ADC interrupt */

  NVIC_InitStructure.NVIC_IRQChannel = ADC_IRQChannel;

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  NVIC_Init(&NVIC_InitStructure);

}

 

#ifdef  DEBUG

/*******************************************************************************

* Function Name  : assert_failed

* Description    : Reports the name of the source file and the source line number

*                  where the assert error has occurred.

* Input          : - file: pointer to the source file name

*                  - line: assert error line source number

* Output         : None

* Return         : None

*******************************************************************************/

void assert_failed(u8* file, u32 line)

{

  /* User can add his own implementation to report the file name and line number,

     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

 

  /* Infinite loop */

  while (1)

  {

  }

}

#endif

 

类别:实验 |
上一篇:ADC(4) | 下一篇:ADC(2) part(2)
以下网友评论只代表其个人观点,不代表本网站的观点或立场