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

📄 adc.c

📁 AVR下的ADC查询方式的程序 在产品中测试过的代码 注释很清楚 有些通道是差分信号 具体是那些通道是查分通道 需要看各个AVR芯片的数据手册
💻 C
字号:
/********************************************************************************************************
* 文 件 名 : adc.c
* 程 序 员 : (CaiJie) hnclcj@gmail.com
*                             (c) Copyright 2007-2007, CaiJie
*                                  All Rights Reserved
* 说    明 : avr 3.55MHz情况下的ADC
********************************************************************************************************/


#define  ADC_GLOBALS
#include "includes.h"

#if ADC_MODULE_EN > 0




/********************************************************************************************************
* 功  能 : 关闭ADC功能
* 入  口 : 无
* 返  回 : 无
* 说  明 : 1>关闭ADC 实现节电
********************************************************************************************************/

void   ADCClose  (void)
{
    ADCSRA =  0x00;                                // 关闭ADC 不中断 不连续模式 右对齐模式 2周期
}


/********************************************************************************************************
* 功  能 : 获得ADC数据
* 入  口 : 'ch' 0~2 其他的通道未使用作为数字I/O使用
* 返  回 : ADC结果
* 说  明 : 1> 7us ADC1次 2000MHz的时钟 4MHz系统时钟 (实际此函数执行时间<15us)
*          2> 0~2通道激活
*          4> 莫些ADC通道是差分的
*          3> REM通讯是采样ADC来获得REM_RXD数据 而此中断中不能提前开中断 所以单独处理0通道ADC
********************************************************************************************************/

INT16S ADCGetAdc (INT8U ch)
{
    INT16S result;                                // 结果


    if (ch != 0) {                                // 处理REM ADC 0通道中不能提前打开全局中断的特殊处理
        OS_ENTER_CRITICAL();                      // 在后台模式/中断中并用 必须禁止中断响应
        ADMUX &= 0xE0;                            // 屏蔽掉通道 REFS1 REFS2 ADLAR MUX4 MUX3 MUX2 MUX1 MUX0
        ADMUX |= ch;                              // 设置新的ADC通道
        SETBIT(ADCSRA, ADSC);                     // 开始1次ADC转换
        while(GETBIT(ADCSRA, ADSC));              // 等待ADC转换结束
        SETBIT(ADCSRA, ADIF);                     // 清除可能的ADC中断标志
        OS_EXIT_CRITICAL();                       // 退出临界
        result = ADCW & 0x3ff;                    // 右对齐10BIT ADC结果
    } else {
        //cli();                                  // 中断是自动关闭的 中断结束自动开全局中断
        ADMUX &= 0xE0;                            // 屏蔽掉通道 REFS1 REFS2 ADLAR MUX4 MUX3 MUX2 MUX1 MUX0
        ADMUX |= ch;                              // 设置新的ADC通道
        SETBIT(ADCSRA, ADSC);                     // 开始1次ADC转换
        while(GETBIT(ADCSRA, ADSC));              // 等待ADC转换结束
        SETBIT(ADCSRA, ADIF);                     // 清除可能的ADC中断标志
        result = ADCW & 0x3ff;                    // 右对齐10BIT ADC结果
    }

    return (result);                              // 读->返回ADC结果 (右对齐方式)
}


/********************************************************************************************************
* 功  能 : ADC初始化
* 入  口 : 无
* 返  回 : 无
* 说  明 : 1> ADC Clock: 4000000Hz
*             ADC Voltage Reference: AREF
*             ADC Noise Canceler Disabled
*             ADC High Speed Mode
********************************************************************************************************/

void ADCInit (void)
{
    SFIOR &= ~B0001_1111;                          // PUD禁止
    SFIOR |=  B0000_0000;                          // 中断触发源禁止(高3BIT与ADC有关)
    ADMUX  =  0x00;                                // ADC参考源选择 AREF
    ADCSRA =  0x80;                                // 只启动ADC 不中断 不连续模式 右对齐模式 2周期
}


/********************************************************************************************************
* 功  能 : ADC使能
* 入  口 : 无
* 返  回 : 无
* 说  明 : 1> 只打开ADC部分
********************************************************************************************************/

void   ADCOpen   (void)
{
    ADCSRA =  0x80;                                // 只启动ADC 不中断 不连续模式 右对齐模式 2周期
}



#endif
/********************************************************************************************************
*                                             End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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