⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ad.c

📁 AVR系列单片机的ADC驱动程序库
💻 C
字号:

/*******************************************************************
*                            ADC                                   *
*                                                                  *
*                  by J.Schwedes 2009                              *
********************************************************************/


#include <general.h>
#include <os.h>
#include <ad.h>
#ifdef AD_USE_AUTOSCAN
extern const u8 __AD_ROM ad_autoscan_channel[][2];
extern const u8 __AD_ROM ad_autoscan_size;

u8 ad_buffer_idx;
u8 ad_channel_idx;
u8 ad_sample_loop;
#if AD_RESOLUTION == AD_8BIT
u8 AD_Buffer[AD_BUFF_SIZE];
#else
#if AD_RESOLUTION == AD_10BIT
u16 AD_Buffer[AD_BUFF_SIZE];
#endif
#endif
/*
void AD_AutoScan(void)
*/
/* AD_AutoScan: call this function from a fixed timebase. At each timebase trigger
   one channel will be sampled. */
void AD_AutoScan(void)
{
  u8 temp = 0 ;
  while(!(ADCSRA & (1<<ADIF)))
  {
    /* wait for pending conversion is ready */
  }
  ADCSRA |= 1<<ADIF ; /* clear interrupt request flag */
#if AD_RESOLUTION == AD_8BIT
  AD_Buffer[ad_buffer_idx] =
   ADC_RESULT_8BIT;
#else
#if AD_RESOLUTION == AD_10BIT
  OS_SuspendInt();
  AD_Buffer[ad_buffer_idx] = ADC_RESULT_10BIT;
  OS_ResumeInt();
#endif
#endif
  if(++ad_sample_loop >= ad_autoscan_size)
  {
    ad_sample_loop = 0;
  }
  ad_channel_idx = ad_autoscan_channel[ad_sample_loop][0];
  ad_buffer_idx  = ad_autoscan_channel[ad_sample_loop][1];

  temp=(AD_VOLTAGE_REF<<6) | (AD_RESOLUTION<<5) + ad_channel_idx;
  ADMUX = temp; /* set AD reference, alignment and channel */

  ADCSRA |=1<<ADSC; /* start next conversion */
}
#endif
/*
void AD_Init(void)
*/
void AD_Init(void)
{
#ifdef AD_USE_AUTOSCAN
  u8 temp = 0;

  ad_channel_idx = ad_autoscan_channel[0][0];
  ad_buffer_idx  = ad_autoscan_channel[0][1];

  temp=(AD_VOLTAGE_REF<<6) | (AD_RESOLUTION<<5) + ad_channel_idx;
  ADMUX = temp; /* set AD reference, alignment and channel */

  ADCSRA = ((1<<ADEN) | (1<<ADSC) | AD_CLOCK_PRESCALER); /* enable AD converter,set
                                                 prescaler and  start first conversion */
  do{
    AD_AutoScan();
  }
  while(ad_sample_loop != 0);
#endif
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -