📄 mega32_adc.c
字号:
//======================================
//Mega32的AD模块源程序
//FileName =mega32_adc.c
//Date Time=20071214...20071215
//======================================
#include "mega32_adc.h"
#include "delay.h"
volatile struct _st_adc_op st_adc_op; //ADC转换的操作函数
//--------------------------------------
//AD转换的初始化
//此时总的中断位没有打开
//--------------------------------------
void init_adc_sets(void)
{
DDRA &= ~(BIT(CONST_ADC_CHANNEL_0) |
BIT(CONST_ADC_CHANNEL_1) ); //输入
PORTA |= (BIT(CONST_ADC_CHANNEL_0) |
BIT(CONST_ADC_CHANNEL_1) ); //高阻,外部PUD=1
//ADC使用查询方式进行工作,禁止中断,单次转换方式
ADCSRA =BIT(ADEN) |BIT(ADIF) | CONST_ADC_FEN_PIN_SETS; //关闭中断,设置分频系数
ADMUX =CONST_ADMUX_REF_SELECT |CONST_ADC_CHANNEL_0; //参考电压为内部VCC
//先进行一次虚转换
ADCSRA |= BIT(ADSC);
while( (ADCSRA &BIT(ADIF)) ==0);
ADCSRA |= BIT(ADIF);
//最后没有自动触发和中断使能的设置!
}
//--------------------------------------
//进行1次指定模拟输入通道的转换[MUX1...0]
//外部调用:
// 这里的转换是外部Timer0没有启动
//的时候,使用查询方式的转换!
// 已经ADATE=0,ADIE=I=0
//输入: 通道号 =0...1
//输出: AD转换值
//--------------------------------------
uint do_adc_one_channel_change(uchar channel)
{
uint tmp;
uchar sreg_bak;
//选择通道
ADMUX &= ~0x1f;
ADMUX |= (channel &0x01);
delay_20us(); //保证电压稳定
ADCSRA |= ( BIT(ADEN) |BIT(ADIF) |BIT(ADSC) );
while( (ADCSRA &BIT(ADSC)) !=0 ); //ADSC由硬件自动清0!
sreg_bak =SREG;
_CLI();
tmp =ADCL;
tmp =(tmp <<8) |ADCH;
SREG =sreg_bak;
return(tmp);
}
//End Of File
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -