📄 ad.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 + -