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